一开始就调用OnTriggerEnter()

时间:2019-05-19 12:37:51

标签: c# unity3d

我正在制作某种Evolution模拟器游戏。我有一个脚本,该脚本应该在生物的CapsuleCollider触发OnTriggerEnter()时销毁与之相连的GameObject。

我有一个问题,即使生物对撞机甚至不靠近食物,它仍然会破坏GameObject。

我的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FoodEat : MonoBehaviour
{
    public GameObject FoodGO;
    public Rigidbody FoodRB;

    private void OnTriggerEnter(Collider Creature)
    {
        Destroy(FoodGO);
    }

    void Start()
    {
        FoodRB = GetComponent<Rigidbody>();
        FoodGO = FoodRB.gameObject;
    }

    void Update()
    {
        Rigidbody[] allRigidBodies = (Rigidbody[])FindObjectsOfType(typeof(Rigidbody));

        foreach (Rigidbody body in allRigidBodies)
        {
            if (body.gameObject.layer == 10)
            {
                 OnTriggerEnter(body.gameObject.GetComponent<CapsuleCollider>());
            }

        }

    }
}

1 个答案:

答案 0 :(得分:3)

OnTriggerEnter是一种单行为生命周期方法。您不应从自己的代码中调用它;当它检测到碰撞时,它将被自动调用。

此外,您的代码中的逻辑现在似乎不正确,这是...

  

“每个框架,遍历场景中的所有刚体,如果在第10层上找到1,则销毁FoodGO”

只需删除整个Update方法,然后在Collision方法中放置一个if,它便会起作用:

[RequireComponent(typeof(Rigidbody), typeof(Collider))]
public class FoodEat : MonoBehaviour
{
    private void OnTriggerEnter(collider other)
    {
        Debug.Log(other.gameObject.name + " on layer " + other.gameObject.layer);

        if (other.gameObject.layer == 10)
            Destroy(this.gameObject);
    }

}

对代码进行一些值得注意的编辑:

  1. 我删除了FoodGO,因为它是该脚本所附加的GameObject,所以您只需编写gameObjectthis.gameObject就可以访问它。
  2. 由于不再使用Rigidbody引用,因此删除了它,因此删除了整个Start()方法。
  3. 由于此代码需要Rigidbody和Collider才能工作,因此我在顶部添加了[RequireComponent]属性,这将使Unity告诉您是否忘记了将这些脚本附加到对象上。 li>
  4. 我添加了一个Debug.Log,它在与食物碰撞的生物上打印名称和图层,以便您可以调试并确保其按预期工作