【Unity】列挙型の属性機能を使って列挙型の値を文字列にマッピングする

         ゲーム開発中に列挙値を使用することがよくありますが、列挙中に特定の文字列の説明を取得したい場合は、次の方法で実現できます。

1. マップマッピングによる実装

public enum CharacterStatusType
{
    None,
    Silence,
    Stun,
    Weakness,
    Knockdown
}


public static Dictionary<CharacterStatusType, string> statusTypeToString = new Dictionary<CharacterStatusType, string>()
{
    { CharacterStatusType.None, "无异常状态" },
    { CharacterStatusType.Silence, "沉默状态" },
    { CharacterStatusType.Stun, "眩晕" },
    { CharacterStatusType.Weakness, "虚弱" },
    { CharacterStatusType.Knockdown, "击倒" }
};

ただし、この方法では各列挙値を 2 回記述する必要があり、十分エレガントではないため、別の方法で実装する予定です。

2. 属性特性を使用した実装。

using System;
using System.ComponentModel;

/// <summary>
/// 枚举特性(Attribute)
/// 
/// 示例:
/// 1.定义:
///public enum MovementDirection
///{
///    [Description("向前方移动")]
///    Forward,
///    [Description("向后方移动")]
///    Backward
///}
///public enum CharacterStatusType
///{
///    [Description("无异常状态")]
///    None,
///    [Description("沉默状态")]
///    Silence,
///    [Description("眩晕")]
///    Stun,
///    [Description("虚弱")]
///    Weakness,
///    [Description("击倒")]
///    Knockdown
///}
/// 2.使用:
/// CharacterStatusType status = CharacterStatusType.Silence;
/// string statusString = status.GetDescription();
/// MovementDirection direction = MovementDirection.Forward;
/// string directionString = direction.GetDescription();
/// 
/// </summary>
public static class EnumExtensions
{
    public static string GetDescription<TEnum>(this TEnum enumValue) where TEnum : Enum
    {
        var type = typeof(TEnum);
        var field = type.GetField(enumValue.ToString());
        if (field != null)
        {
            var attributes = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (attributes.Length > 0)
            {
                return ((DescriptionAttribute)attributes[0]).Description;
            }
        }

        return enumValue.ToString();
    }
}

これにより、使用がより便利になり、列挙に関連付けたい情報を追加するだけでよく、呼び出しも非常に便利です。

おすすめ

転載: blog.csdn.net/qq_42608732/article/details/131688921