我有一架包含约200个磁贴的飞机,我希望能够检测到玩家单击了哪个磁贴。每个磁贴都具有一个盒对撞机。我还在场景中创建了一个空游戏对象,并在其中附加了EventSystem和以下脚本:

public class PlaneBehaviour : MonoBehaviour, IPointerDownHandler {
    public GameObject ClickSymbol;

    public void Start() {
        var physicsRaycaster = FindObjectOfType<PhysicsRaycaster>();

        if (physicsRaycaster == null) {
            Camera.main.gameObject.AddComponent<PhysicsRaycaster>();
        }
    }

    public void OnPointerDown(PointerEventData eventData) {
        var o = eventData.pointerCurrentRaycast.gameObject;
    }
}


现在,当用户单击任意位置时,什么都没发生-我已经在OnPointerDown方法中放置了一个断点,但是没有命中(并且Start方法中的代码正在运行-我还通过将一个断点)。

最佳答案

有很多事情可能导致回调函数没有被调用。在尝试这些操作之前,请将Debug.Log放在OnPointerDown函数中,以确保它被调用:

1.转到GameObject-> UI ---> EventSystem。

将创建一个名为“ EventSystem”的GameObject,并将附加适当的脚本,例如EventSystemStandAloneInputModule

2. PlaneBehaviour脚本必须通过对撞机连接到GameObject,而不是空的GameObject。它检测到单击了附加到的对象。

3.如果使用名称为“ 2D”结尾的对撞机,则必须使用Physics2DRaycaster而不是PhysicsRaycaster

4.您是否使用两个以上的相机?如果是这样,请手动将PhysicsRaycaster附加到当前显示该对象的正确摄像机。

5.重新调整您要检测点击次数的GameObject的大小。我看到这样做有时可以解决问题。然后,如果可行,则必须将摄像机移回。

关于c# - 未调用EventSystem OnPointerXXX函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45232431/

10-13 06:05