如何在世界空间中使用图形光线投射器与UI?

7

我正在尝试弄清楚Graphic.Raycaster的工作原理,但是文档并没有提供帮助。我想使用它来从某个位置以特定角度进行射线投射,并命中UI。另一件事是我不知道如何使其与UI交互(拖动、点击等)。我知道这是一个广泛的主题,但我就是找不到任何关于如何使用它的好解释,所以我会非常感激任何解释。


你读过这个吗? - Uri Popov
2个回答

8

来自Unity文档:

图形射线投射器用于对Canvas进行投射。该射线投射器检查Canvas上的所有图形并确定它们是否被击中。

您可以使用EventSystem.RaycastAll来针对图形(UI)元素进行射线投射。

这里有一个简短的例子:

void Update() {


// Example: get controller's current orientation:
  Quaternion ori = GvrController.Orientation;

  // If you want a vector that points in the direction of the controller
  // you can just multiply this quat by Vector3.forward:
  Vector3 vector = ori * Vector3.forward;

  // ...or you can just change the rotation of some entity on your scene
  // (e.g. the player's arm) to match the controller's orientation
  playerArmObject.transform.localRotation = ori;

  // Example: check if touchpad was just touched
  if (GvrController.TouchDown) {
    // Do something.
    // TouchDown is true for 1 frame after touchpad is touched.

    PointerEventData pointerData = new PointerEventData(EventSystem.current);

    pointerData.position = Input.mousePosition; // use the position from controller as start of raycast instead of mousePosition.

    List<RaycastResult> results = new List<RaycastResult>();
    EventSystem.current.RaycastAll(pointerData, results);

    if (results.Count > 0) {
         //WorldUI is my layer name
         if (results[0].gameObject.layer == LayerMask.NameToLayer("WorldUI")){ 
         string dbg = "Root Element: {0} \n GrandChild Element: {1}";
         Debug.Log(string.Format(dbg, results[results.Count-1].gameObject.name,results[0].gameObject.name));
         //Debug.Log("Root Element: "+results[results.Count-1].gameObject.name);
         //Debug.Log("GrandChild Element: "+results[0].gameObject.name);
          results.Clear();
     }
   }
}

上述脚本未经过我的测试,可能存在一些错误。

以下是其他参考资料,帮助您更好地了解:

  1. Unity的图形射线投射器是如何工作的?
  2. 在世界空间中对UI进行射线投射
  3. 如何从任意屏幕/画布位置对uGUI对象进行射线投射
  4. 如何执行图形射线投射?
  5. GraphicRaycaster

希望这能有所帮助。


1
谢谢!我不理解你代码中的几个部分。Vector3 vector = ori * Vector3.forward; - 我创建了这个向量,但它从未被再次使用,所以我不知道这个脚本如何工作。因此,射线的方向没有被设置。 - Wojtek Wencel
1
我已经替换了它,但它仍然无法正常工作,同时调试日志信息也没有显示。 - Wojtek Wencel
1
我之前移除了这个层检查,现在当我像这样绘制射线 Debug.DrawRay(transform.position, vector); 时,它会穿过UI元素。也许这不起作用是因为 vector 被用作位置而不是方向? - Wojtek Wencel
让我们在聊天室里继续这个讨论 - Umair M
嘿,我有一个关于RaycastAll的问题。它是只针对UI元素进行光线投射,还是也会考虑其他光线投射(例如物理光线投射)?我问这个问题是因为文档中默认情况下EventSystem有3个光线投射器,如果我读懂了的话。 - kolboc
显示剩余5条评论

2

Umair M的建议没有考虑到光线是从世界空间发出并以一个角度行进的事实。

在我的看来,即使你的画布在世界空间中,也不能在世界空间中以一个角度进行GUI射线投射。 这个页面 提供了一种技术,即创建一个非渲染相机,在3D空间中移动它并使用你想要投射的射线,然后相对于该相机进行GUI射线投射。我还没有尝试过,但听起来很有前途。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接