通过 RayCast Unity 与 UI 交互
Posted
技术标签:
【中文标题】通过 RayCast Unity 与 UI 交互【英文标题】:Interact with UI via RayCast Unity 【发布时间】:2021-12-27 08:54:07 【问题描述】:嗨2,
我有(我认为是一个非常简单的问题)。 如何检测当前正在“投射”的 Ui 元素并与之交互?
下图是我想要达到的效果:
我有来自 Unity 文档的这段代码
void FixedUpdate()
int layerMask = 1 << 8;
// This would cast rays only against colliders in layer 8.
// But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask.
layerMask = ~layerMask;
RaycastHit hit;
// Does the ray intersect any objects excluding the player layer
if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, Mathf.Infinity, layerMask))
Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * hit.distance, Color.yellow);
Debug.Log("Did Hit");
else
Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * 1000, Color.white);
Debug.Log("Did not Hit");
但它只允许我投射一个 3D 对象(带有对撞机)。
我听说过图形 raycaster 和 raycast,但不知道如何使用它。 如果可能,我不想将额外的脚本或额外的事件附加到 UI 元素(因为我有很多 UI 元素)
非常感谢您的意见! :D
【问题讨论】:
所以你想移动光线投射并且 UI 中应该发生一些事情? 是的...,我想移动球体(使用 Raycast)并且该 raycast 应该“单击”按钮或“滚动”滚动视图...:) 不确定如何在 Unity 中执行,但需要将 3D 光线投射矢量投影到 2D UI 平面上,并且需要检查光线投射焦点是否在按钮/滚动条区域 - 类似这样. 它有点旧,但也许这对你有帮助:Using Raycast instead of Gaze Pointer 你所有的 UI 项目都在同一个父Canvas
中吗?
【参考方案1】:
我认为你需要这个: EventSystem.current.currentSelectedGameObject
更多关于这里:
https://docs.unity3d.com/2018.1/Documentation/ScriptReference/EventSystems.EventSystem-currentSelectedGameObject.html
【讨论】:
hmm.. 我不确定 EventSystem.current.currentSelectedGameObject,因为它不会简单地返回对象。此外,该函数(据我所知)仅返回悬停的 ui,而不是被光线投射的 ui。感谢您的回复 如果你想在光线投射上设置游戏对象,这可以帮助:docs.unity3d.com/2018.1/Documentation/ScriptReference/…以上是关于通过 RayCast Unity 与 UI 交互的主要内容,如果未能解决你的问题,请参考以下文章
Unity Raycast UI按钮并在点击事件时调用它[重复]