Unity十字线作为指针

时间:2016-05-22 17:57:22

标签: c# unity3d

我有一个3d Unity游戏,在世界空间中只有很少的3d对象。我在相机空间有一个标线。当光罩穿过每个3d对象时,我会写一个指针-enter和pointer-exit事件。移动手机时,光罩移动,但3d物体停留在世界空间。标线不起指针作用。虽然触摸事件正在发挥作用,但我无法将十字线作为指针。我用相机添加了物理光线投影。 我在做什么错误?

1 个答案:

答案 0 :(得分:4)

好的,所以你试图在非UI对象上使用UI.Selectable事件(Selectable.OnPointerEnter)。

假设您在屏幕空间中有光标位置,我强烈建议您使用附加到Camera对象的脚本中的Physics.Raycast,尽管它可以简单地引用相机实例。我们可以将它与" hitObject"结合使用。触发自定义十字线进入/退出/悬停事件,如下所示:

<强> CameraPointer.cs:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Camera))]
public class CameraPointer : MonoBehaviour {
    private GameObject hitObject = null;
    private Vector3 reticlePosition = Vector3.zero;
    private Camera camera;

    void Awake() {
        camera = GetComponent<Camera>();
    }

    // Update is called once per frame
    void Update () {
        // TODO: Replace with reticle screen position
        reticlePosition = Input.mousePosition;

        // Raycast variables
        Ray ray = camera.ScreenPointToRay(reticlePosition); 
        RaycastHit hit;

        // Raycast
        if (Physics.Raycast(ray, out hit)) {
            if (hitObject != hit.transform.gameObject) {
                if (hitObject != null) {
                    hitObject.SendMessage("OnReticleExit"); // Trigger "OnReticleExit"
                }
                hitObject = hit.transform.gameObject;
                hitObject.SendMessage("OnReticleEnter"); // Trigger "OnReticleEnter"
            } else {
                hitObject.SendMessage("OnReticleHover"); // Trigger "OnReticleHover"
            }
        } else {
            if (hitObject != null) {
                hitObject.SendMessage("OnReticleExit"); // Trigger "OnReticleExit"
            }
            hitObject = null;
        }
    }
}

<强> MyObject.cs:

using UnityEngine;
using System.Collections;

public class MyObject : MonoBehaviour
{
    // Custom reticle events
    void OnReticleEnter()
    {
        Debug.Log("Entering over " + this.name);
    }
    void OnReticleExit()
    {
        Debug.Log("Exiting over "+this.name);
    }
    void OnReticleHover()
    {
        Debug.Log("Hovering over "+this.name);
    }
}