如何跟随鼠标位置
Posted
技术标签:
【中文标题】如何跟随鼠标位置【英文标题】:How to follow mouse position 【发布时间】:2022-01-15 06:19:23 【问题描述】:您好,我有一个问题,我们可以在新的输入系统中像这样跟随鼠标位置 2d 游戏
void Update()
transform.position = position;
public void OnMouseMove(InputAction.CallbackContext context)
if(playerHealth.health>0)
position= Camera.main.ScreenToWorldPoint(context.ReadValue<Vector2>());
它的工作正常正像摄影机,但 当我转换透视相机不起作用 我需要那个透视相机……那我该怎么做呢
【问题讨论】:
Camera.main.ScreenToWorldPoint
需要一个Vector3
,其中z
组件定义了与相机的距离,因此该点在您的世界中应该在相机前方多远。如果您使用Vector2
作为参数,它会隐式转换为Vector3
和z = 0
-> 位置与相机的深度相同。对于正交相机,这并不重要,但对于透视相机,这会根据透视角度导致错误的位置
【参考方案1】:
下面是this previous answer I wrote的编辑版本。
正如上面评论中提到的,注意ScreenToWorldPoint
还需要一个Z
组件
屏幕空间位置(通常是鼠标 x、y),加上 z 位置作为深度(例如,相机剪裁平面)。
指示该点应投影到世界上与给定Camera
的距离。
为了克服这个问题,您可以使用数学Plane
,这样您就可以在Plane.Raycast
中使用ScreenPointToRay
在对象旁边投射一个点(这是一种数学光线投射,与物理或物理无关)碰撞检测)
// In general store the camera reference as Camera.main is very expensive!
[SerializeField] Camera camera;
void Start()
camera = Camera.main;
// ...
public void OnMouseMove(InputAction.CallbackContext context)
if(playerHealth.health > 0)
var plane = new Plane(camera.transform.forward, transform.position);
var ray = camera.ScreenPointToRay(context.ReadValue<Vector2>());
plane.Raycast(ray, out var hitDistance);
position = ray.GetPoint(hitDistance);
【讨论】:
这真的很好用!非常感谢!以上是关于如何跟随鼠标位置的主要内容,如果未能解决你的问题,请参考以下文章