如何根据鼠标光标位置使用raycasthit?

时间:2018-01-19 17:14:34

标签: c# unity3d unity5

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,我看不到激光的任何品红色。

Mag

1 个答案:

答案 0 :(得分:1)

光线投射本身没有任何问题,问题仅在于你所绘制的内容。你不要绘制 Ray,但 a " Ray"从相机位置沿其前向矢量。

替换

{ $project:{ _id:0, timestamp:"$_id.timestamp", contract:1, count:1 }}

使用

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

我不确定乘以无穷大是否有效。类似1000个单位(甚至可能使用Debug.DrawRay(castPoint.origin, castPoint.direction * Matf.Infinity, Color.magenta); ,因为它不太可能是玩家想要在其外面挑选一些东西)应该(超过)足以满足大多数场景。