如何在WorldSpace UI中使用图形光线投射器
本文关键字:图形 光线投射 WorldSpace UI | 更新日期: 2023-09-27 18:03:41
我想弄清楚如何图形。Raycaster可以工作,但是文档没有帮助。我想用它从某个位置以某个角度投射光线并击中UI。另一件事是,我不知道如何使它与UI交互(拖动,点击等)。我知道这是一个宽泛的话题,但我就是找不到任何好的解释如何使用它,所以我将非常感谢任何解释。
From Unity docs:
图形光线投射器用于对画布进行光线投射。的Raycaster查看画布上的所有图形并确定是否有他们被击中了。
您可以对图形(UI)元素使用EventSystem.RaycastAll
到raycast
。
下面是一个简短的例子:
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();
}
}
}
上面的脚本不是我自己测试的。所以可能会有一些错误。
这里有一些其他的参考文献来帮助你理解更多:
- Unity的Graphics Raycaster;它是如何工作的?
- 世界空间中针对UI的光线投射
- 如何从任意屏幕/画布位置对uGUI对象进行光线投射
- 如何执行图形光线投射?
- GraphicRaycaster
希望能有所帮助。
Umair M目前的建议没有处理光线起源于世界空间并以一定角度传播的事实。
在我看来,即使你的画布在世界空间中,你也不能在世界空间中以某个角度进行GUI光线投射。这个页面建议创建一个非渲染相机的技术,用你想投射的光线在3D空间中移动它,然后对相机进行GUI光线投射。我还没有试过,但听起来很有希望。