Raycast 不会击中 UI 对象

问题描述 投票:0回答:1

我有以下问题:

我有一个填充有面板的滚动视图。现在我希望能够在两个面板之间右键单击并在该位置创建另一个面板。所有面板都保存在列表中。

我的想法是有一个光标对象跟随我的鼠标并在光标上方和下方发送光线投射。这样,我就知道前一个或后一个面板应该是什么,这样我就可以将新面板插入到列表中的正确位置。 Rough drawing of my project

但问题是我的 Raycast 没有注册任何联系人。

所有面板都有一个 Boxcollider 2D,Layermask 设置为 Everything(也仅尝试使用 UI)。我确信这一定是一个愚蠢的错误,我只是忽略了它,但我就是找不到它。 还有我的

Debug.DrawRay

功能也不起作用(Gizmos 已打开)。

public class Mouse : MonoBehaviour
{
    public LayerMask mask;

    void Start()
    {
    }

    void FixedUpdate()
    {
        Vector3 pos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0);
        transform.position = Camera.main.ScreenToWorldPoint(pos);


        RaycastHit2D hitup = Physics2D.Raycast(pos, Vector2.up, 10, mask);
        Debug.DrawRay(pos, Vector2.up * 3, Color.green);
        RaycastHit2D hitdown = Physics2D.Raycast(pos, Vector2.down, 10, mask);
        Debug.DrawRay(pos, Vector2.down * 3, Color.green);


        if (hitup)
        {
            Debug.Log("Hit something above");
            Debug.Log(hitup.collider.gameObject.name);
        }
        else if (hitdown)
        {
            Debug.Log("Hit something below");
            Debug.Log(hitdown.collider.gameObject.name);
        }

    }
}

这是附加到鼠标对象的鼠标脚本。

我想也许是因为Unity中的鼠标对象在z轴上为-10,但UI元素在z = 0上,所以我尝试将z设置为0,但由于某种原因这也不起作用,它不断重置为-10。

虽然我可能不会立即回答,因为我现在要去睡觉了,但非常感谢所有帮助,谢谢。

c# unity-game-engine game-development raycasting
1个回答
0
投票

对于初学者来说,使用物理学来设计 UI 是一种非常不理想的方法。而是把这些开销留给你的游戏物理。

物理系统也使用世界坐标,并且您还将鼠标位置转换为世界坐标,因此并不是调试光线投射不起作用,而是光线被投射到世界上的某个任意点。

您应该使用

GraphicsRaycaster
组件,该组件旨在将光线投射到 UI 元素上,例如自然会出现在面板上的图像组件。

最后,从鼠标投射光线来找到最近的面板是非常不可靠的,而且仍然不是最佳的。

这里提出了一个更好的解决方案:

当用户单击两个面板之间的空间时,循环遍历面板并将它们的

Y
位置与鼠标
Y
位置(对于垂直布局)进行比较,显然这样您就可以确定哪些面板位于面板的正上方和下方光标。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.