昨晚我在做一个 C-Sharp 项目,试图围绕 GameObjects 相互碰撞进行编码。我想要不同的门类型(例如木头、石头、金属),它们可以被不同的武器(例如棍棒、剑、斧头)分解。
为了检测 GateManager 上的碰撞,我为每个门使用了标签。例如:
void OnTriggerEnter(Collider collider) {
switch (gameObject.tag) {
case "WoodenGate":
...
case "StoneGate":
...
上面的代码并不准确,但应该给出一个想法。将每种门类型设置为不同的标签感觉是错误的(如果每种门类型都有不同的标签,每种材料类型都有不同的标签,等等,那么我最终会得到数百个标签)。
所以我想出了一个替代方案。我设置了 GateType 的枚举并创建了 3 个值(WoodenGate、StoneGate、MetalGate)。然后,我将公共 GateType 属性附加到 GateManager 类。这使我可以在统一的“检查器”窗口中选择与每个预制件相关的枚举。它非常整洁,我真的很高兴。
然后出现了一个问题:我在列表的中间添加了第四个枚举(例如 GlassGate)。因为枚举只是 int 值,所以第三项不再是 MetalGate,而是现在的 StoneGate。这意味着金属门预制件突然有了一个 GateType 石门。这打破了我的游戏。
抱歉,对于这个冗长的问题,但我的问题是我应该如何最好地标记和识别许多不同类型的项目?我不想使用标签(因为我需要太多标签)并且我不想使用枚举(因为它们在与统一检查员结合使用时会形成脆弱的问题。
我认为这一定是许多游戏的共同要求(例如,在游戏中,您可以在许多不同的游戏对象上使用镐来收集不同的资源)所以只是想知道最佳实践吗?