我正在尝试弄清楚Graphic.Raycaster的工作原理,但是文档并没有提供帮助。我想使用它来从某个位置以特定角度进行射线投射,并命中UI。另一件事是我不知道如何使其与UI交互(拖动、点击等)。我知道这是一个广泛的主题,但我就是找不到任何关于如何使用它的好解释,所以我会非常感激任何解释。
我正在尝试弄清楚Graphic.Raycaster的工作原理,但是文档并没有提供帮助。我想使用它来从某个位置以特定角度进行射线投射,并命中UI。另一件事是我不知道如何使其与UI交互(拖动、点击等)。我知道这是一个广泛的主题,但我就是找不到任何关于如何使用它的好解释,所以我会非常感激任何解释。
来自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();
}
}
}
上述脚本未经过我的测试,可能存在一些错误。
以下是其他参考资料,帮助您更好地了解:
希望这能有所帮助。
Vector3 vector = ori * Vector3.forward;
- 我创建了这个向量,但它从未被再次使用,所以我不知道这个脚本如何工作。因此,射线的方向没有被设置。 - Wojtek WencelDebug.DrawRay(transform.position, vector);
时,它会穿过UI元素。也许这不起作用是因为 vector
被用作位置而不是方向? - Wojtek WencelUmair M的建议没有考虑到光线是从世界空间发出并以一个角度行进的事实。
在我的看来,即使你的画布在世界空间中,也不能在世界空间中以一个角度进行GUI射线投射。 这个页面 提供了一种技术,即创建一个非渲染相机,在3D空间中移动它并使用你想要投射的射线,然后相对于该相机进行GUI射线投射。我还没有尝试过,但听起来很有前途。