DayDream,不使用事件系统检测指针
DayDream, detect pointer without using Event System
Google 的新 DayDream 样本正在使用事件系统来检测指针是否在对象上。
以前它根本不是那样工作的,它是一个十字线,然后你会在Camera和十字线之间创建一个Raycast,例如:
Vector3 rayDirection = GvrController.Orientation * Vector3.forward;
if (Physics.Raycast(origin, rayDirection, out hitInfo, Mathf.Infinity)) {
然后检测十字线和相机之间是否有特定对象。
这种方式已经行不通了。 Google 现在正在使用事件系统,然后检查十字线是否位于对象上。
有没有办法让我在不使用事件系统的情况下检查任何对象。
事件系统是一个很好的方法,只是我有大约 40 个不同的对象,它们都以相同的方式工作,并且为这 40 个不同的对象实现一个事件 point/click 似乎有点矫枉过正,而以前我可以只需按标签检查一个对象。
任何人都能够在不使用事件系统的情况下检测到指针是否位于对象上?
光线投射似乎不再正常工作,因为指针似乎更像是一个二维对象,就像鼠标一样。
这大致可行,但不是很好:
Vector3 origin = Head.transform.position + GvrController.ArmModel.wristPosition;
Vector3 rayDirection = GvrController.ArmModel.pointerRotation * Vector3.forward;
任何帮助将不胜感激:)
如果您不想使用 EventTrigger 组件,您可以简单地使用相同的旧脚本并实现 IPointerEnterHandler
、IPointerExitHandler
、OnPointerClickHandler
等并使用相同的比较标记方法对于每个对象。
我认为它比自定义光线投射更容易使用。由于总是有一个 Graphics Raycaster(或 3D 对象的 Physics Raycaster)在工作,所以为什么不使用它提供的东西呢。
public class MyOldScriptWhichUsedRaycasting: MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
{
public void OnPointerEnter (PointerEventData eventData)
{
if(gameObject.CompareTag("Grabable"))
{
//do stuff here.
}
}
public void OnPointerExit (PointerEventData eventData)
{
if(gameObject.CompareTag("Grabable"))
{
//do stuff here.
}
}
public void OnPointerClick (PointerEventData eventData)
{
if(gameObject.CompareTag("Grabable"))
{
//do stuff here.
}
}
}
希望对您有所帮助
Google 的新 DayDream 样本正在使用事件系统来检测指针是否在对象上。 以前它根本不是那样工作的,它是一个十字线,然后你会在Camera和十字线之间创建一个Raycast,例如:
Vector3 rayDirection = GvrController.Orientation * Vector3.forward;
if (Physics.Raycast(origin, rayDirection, out hitInfo, Mathf.Infinity)) {
然后检测十字线和相机之间是否有特定对象。
这种方式已经行不通了。 Google 现在正在使用事件系统,然后检查十字线是否位于对象上。 有没有办法让我在不使用事件系统的情况下检查任何对象。
事件系统是一个很好的方法,只是我有大约 40 个不同的对象,它们都以相同的方式工作,并且为这 40 个不同的对象实现一个事件 point/click 似乎有点矫枉过正,而以前我可以只需按标签检查一个对象。
任何人都能够在不使用事件系统的情况下检测到指针是否位于对象上? 光线投射似乎不再正常工作,因为指针似乎更像是一个二维对象,就像鼠标一样。
这大致可行,但不是很好:
Vector3 origin = Head.transform.position + GvrController.ArmModel.wristPosition;
Vector3 rayDirection = GvrController.ArmModel.pointerRotation * Vector3.forward;
任何帮助将不胜感激:)
如果您不想使用 EventTrigger 组件,您可以简单地使用相同的旧脚本并实现 IPointerEnterHandler
、IPointerExitHandler
、OnPointerClickHandler
等并使用相同的比较标记方法对于每个对象。
我认为它比自定义光线投射更容易使用。由于总是有一个 Graphics Raycaster(或 3D 对象的 Physics Raycaster)在工作,所以为什么不使用它提供的东西呢。
public class MyOldScriptWhichUsedRaycasting: MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
{
public void OnPointerEnter (PointerEventData eventData)
{
if(gameObject.CompareTag("Grabable"))
{
//do stuff here.
}
}
public void OnPointerExit (PointerEventData eventData)
{
if(gameObject.CompareTag("Grabable"))
{
//do stuff here.
}
}
public void OnPointerClick (PointerEventData eventData)
{
if(gameObject.CompareTag("Grabable"))
{
//do stuff here.
}
}
}
希望对您有所帮助