一、GetMousePosition函数
GetMousePosition函数 是Unity内置的获取鼠标位置的函数。这个函数将返回一个二维向量,向量的x坐标将是屏幕上的像素值,而y则是反向的数值,所以要通过二次计算得到正常的y坐标。
//代码示例 Vector3 mousePos = Input.mousePosition; mousePos.z = Camera.main.nearClipPlane; Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);
注意: 因为鼠标控制在屏幕上的像素值很小,所以在使用屏幕坐标与世界坐标进行转换的时候,需要使用相机的nearClipPlane来代替z轴坐标值。
二、Event函数
Event函数 可以通过创建一个Event对象并搜集信息,来获取鼠标位置。这个方法的好处是能够区分鼠标的左键、右键和滚轮
//代码示例 void Update() { Event e = Event.current; if (e.button == 0 && e.type == EventType.MouseDown) { Vector2 pos = e.mousePosition; } }
注意: 如果Event.current的eventType不是mouse事件,那么Event.mousePosition将会是一个无用的值。
三、ScreenToWorldPoint函数
ScreenToWorldPoint函数 可以将鼠标位置的2D像素值转化为3D空间中的世界坐标。这个函数使用Camera对象的position来计算世界坐标。
//代码示例 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) { Debug.Log(hit.point); }
注意: 在使用ScreenToWorldPoint函数时,需要进行矩阵变换的计算,并指定管线矩阵变换的模式。
四、RayCast函数
RayCast函数 可以根据当前鼠标指针的位置从摄像机发射一条射线,并返回首次进行碰撞的物体的信息。这个函数可以返回一个 RaycastHit 结构的结果,从而获取该点的相关信息,如碰撞情况等。
//代码示例 void Update() { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, 100)) { Debug.Log("Object Hit"); } } }
注意: 在使用RayCast函数时,需要指定起始点和方向,并将结果存储到 RaycastHit 结构体中。
五、MouseEvent
MouseEvent在鼠标事件被触发时,将触发关联的方法或函数。这个方法可以作为另一种获取鼠标位置的方法,而不是使用Input.MousePosition。MouseEvent将把鼠标位置信息作为一个参数传递给函数,从而处理鼠标位置信息。
//代码示例 void OnMouseDown() { Vector3 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); }
注意: 在使用MouseEvent时,需要让函数成为一个交互器,如鼠标单击事件等。
六、总结
从本文可以看出,Unity获取鼠标位置的方法是多样化的。你可以使用GetMousePosition函数,Event函数,ScreenToWorldPoint函数,RayCast函数和MouseEvent函数等,在不同的需求情况下选择最合适的方法。希望这篇文章能够帮你加深对Unity鼠标位置获取的理解和应用。