gpt4 book ai didi

c# - OnTriggerEnter() 在开始时被调用

转载 作者:太空宇宙 更新时间:2023-11-03 22:33:28 25 4
gpt4 key购买 nike

我正在制作某种 Evolution 模拟游戏。我有一个脚本,应该在生物的 CapsuleCollider 触发 OnTriggerEnter() 时销毁它所附加的 GameObject。

我有一个问题,即使 Creature 的碰撞器甚至不靠近 Food,它仍然会破坏 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>());
}

}

}
}

最佳答案

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

另外,你现在的代码逻辑好像不对,是...

"Every frame, loop through all rigidbodies in the scene and if 1 is found on layer 10, destroy the 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. 由于这段代码需要一个刚体和一个碰撞器才能工作,我在顶部添加了一个 [RequireComponent] 属性,如果您忘记将这些组件添加到您附加此脚本的对象上,这将使 Unity 告诉您。<
  4. 我添加了一个 Debug.Log,用于打印与食物碰撞的生物的名称和层,因此您可以调试并确保它按预期工作

关于c# - OnTriggerEnter() 在开始时被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56207905/

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