如何从球体光线投射到 canvas 中的 ui 元素
How do I raycast from a sphere to an ui element in the canvas
我想从 Sphere GameObject 的中心进行光线投射,以找到被光线击中的 text/image 元素。我正在使用 Physics.RaycastAll 来检测 UI 元素被命中。以下是我的代码。
public class RaycastUI : MonoBehaviour
{
public GameObject Sphere;
private Vector3 _origin;
private Vector3 _direction;
void Update()
{
RaycastHit[] hits;
// get the origin and direction
_origin = Sphere.transform.position;
_direction = Sphere.transform.forward;
//raycast all
hits = Physics.RaycastAll(_origin, _direction, 100.0F);
// retrieve the names of the element that are hit by the sphere.
for (int i = 0; i < hits.Length; i++) {
RaycastHit hit = hits[i];
Debug.Log(hit.collider.name);
}
}
}
我已将 BoxCoilloider 添加到 canvas。不幸的是,hits.Length
总是 returns 0。我错过了什么吗?如何将光线从球体投射到 canvas 中的 ui 元素以检查它是否发生碰撞?
我认为如果你想检查 UI 元素,你必须使用 EventSystem
。
尝试这样的事情:
private void GetUIObjectsOfPosition(Vector2 screenPosition)
{
var eventDataCurrentPosition = new PointerEventData(EventSystem.current);
eventDataCurrentPosition.position = screenPosition;
var results = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
foreach (var result in results) {
Debug.Log(result.gameObject.name);
}
}
您可以使用 Camera.WorldToScreenPoint 从您的球体世界位置计算屏幕位置。
我想从 Sphere GameObject 的中心进行光线投射,以找到被光线击中的 text/image 元素。我正在使用 Physics.RaycastAll 来检测 UI 元素被命中。以下是我的代码。
public class RaycastUI : MonoBehaviour
{
public GameObject Sphere;
private Vector3 _origin;
private Vector3 _direction;
void Update()
{
RaycastHit[] hits;
// get the origin and direction
_origin = Sphere.transform.position;
_direction = Sphere.transform.forward;
//raycast all
hits = Physics.RaycastAll(_origin, _direction, 100.0F);
// retrieve the names of the element that are hit by the sphere.
for (int i = 0; i < hits.Length; i++) {
RaycastHit hit = hits[i];
Debug.Log(hit.collider.name);
}
}
}
我已将 BoxCoilloider 添加到 canvas。不幸的是,hits.Length
总是 returns 0。我错过了什么吗?如何将光线从球体投射到 canvas 中的 ui 元素以检查它是否发生碰撞?
我认为如果你想检查 UI 元素,你必须使用 EventSystem
。
尝试这样的事情:
private void GetUIObjectsOfPosition(Vector2 screenPosition)
{
var eventDataCurrentPosition = new PointerEventData(EventSystem.current);
eventDataCurrentPosition.position = screenPosition;
var results = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
foreach (var result in results) {
Debug.Log(result.gameObject.name);
}
}
您可以使用 Camera.WorldToScreenPoint 从您的球体世界位置计算屏幕位置。