【发布时间】:2018-05-01 11:22:51
【问题描述】:
昨晚我在做一个 C-Sharp 项目,试图围绕相互碰撞的游戏对象编写代码。我想要不同的门类型(例如木头、石头、金属),它们可以被不同的武器(例如棍棒、剑、斧头)分解。
为了检测 GateManager 上的碰撞,我为每个门使用了标签。比如:
void OnTriggerEnter(Collider collider) {
switch (gameObject.tag) {
case "WoodenGate":
...
case "StoneGate":
...
上面的代码并不准确,但应该给出一个想法。将每种浇口类型设置为不同的标签感觉是错误的(如果每种浇口类型都有不同的标签,每种材料类型都有不同的标签等,那么我最终会得到数百个标签)。
所以我想出了一个替代方案。我设置了 GateType 的枚举并创建了 3 个值(WoodenGate、StoneGate、MetalGate)。然后,我将公共 GateType 属性附加到 GateManager 类。这使我可以在统一的“检查器”窗口中选择与每个预制件相关的枚举。它非常整洁,我真的很高兴。
然后出现了一个问题:我在列表的中间添加了第四个枚举(例如 GlassGate)。因为枚举只是 int 值,所以第三项不再是 MetalGate,而是现在的 StoneGate。这意味着金属门预制件突然有了一个 GateType 石门。这打破了我的游戏。
抱歉,对于这个冗长的问题,但我的问题是我应该如何最好地标记和识别许多不同类型的项目?我不想使用标签(因为我需要太多标签)并且我不想使用枚举(因为它们在与统一检查器结合使用时会形成脆弱的问题。
我认为这一定是许多游戏的共同要求(例如,在游戏中,您可以在许多不同的游戏对象上使用镐来收集不同的资源)所以只是想知道最佳实践吗?
【问题讨论】:
-
您尝试对每种门类型进行什么样的交互?与其在 GateManager 脚本中包含所有逻辑,不如编写一组 MonoBehaviour 类,每个类都指示一个反应,根据需要将它们附加到每个门,并在与门碰撞时盲目调用它们? (只需让它们都继承自同一个类/实现相同的接口即可轻松检索和调用它们。)
-
逻辑很简单,如果与门碰撞的武器级别足够高,则将门设置为不活动(即摧毁它)。所以例如一把剑可以摧毁木门,但不能摧毁金属门。如此非常简单的逻辑确实如此拥有多个类可能会过大?
-
在这种情况下,为什么不给每个物体(或组成它的材料)分配一个强度值,并为每个武器分配一个相应的强度?然后比较碰撞时的两个值。如果你必须为每一种门、每一种路障/家具物品/块/等等都做一个枚举,这将是很多枚举值,随着项目的增长,这些值将变得越来越难以维护。
-
Serlite - 谢谢。不敢相信我错过了它作为一种编码方式。很棒的东西
标签: c# unity3d enums collision collider