在 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
的任何成员都没有这个索引,这会导致异常。