通过 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按钮并在点击事件时调用它[重复]

unity区分点击在3D物体还是2D UI上

通过指向对象来获取对象名称 Unity Raycast

Unity Physics.Raycast 似乎无法正确检测到它击中的对象

unity为啥射线检测不到ui

Unity 射线检测(RayCast)