【问题标题】:OnTriggerEnter() is called right on the startOnTriggerEnter() 在开始时被调用
【发布时间】:2019-05-19 20:56:16
【问题描述】:

我正在制作某种进化模拟器游戏。我有一个脚本,当一个生物的 CapsuleCollider 触发 OnTriggerEnter() 时,它应该销毁它所连接的 GameObject。

我有一个问题,即使 Creature 的对撞机甚至没有靠近食物,它仍然会破坏 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>());
            }

        }

    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    OnTriggerEnter 是一种单一行为的生命周期方法。你不应该从你自己的代码中调用它;它会在检测到碰撞时自动调用。

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

    “每一帧,循环遍历场景中的所有刚体,如果在第 10 层找到 1,则销毁 FoodGO”

    只需删除整个 Update 方法并将 if 放入 Collision 方法中,它应该可以工作:

    [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. 我删除了刚体引用,因为它不再使用,因此整个 Start() 方法也不再使用。
    3. 由于此代码需要刚体和碰撞器才能工作,我在顶部添加了一个 [RequireComponent] 属性,如果您忘记在附加此脚本的对象上添加这些组件,Unity 会告诉您。李>
    4. 我添加了一个 Debug.Log 来打印与食物碰撞的生物的名称和层,这样您就可以调试并确保它按预期工作

    【讨论】:

    • 但是我可以指定我想要检测的对撞机吗?例如仅在 BoxCollider 上触发
    • 我想你可以试试:if (other.gameObject.layer == 10 &amp;&amp; typeof(other) == typeof(BoxCollider))。我自己从来没有做过,但我认为它应该工作。基本上检查碰撞组件是否为 BoxCollider 类型
    • @VojtěchVach 您可以检查图层、标签、游戏对象名称、附加组件的存在与否……无论您想检查什么以确保检测到正确的碰撞:您可以访问整个游戏对象通过other.gameObject
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多