gpt4 book ai didi

c# - Unity - 使用枚举属性来检测对象碰撞

转载 作者:行者123 更新时间:2023-12-03 03:35:00 25 4
gpt4 key购买 nike

昨晚我正在开发一个 C-Sharp 项目,试图围绕游戏对象相互碰撞进行编码。我想要不同的门类型(例如木头、石头、金属),可以用不同的武器(例如棍棒、剑、斧头)分解。

为了检测 GateManager 上的冲突,我为每个门使用了标签。例如:

    void OnTriggerEnter(Collider collider) {
switch (gameObject.tag) {
case "WoodenGate":
...
case "StoneGate":
...

上面的代码并不准确,但应该给出一个想法。将每种门类型设置为不同的标签感觉是错误的(如果每种门类型都有不同的标签并且每种 Material 类型都有不同的标签等,那么我最终会得到数百个标签)。

所以我想出了一个替代方案。我设置了 GateType 的枚举并创建了 3 个值(WoodenGate、StoneGate、MetalGate)。然后,我将公共(public) GateType 属性附加到 GateManager 类。这使我能够在统一的“检查器”窗口中选择与每个预制件相关的枚举。非常整洁,我真的很高兴。

然后出现了一个问题:我在列表的中间添加了第四个枚举(例如 GlassGate)。因为枚举只是 int 值,所以第三个项目不再是 MetalGate,而是现在的 StoneGate。这意味着金属门预制件突然有了石门的 GateType。这破坏了我的游戏。

抱歉,对于这个冗长的问题,但我的问题是我应该如何最好地标记和识别许多不同类型的项目?我不想使用标签(因为我需要太多),也不想使用枚举(因为它们与统一检查器结合使用时会产生脆弱的问题。

我认为这一定是许多游戏的常见要求(例如,在游戏中,您可以在许多不同的游戏对象上使用镐来收集不同的资源),所以只是想知道最佳实践?

最佳答案

1。您可以声明并使用许多接口(interface)来完成此操作,但缺点是您需要声明其中许多接口(interface)并在附加到每个对象的许多脚本中实现它们:

public interface IDestroyable { }

public interface IOpenable { }

然后你在脚本中继承它:

public class MyScript : MonoBehaviour, IDestroyable{}

public class MyOtherScript : MonoBehaviour, IOpenable{}

检查碰撞时是哪一个:

void OnTriggerEnter(Collider collider)
{
if (collider.GetComponent<IOpenable>() != null)
{

}

else if (collider.GetComponent<IDestroyable>() != null)
{

}
}

2。您还可以使用您提到的枚举。

public enum GateType
{
WoodenGate,
StoneGate,
MetalGate
}

将描述该对象是什么类型的门的单个脚本附加到所有门对象预制件,然后从编辑器或脚本中为每个门选择枚举

public class GateDescription : MonoBehaviour
{
public GateType gateType;
}

检查碰撞时是哪一个:

void OnTriggerEnter(Collider collider)
{
GateDescription gateType = collider.GetComponent<GateDescription>();

if (gateType != null)
{
switch (gateType.gateType)
{
case GateType.StoneGate:
break;

case GateType.WoodenGate:
break;

case GateType.MetalGate:
break;
}
}
}

关于c# - Unity - 使用枚举属性来检测对象碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47354777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com