如何在不改变Vector3方向的前提下缩短向量?物体鼠标跟随需靠近相机
解决物体跟随鼠标且靠近相机的问题
你的核心问题是没搞清楚世界位置向量和方向向量的区别,直接对RaycastHit的位置做归一化/缩放是基于原点的操作,和相机位置无关,自然达不到靠近相机的效果。
正确实现思路
- 先通过鼠标射线获取与目标的交点(RaycastHit.point)
- 计算相机到该交点的方向向量(从相机指向交点)
- 缩短这个方向向量的长度,再从相机位置出发计算出新的位置
完整代码示例
using UnityEngine; public class FollowMouseCloser : MonoBehaviour { public Transform targetObject; // 要跟随的物体 public float distanceScale = 0.5f; // 距离缩放系数,小于1则靠近相机 void Update() { Camera mainCam = Camera.main; if (mainCam == null) return; Ray ray = mainCam.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) { // 计算相机到交点的方向向量 Vector3 camToHitDirection = hit.point - mainCam.transform.position; // 计算缩短后的距离 float adjustedDistance = camToHitDirection.magnitude * distanceScale; // 得到靠近相机的新位置 Vector3 newPos = mainCam.transform.position + camToHitDirection.normalized * adjustedDistance; targetObject.transform.position = newPos; } } }
修正你的测试代码
你原来的测试代码逻辑错误,修正后可以直观看到效果:
Vector3 cameraPos = new Vector3(1, 4, 5); // 模拟相机位置 Vector3 hitPoint = new Vector3(1, 2, 3); // 模拟射线交点 // 计算相机到交点的方向 Vector3 dir = hitPoint - cameraPos; // 缩短到原距离的一半 Vector3 closerPos = cameraPos + dir.normalized * (dir.magnitude * 0.5f); Gizmos.color = Color.red; Gizmos.DrawLine(cameraPos, hitPoint); // 原交点位置 Gizmos.color = Color.green; Gizmos.DrawLine(cameraPos, closerPos); // 靠近相机的位置
关键说明
- 不要直接对
RaycastHit.point做归一化/除法:这个值是世界空间的位置,归一化后会变成指向原点的单位向量,完全偏离你的需求 - 所有距离调整都要基于相机到交点的方向,这样才能保证物体始终在鼠标射线方向上,且靠近相机
内容的提问来源于stack exchange,提问作者Volodymyr Mykulaninets
相关产品推荐
相关产品推荐

