我正在制作某种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>());
}
}
}
}
答案 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);
}
}
对代码进行一些值得注意的编辑:
gameObject
或this.gameObject
就可以访问它。