Unity - OnTriggerEnter未注册冲突

时间:2018-03-12 22:20:51

标签: c# unity3d

我试图为2D角色和碰撞对象做碰撞。我已经定义了OnTriggerEnter函数,以便在输入触发器时在调试器中显示消息。角色是" CharacterRobotBoy"来自Unity标准资产包的资产(包含BoxCollider2D),我希望它与附加BoxCollider2D的另一个对象发生碰撞,设置为触发器。我在第二个对象上勾选了触发器。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PickUpCheck : MonoBehaviour {


    private int pickUpCount;

    // Use this for initialization
    void Start () {
        pickUpCount = 0;
    }


    void OnTriggerEnter(Collider collider)
    {
       // if (collider.gameObject.name == "RobotBoy")
       //     pickUpCount++;
        Debug.Log("PickUp " + pickUpCount);
    }

    // Update is called once per frame

    void Update () {

    }
}

我尝试将脚本附加到角色和其他对象上,但似乎无法记录与触发器的冲突。

/ edit - 我已经读过或者是OnTriggerEnter2D。我尝试过调用此功能,但在Visual Studio中无法识别。不确定它是否仍然存在或者我做错了什么?

/ edit - 将代码切换为 -

void OnTriggerEnter2D(Collider2D collider)
{
   // if (collider.gameObject.name == "RobotBoy")
   //     pickUpCount++;
    Debug.Log("PickUp " + pickUpCount);
}

但仍然没有运气......

Pick up object

/ edit - @Eddge为角色和拾取对象设置了一个公共图层,虽然我认为在没有图层设置的情况下仍然会发生碰撞?

Collision Matrix

This答案提供了丰富的信息,但我确保我已经在我的设置中有所描述的组件 - 两个对象上的碰撞器,其中一个对象上存在刚体,另一个设置为触发器。

/ edit Solved! - 好的,所以我清理了调试(感谢@Eddge的建议)。我将脚本移动到角色并注意到发生了碰撞,但没有发现拾取对象。

我在OnTriggerEnter2D中切换代码以输出碰撞对象的名称,这有助于我更清楚地了解发生了什么:

void OnTriggerEnter2D(Collider2D collider)
{
    Debug.Log(collider.gameObject.name);
}

事实证明问题出在我预修的预制件中的BoxCollider2D作为拾取器。我重建了游戏对象,这解决了这个问题。

2 个答案:

答案 0 :(得分:2)

如果您正在处理2D游戏,则必须使用 OnTriggerEnter2D(Collider2D other)。目前,您正在使用 OnTriggerEnter 仅注册3D冲突。另外,请确保您已将 Collider2D 作为函数的参数传递。

所以将代码更改为:

 void OnTriggerEnter2D(Collider2D collider)
{
   // if (collider.gameObject.name == "RobotBoy")
   //     pickUpCount++;
    Debug.Log("PickUp " + pickUpCount);
}

Check out the Unity API docs

答案 1 :(得分:0)

所以我确保为碰撞发生了正确的组件(详细here)。事实证明我的第一个问题是使用OnCollisionEnter而不是OnCollisionEnter2D(注意你必须使用Collider2D参数)。感谢卡洛斯澄清这一点。

但唉,碰撞仍然不会发生......

然后我检查确保图层不是问题。图层可用于组织对象之间的碰撞交互。更多信息herehere

最后,我将脚本从拾取器切换到播放器控制器,发现它能够使用碰撞对象名称的调试日志与拾取器以外的对象发生碰撞。

我重新创建了游戏对象 - 对象,BoxCollider2D和脚本,并且碰撞开始起作用。