【问题标题】:Differentiate Gameobject colliders with the same tag区分具有相同标签的游戏​​对象碰撞器
【发布时间】:2023-03-11 20:19:02
【问题描述】:

在我的 OnTriggerEnter2D() 中,我有一个 if 条件来检查正确的对撞机是否与我的其他游戏对象发生碰撞。举个简单的例子:有一只狮子和一只大象,标签为“动物”,它们使用相同的脚本来管理它们的变量。根据两个动物中的哪一个进入另一个碰撞器,我想执行特定的代码。 我试图给这两种动物一个字符串,告诉它们是哪种类型,就像狮子是狮子一样。但这没有用。

public void OnTriggerEnter2D(Collider2D a_collider2D)
{

    if (a_collider2D.gameObject.CompareTag("Animal") && m_sAnimalStat.m_sAnimalType.Equals("Lion")) 
    {//code here if its a Lion}

还有其他方法可以区分对撞机吗?将它们放在不同的图层上也没有效果。 OnTriggerEnter2D 位于动物正走向的另一个游戏对象上。 AnimaStatManager 位于具有标签“动物”的 Lion Prefab 上。如前所述,它管理我所有动物的各种变量。像 m_sAnimalType。 m_aAnimalStat=GameObject.FindGameObjectWithTag("Animal").GetComponent(); --> 以便我可以从该脚本中访问我需要的内容。

【问题讨论】:

  • Animal 对象上的 OnTriggerEnter2D 方法吗?还是“门户”对象?
  • 方法在“门户”对象上。
  • “m_sAnimalType”从何而来?我的意思是,它在哪里声明?您引用它的方式让我认为它来自“门户”对象,这没有任何意义。
  • 哦该死的我的错,我忘了输入 VariableManager 类作为它的来源。我将编辑问题
  • 有不同的方式来做你想做的事。根据您的逻辑,一种快速方法是使用“a_collider2D”参数通过 GetComponent() 访问 Animal 对象。 var currentAnimal = a_collider2D.GetComponent<Animal>(); 并检查动物类型是否是您需要检查的,例如大象、猫等。

标签: unity3d gameobject


【解决方案1】:

Unity 对象由 composition 定义。这意味着一个对象是由它的组件定义的。 因此,在我看来,更好的方法可能是在 Lion 对象上使用“Lion”组件,除非您有特定的理由不这样做。

您使用 class Animal : MonoBehaviour 并为每个物种创建一个子类:class Lion : Animalclass Elephant : Animal 等。

然后,您可以简单地这样做:

public void OnTriggerEnter2D(Collider2D a_collider2D)
{
    if (a_collider2D.GetComponent<Lion>() != null) {
        // Lion
    }
    else if (a_collider2D.GetComponent<Elephant>() != null) {
        // Elephant
    }
    else if (a_collider2D.GetComponent<...>() != null) {
        // ...
    }
}

【讨论】:

  • 我选择不为每个动物设置一个类的原因是因为我的另一个游戏对象正在追逐每个带有“动物”标签的游戏​​对象,而且用 Astar 管理这么多不同标签的对象似乎几乎是不可能的寻路项目。虽然感谢您的回答,但会尝试一下!
  • 我不知道 Astar 项目,但是您仍然可以将它们全部标记为“动物”,并将代码中的引用存储为 Animal 对象,利用多态性。如果您想进一步描述这种方法的问题,我很好奇。
  • 原则上是个好主意,但我会省略多态性和多个代码文件。只需在 Animal 类中保留一个字符串或枚举即可跟踪其类型。
  • 为迟到的答案道歉!通过一些更改,Aboud 的回答帮助我解决了这个问题!我还遇到了来自子元素的碰撞器干扰检测父元素的问题。但是所有的 cmets 也有帮助,并且非常适合使用不同的方法来解决这样的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 2016-09-11
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多