【发布时间】:2021-07-24 13:08:18
【问题描述】:
在 Unity3D 中,我有两个枚举:
public enum GlobalColor
{
Player,
PlayerFX1,
PlayerFX2,
Ennemy,
EnnemyFX1,
EnnemyFX2,
Background,
BackgroundParticles1,
BackgroundParticles2,
Button,
InactiveButton
}
public enum ColorName
{
Player,
PlayerFX1,
PlayerFX2,
Ennemy_1,
EnnemyFX1_1,
EnnemyFX2_1,
Ennemy_2,
EnnemyFX1_2,
EnnemyFX2_2,
Ennemy_3,
EnnemyFX1_3,
EnnemyFX2_3,
Background,
BackgroundParticles1,
BackgroundParticles2,
Button,
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 colorin ColoriseBase 不等于我在检查器中给出的值。如果在检查器中我将其初始化为 Player(which index == 0),则此变量的索引为 12,GlobalColor 的任何成员都没有此索引,这会导致异常。
【问题讨论】:
-
需要说明如何调用
GlobalColorToColorName。根据错误,您没有将参数GlobalColor color传递给方法 -
@rustyBucketBay 不,需要是别的东西。
GlobalColor是enum(值类型),因此永远不能是null。
标签: c# unity3d serialization enums