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