【问题标题】: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 -> 位置与相机的深度相同。对于正交相机,这并不重要,但对于透视相机,这会根据透视角度导致错误的位置

标签: c# unity3d


【解决方案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);
    }
}

【讨论】:

  • 这真的很好用!非常感谢!
猜你喜欢
  • 2014-06-23
  • 2016-07-02
  • 1970-01-01
  • 2016-12-27
  • 2020-09-02
  • 2018-11-01
  • 1970-01-01
  • 2015-01-12
  • 2011-11-08
相关资源
最近更新 更多