OntriggerEnter 未调用 playerController

OntriggerEnter not called playerController

我有一个附在盒子上的脚本,盒子有两个用于物理的碰撞器和一个(稍大)用于在我的玩家走过它时检测 OntriggerEnters。我在盒子上附加了一个脚本,它执行以下操作:

public class ColorChangeCollision : MonoBehaviour {

    private GameObject Element;
    private Color32 BaseColor, CollisionColor;
    private Material ElementMaterial;

    void Start () {
        Element = this.gameObject;
        BaseColor = new Color32(255,255,255,255);
        CollisionColor = new Color32((byte)Random.Range(0, 255),(byte)Random.Range(0, 255),(byte)Random.Range(0, 255), 255);
        ElementMaterial = Element.gameObject.GetComponent<Renderer>().material;
    }

    private void OnControllerColliderHit(ControllerColliderHit  other)
    {
        Debug.Log("collision...");
        ElementMaterial.color = CollisionColor;
    }

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("enter");
    }

    private void OnTriggerStay(Collider other)
    {
        Debug.Log("staying..");
    }

    private void OnTriggerExit(Collider other)
    {
        Debug.Log("left...");
        ElementMaterial.color = BaseColor;
    }
}

主要问题 OnTriggerEnterOnControllerColliderHit 从未被调用,其他触发事件也不会被调用..

请参阅下面的盒子及其组件设置图片:

我的玩家请看这里,他应该调用方框的 OntriggerEnterOnControllerColliderHit 函数:

EDIT 我根据@Programmer 的建议修改了所有元素。但是 OnControllerColliderHit 事件仍然没有被调用..(注意这个函数附在盒子上)

其中一个需要有刚体来检测碰撞。

关于如何设置场景和代码有 3 个问题:

1。您缺少 Rigidbody。这应该附加到 "Cube" GameObject,因为不能使用 CharacterController 将 Rigidbody 附加到 GameObject。

2。您有两个 BoxCollider 附加到一个游戏对象 ("Cube")。 不要这样做。这会导致许多问题,包括回调函数被多次调用或根本不调用。

同时需要触发和非触发对撞机时怎么办?

创建一个空的子游戏对象,将触发器放在那里。你可以做到。

3。您正在使用 CharacterController,因此您应该 删除 OnTriggerXXX 回调函数。使用CharacterController时,推荐使用其回调函数OnControllerColliderHit

void OnControllerColliderHit(ControllerColliderHit hit)
{
    Rigidbody body = hit.collider.attachedRigidbody;
    ......
}

4。 CharacterController 并不意味着用作触发器。它们用于检测碰撞。

您有两个选项可以让它检测触发器:

A。从 "Cube" 对象

中删除 isTrigger

B。在 CharacterController 下添加一个子空 GameObject,然后向其添加 CapsuleCollider 或任何其他碰撞器。您不必将其标记为 isTrigger,因为 "Cube" 已被标记为如此。您也不应该将 Rigidbody 附加到这个儿童对撞机上。

创建一个名为 "CC" 的新层,并使 CharacterController 和新的子 GameObject 位于 "CC" 层中。转到你的物理 collision matrix settings 并使 "CC" 层不能与 "CC" 层发生碰撞。这将确保 CharacterController 不会检测到来自该子对象的碰撞。

您现在可以使用 OnTriggerXXX 回调函数来检测 CharacterController 和 "Cube" 对象之间的碰撞。