3

我有一个附加到盒子的脚本,盒子上有两个用于物理的碰撞器,一个(稍大)用于在我的玩家走过它时检测 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永远不会被调用,其他触发事件也不会被调用..

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

请参阅此处了解我的玩家应该调用框的OntriggerEnterorOnControllerColliderHit函数:

玩家属性 3D场景中的玩家

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

4

2 回答 2

4

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

1 . 您缺少一个Rigidbody. 这应该附加到“立方体”游戏对象,因为不能使用 CharacterController 将刚体附加到游戏对象。

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

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

创建一个空的子 GameObject 将触发器放在那里。你可以这样做。

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

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

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

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

一个。从“Cube”对象中移除 isTrigger

或者

。在 CharacterController 下添加一个子空 GameObject,然后添加 CapsuleCollider 或任何其他对撞机。您不必将其标记为 isTrigger,因为“Cube”已经标记为 isTrigger。您也不应该将刚体附加到这个子对撞机上。

创建一个名为“CC”的新层,并使 CharacterController 和新的子 GameObject 位于“CC”层中。转到您的物理碰撞矩阵设置并使其“CC”层不能与“CC”层发生碰撞。这将确保 CharacterController 不会检测到来自 tis 子对象的冲突。

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

于 2018-10-27T12:48:32.177 回答
0

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

于 2018-10-27T12:39:28.377 回答