【问题标题】:How can I use raycasthit according to the mouse cursor position?如何根据鼠标光标位置使用 raycasthit?
【发布时间】:2018-01-20 01:49:06
【问题描述】:
public Camera mapCamera;

private Camera[] cameras;
private GameObject mouseOvered;

void Update()
    {
        if (Input.GetKeyDown(KeyCode.M))
        {
            if (mapCamera.enabled == false)
            {
                foreach (Camera cam in cameras)
                {
                    cam.enabled = false;
                }
                mapCamera.enabled = true;
            }
            else
            {
                foreach (Camera cam in cameras)
                {
                    cam.enabled = true;
                }
                mapCamera.enabled = false;
            }
        }

        bool rcHit = false;
        Vector3 mouse = Input.mousePosition;
        Ray castPoint = mapCamera.ScreenPointToRay(mouse);
        RaycastHit hit;
        Debug.DrawRay(mapCamera.transform.position, 
        mapCamera.transform.forward * Mathf.Infinity, Color.magenta);
        if (Physics.Raycast(castPoint, out hit, Mathf.Infinity))
        {
            rcHit = true;
        if (mouseOvered != hit.collider.gameObject)
        {
            mouseOvered = hit.collider.gameObject;
        }
        print(mouseOvered.name);
        //do your thing here to apply/change the material
    }
    if (!rcHit && mouseOvered != null)
    {
        //do your thing to undo the material change
        mouseOvered = null;
    }
   }

问题是当我运行游戏时,如果我将 Debug.DrawRay 表格 Mathf.Infinity 更改为 1000 并且它没有根据鼠标光标位置移动,我仍然会看到光线投射激光。我正在移动鼠标光标,但光线投射激光似乎停留在同一个地方,所以我猜它只击中特定的地方/物体而不是所有东西?不知道发生了什么。

如果我使用的是 Mathf.Infinity,我根本看不到光线投射的激光。 当我在空间站周围移动鼠标光标时,只有当它检测到物体并打印它的名字时。

我想要做的是当我移动鼠标光标时,当它碰到空间站的任何物体时打印它的名字。

仅当我将这一行更改为 1000 时,我才会看到洋红色:

Debug.DrawRay(mapCamera.transform.position, mapCamera.transform.forward * 1000, Color.magenta);

如果是 Mathf.Infinity,我看不到任何洋红色激光。

【问题讨论】:

    标签: c# unity3d unity5


    【解决方案1】:

    光线投射本身没有任何问题,问题仅在于您绘制的内容。您不绘制 射线,而是从相机位置沿其前向矢量绘制 一个“射线”。

    替换

    Debug.DrawRay(mapCamera.transform.position, mapCamera.transform.forward * Mathf.Infinity, Color.magenta);
    

    Debug.DrawRay(castPoint.origin, castPoint.direction * Matf.Infinity, Color.magenta);
    

    我不确定乘以无穷大是否可行。对于大多数场景来说,大约 1000 个单位(甚至可能使用 mapCamera.farClipPlane,因为玩家不太可能想在它之外选择一些东西)应该(超过)足够的。

    【讨论】:

    • 我更改了调试行,现在射线随着鼠标移动。我在两个地方也从 Mathf.Infinity 更改为 1000。但它似乎不准确。我的意思是我正在四处移动鼠标光标,但我看到 Ray magenta 激光不在鼠标光标所在的位置,而且它并没有一直击中空间站上的正确物体。我需要移动鼠标光标很多才能让它命中。
    • 光线投射的代码对我来说看起来非常好。也许出于调试原因尝试将一些 GameObject 移动到 hit.point?你知道,比如一些 Cube 或 Sphere 或 smthg?!
    • 您遇到的奇怪现象可能与您在“光线投射”中进行的检查有关。如果它击中你设置 mouseOvered 如果它与当前的 hit.collider.GameObject 不同,但如果它没有击中你永远不会取消它。
    • 在我正在做的检查中:if (!rcHit && mouseOvered != null) 并且在里面我将 mouseOvered 设置为 null。我应该把它设置成什么?
    • 我没有找到任何解决方案,为什么它只是有时会检测到物体。我将不得不制作一个新的完整项目,并用一个/两个对象和一个相机检查新的干净项目,看看它是否可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多