Unity调用WorldToScreenPoint返回过大数值,物体跟随光标功能异常
问题核心原因
你调用Unity相机坐标转换API的逻辑完全颠倒了:
Camera.WorldToScreenPoint的作用是接收世界坐标系下的三维坐标,返回该点映射到屏幕坐标系的坐标值。你传入的Input.mousePosition本身就属于屏幕坐标,输入参数类型完全不匹配,自然会返回不符合预期的异常数值。- 实现物体跟随光标需要使用相反的API:
Camera.ScreenToWorldPoint,作用是将屏幕坐标转换为对应世界坐标系下的坐标,才能直接赋值给物体的transform.position属性。
现存代码额外错误
- 你手动修改了
mousePos变量的Z值,但调用API时传入的仍然是原始未修改Z值的Input.mousePosition,修改后的Z值完全没有生效。 - 屏幕坐标转世界坐标时,Z值需要设置为相机到目标物体在世界坐标系下的轴向距离,不能随意设置为-1:如果使用正交相机,Z值可以保持和你期望物体停留的世界Z轴值匹配;如果使用透视相机,需要确保Z值大于相机的近裁剪面距离。
修正后的参考代码
Camera cam; void Start() { cam = Camera.main; } void Update() { Vector3 mousePos = Input.mousePosition; // 示例:假设相机世界Z值为-10,期望物体在世界Z=0位置,此处填10即可,可根据你的需求调整 mousePos.z = 10f; Vector3 targetWorldPos = cam.ScreenToWorldPoint(mousePos); transform.position = targetWorldPos; }
关于4:3纵横比的说明
屏幕纵横比不会对坐标转换API的计算逻辑造成异常影响,只要相机视口设置适配当前屏幕,转换过程会自动适配当前分辨率与纵横比参数。
内容的提问来源于stack exchange,提问作者ChrisPBcn
相关产品推荐
相关产品推荐

