如何跟随鼠标位置

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 作为参数,它会隐式转换为Vector3z = 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);
    

【讨论】:

这真的很好用!非常感谢!

以上是关于如何跟随鼠标位置的主要内容,如果未能解决你的问题,请参考以下文章

鼠标跟随器缓入/缓出

Unity让物体跟随鼠标移动

Unity让物体跟随鼠标移动

JS之鼠标跟随

如何让 ToolTip 跟随鼠标?

用js控制div跟随鼠标移动,鼠标点击后,鼠标离开,div留在当前点击的位置怎么做