我有一个附在盒子上的脚本,盒子上有两个物理碰撞器,一个(稍大)对撞机,当玩家经过它时可以检测到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不会被调用,其他触发事件也不会被调用。

请参阅以下有关包装盒及其组件的图像:

c# - OntriggerEnter不称为playerController-LMLPHP
  c# - OntriggerEnter不称为playerController-LMLPHP

请参阅此处,了解应调用框的OntriggerEnterOnControllerColliderHit函数的播放机:

c# - OntriggerEnter不称为playerController-LMLPHP
c# - OntriggerEnter不称为playerController-LMLPHP

编辑我将所有元素修改为@Programmer的建议。但是OnControllerColliderHit事件仍然没有被调用。。(请注意,此函数附在包装盒上)

最佳答案

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

1.您缺少Rigidbody。应该将其附加到“ Cube”游戏对象上,因为不能通过CharacterController将刚体附加到GameObject上。

2.您有两个BoxColliders附加到一个GameObject(“多维数据集”)。不要这样做。这可能导致许多问题,包括多次调用回调函数或根本不调用回调函数。

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

创建一个空的子GameObject,将触发器放在此处。你可以做到的。

3.您正在使用CharacterController,因此应删除OnTriggerXXX回调函数。使用CharacterController时,建议使用其回调函数OnControllerColliderHit

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


4. CharacterController不是要用作触发器。它们用于检测碰撞。

您有两种选择可以使其检测触发器:

A.从“多维数据集”对象中删除isTrigger

要么

B.在CharacterController下添加一个空的子GameObject,然后向其中添加CapsuleCollider或任何其他对撞机。您不必将其标记为isTrigger,因为“多维数据集”已被标记为isTrigger。您也不应该将Rigidbody附加到此儿童对撞机上。

创建一个名为“ CC”的新层,并将CharacterController和新的子GameObject置于“ CC”层中。进入物理collision matrix settings并进行设置,以使“ CC”层不会与“ CC”层碰撞。这将确保CharacterController不会从子对象检测到碰撞。

现在,您可以使用您的OnTriggerXXX回调函数来检测CharacterController和“ Cube”对象之间的冲突。

10-05 21:36