序列化枚举字段时错误的枚举索引 (Unity)

在 Unity3D 中,我有两个枚举:

public enum GlobalColor
{
    Player,PlayerFX1,PlayerFX2,Ennemy,EnnemyFX1,EnnemyFX2,Background,BackgroundParticles1,BackgroundParticles2,Button,InactiveButton
}
public enum ColorName
{
    Player,Ennemy_1,EnnemyFX1_1,EnnemyFX2_1,Ennemy_2,EnnemyFX1_2,EnnemyFX2_2,Ennemy_3,EnnemyFX1_3,EnnemyFX2_3,InactiveButton
}

ColorName 用于创建调色板(每个 Enum 元素对应于我游戏中的特定颜色),GlobalColor 用于将颜色附加到 GameObjects,Ennemy 只出现一次,因为敌人的颜色是从 ColorName 的三个中随机选择的。 在通用 ColoriseBase 脚本(它是所有 Colorise 脚本的基础,负责根据当前调色板的颜色为不同的组件着色,存在 ColoriseSprite、ColoriseParticleSystem 和 ColoriseCamera,它们都继承自 ColoriseBase)我有以下代码: [SerializeField] private GlobalColor color; 能够直接在检查器中选择我的组件的颜色。 将此 GlobalColor 转换为 ColorName(以在当前调色板中找到正确的颜色),我正在使用反射:

protected ColorName GlobalColorToColorName(GlobalColor color)
{
    string randomEnnemy = "";
    if (color == Ennemy || color == EnnemyFX1 || color == EnnemyFX2)
    {
        EnnemyIdentity ennemyIdentity = getcomponentInParent<EnnemyIdentity>();
        if (ennemyIdentity != null)
            randomEnnemy = string.Format("_%s",ennemyIdentity.EnnemyType.ToString());
        else
            throw new MissingComponentException("An ennemy needs to have an EnnemyIdentity script attached to it.");
    }
    print(Enum.GetName(typeof(GlobalColor),color));
    string name = Enum.GetName(typeof(GlobalColor),color);
    var type = typeof(ColorName);
    return (ColorName)type.GetProperty(name + randomEnnemy).Getvalue(null);
}

print 方法用于调试目的。但是,当我启动游戏时抛出异常:

NullReferenceException: Object reference not set to an instance of an object
ColoriseBase`1[E].GlobalColorToColorName (GlobalColor color) (at Assets/Scripts/Color/ColoriseBase.cs:56)
ColoriseBase`1[E].get_Color () (at Assets/Scripts/Color/ColoriseBase.cs:10)

我试图找出错误,但发现 GlobalColor color 中的变量 ColoriseBase 与我在检查器中给出的值不相等。如果在检查器中我将它初始化为 Player(which index == 0) 这个变量的索引为 12,那么 GlobalColor 的任何成员都没有这个索引,这会导致异常。

jasonzhyh 回答:序列化枚举字段时错误的枚举索引 (Unity)

不是 100% 但可以肯定错误来自

type.GetProperty

因为您的类型是 enum 它没有属性,它只有值。很可能这会返回 null,因此稍后 GetValue 会导致异常。

您可能更愿意使用的是 Enum.Parse<TEnum>(string),例如(假设其余部分按预期工作)

return Enum.Parse<ColorName>(name + randomEnnemy);

对于未来的问题和疑问:请指出异常是从哪一行抛出的。

一般来说,出于调试目的,请避免像之前那样进行更长的链式访问

return (ColorName)type.GetProperty(name + randomEnnemy).GetValue(null);

通过将所有内容放在一条线上,您将一无所获,好吧,除非有人说调试它会更糟。你也可以这样写

var fullName = name + randomEnnemy;
var property = type.GetProperty(fullName);
return (ColorName) property.GetValue(null);

但是这样您可以更好地调试Debugging your code with breakpoints

,

谢谢 derHugo 我找到了一个解决方案,这是我的新GlobalColorToColorName方法:


protected ColorName GlobalColorToColorName(GlobalColor color)
{
    string name = color.ToString();
    if (color == Ennemy || color == EnnemyFX1 || color == EnnemyFX2)
    {
        string randomEnnemy;
        EnnemyIdentity ennemyIdentity = GetComponentInParent<EnnemyIdentity>();
        if (ennemyIdentity != null)
            randomEnnemy = string.Format("_%s",ennemyIdentity.EnnemyType.ToString());
        else
            throw new MissingComponentException("An ennemy needs to have an EnnemyIdentity script attached to it.");
        name += randomEnnemy;
    }
    return (ColorName)Enum.Parse(typeof(ColorName),name);
}
本文链接:https://www.f2er.com/43432.html

大家都在问