如何使用 canvas 元素(屏幕 space 覆盖)进行光线投射
How do I make raycast hit with a canvas element(screen space overlay)
出于某种原因,我的 2D 叠加层没有对光线投射做出反应,而 3D 对象工作正常。我已经在互联网上搜索了很长一段时间,但仍然找不到解决方案。 (我对 C# 和 Unity 都是新手,所以我的知识有限)
如果有人能对我遇到的这个问题有所了解,将不胜感激!
这里的问题是,当我单击 2D 叠加层时,我希望我的光标显示一条控制台消息。 3D 对象工作并在控制台中显示相关消息,但由于某种原因,2D 图形未检测到光线投射命中。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class rayCast_Test : MonoBehaviour
{
[SerializeField]
public GameObject TutorialUI;
public Canvas gameChara2D;
[SerializeField]
private float rayCastDistance = 25f;
[SerializeField]
float DistanceFromCamera = 1f;
private ARRaycastManager aRRaycastManager;
private Vector3 touchPos;
private Vector3 touchOrigin;
private bool onTouchHold = false;
private RaycastHit hitObject;
private void Awake()
{
aRRaycastManager = FindObjectOfType<ARRaycastManager>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButton(0))
{
touchPos = Input.mousePosition;
if (!onTouchHold)
{
Ray ray = Camera.main.ScreenPointToRay(touchPos);
if (Physics.Raycast(ray, out hitObject, rayCastDistance))
{
if(hitObject.transform.CompareTag("Moveable"))
{
onTouchHold = true;
touchOrigin = Input.mousePosition;
Debug.Log("Hello. This is a 3D object");
}
}
if(Physics.Raycast(ray, out hitObject, rayCastDistance))
{
if (hitObject.transform.CompareTag("ChallengeUI"))
{
Debug.Log("Hello. This is a 2D object");
}
}
}
}
if(Input.GetMouseButtonUp(0))
{
onTouchHold = false;
}
}
}
您不能对 UI 元素或 2D 碰撞器使用 Physics.Raycast
。
一般来说,您想要击中的是特定的 Graphic
component such as an Image
or Text
component with RaycastTarget
启用。
如果你想点击 BoxCollider2D
,你必须使用 Physics2D.Raycast
。然而,这不适用于 Z
方向的光线投射,而仅适用于通过 XY 方向从侧面撞击对撞机。
要真正击中 UI,您必须使用不同类型的 Raycast,而不是通过物理,而是使用 EventSystem.RaycastAll
,例如
var pointerEventData = new pointerEventData{ position = touchPos};
var raycastResults = new List<RaycastResult>();
EventSystem.current.RaycastAll(pointerEventData, raycastResults);
if(raycastResults.Count > 0)
{
foreach(var result in RaycastResults)
{
...
}
}
请进一步注意,您检查了标记 ChallangeUI
,但您的 UI 对象具有层 UI
。
出于某种原因,我的 2D 叠加层没有对光线投射做出反应,而 3D 对象工作正常。我已经在互联网上搜索了很长一段时间,但仍然找不到解决方案。 (我对 C# 和 Unity 都是新手,所以我的知识有限)
如果有人能对我遇到的这个问题有所了解,将不胜感激!
这里的问题是,当我单击 2D 叠加层时,我希望我的光标显示一条控制台消息。 3D 对象工作并在控制台中显示相关消息,但由于某种原因,2D 图形未检测到光线投射命中。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class rayCast_Test : MonoBehaviour
{
[SerializeField]
public GameObject TutorialUI;
public Canvas gameChara2D;
[SerializeField]
private float rayCastDistance = 25f;
[SerializeField]
float DistanceFromCamera = 1f;
private ARRaycastManager aRRaycastManager;
private Vector3 touchPos;
private Vector3 touchOrigin;
private bool onTouchHold = false;
private RaycastHit hitObject;
private void Awake()
{
aRRaycastManager = FindObjectOfType<ARRaycastManager>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButton(0))
{
touchPos = Input.mousePosition;
if (!onTouchHold)
{
Ray ray = Camera.main.ScreenPointToRay(touchPos);
if (Physics.Raycast(ray, out hitObject, rayCastDistance))
{
if(hitObject.transform.CompareTag("Moveable"))
{
onTouchHold = true;
touchOrigin = Input.mousePosition;
Debug.Log("Hello. This is a 3D object");
}
}
if(Physics.Raycast(ray, out hitObject, rayCastDistance))
{
if (hitObject.transform.CompareTag("ChallengeUI"))
{
Debug.Log("Hello. This is a 2D object");
}
}
}
}
if(Input.GetMouseButtonUp(0))
{
onTouchHold = false;
}
}
}
您不能对 UI 元素或 2D 碰撞器使用 Physics.Raycast
。
一般来说,您想要击中的是特定的 Graphic
component such as an Image
or Text
component with RaycastTarget
启用。
如果你想点击 BoxCollider2D
,你必须使用 Physics2D.Raycast
。然而,这不适用于 Z
方向的光线投射,而仅适用于通过 XY 方向从侧面撞击对撞机。
要真正击中 UI,您必须使用不同类型的 Raycast,而不是通过物理,而是使用 EventSystem.RaycastAll
,例如
var pointerEventData = new pointerEventData{ position = touchPos};
var raycastResults = new List<RaycastResult>();
EventSystem.current.RaycastAll(pointerEventData, raycastResults);
if(raycastResults.Count > 0)
{
foreach(var result in RaycastResults)
{
...
}
}
请进一步注意,您检查了标记 ChallangeUI
,但您的 UI 对象具有层 UI
。