Unity鼠标跟随物体问题:鼠标移出相机范围时停止跟随
解决Unity鼠标移出相机范围时停止物体跟随的问题
嘿,我来帮你搞定这个问题!核心思路是判断鼠标位置是否处于相机的可视范围内,只有在范围内的时候才让物体继续跟随鼠标。
Unity里可以用Camera.ScreenToViewportPoint(Input.mousePosition)来获取鼠标的视口坐标——视口坐标的x和y值范围都是0到1,超出这个范围就说明鼠标已经移出相机画面了。
下面是修改后的完整代码,我补全了你没写完的部分,同时加入了鼠标范围判断:
private Vector3 _target; public Camera Camera; public bool FollowMouse; public bool ShipAccelerates; public float ShipSpeed = 2.0f; public float offset = 0.0f; public void OnEnable() { if (Camera == null) throw new InvalidOperationException("Camera not set"); } public void Update() { // 先判断鼠标是否在相机视口范围内 Vector3 mouseViewportPos = Camera.ScreenToViewportPoint(Input.mousePosition); bool isMouseInCamera = mouseViewportPos.x >= 0 && mouseViewportPos.x <= 1 && mouseViewportPos.y >= 0 && mouseViewportPos.y <= 1; // 只有当鼠标在相机内,并且满足FollowMouse或按住左键的条件时,才更新目标位置 if (isMouseInCamera && (FollowMouse || Input.GetMouseButton(0))) { // 将鼠标屏幕坐标转换为世界坐标,添加offset控制Z轴(根据你的需求调整) _target = Camera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, offset)); // 让物体向目标移动 if (ShipAccelerates) { // 如果有加速逻辑,这里可以写对应的处理 transform.position = Vector3.MoveTowards(transform.position, _target, ShipSpeed * Time.deltaTime); } else { transform.position = Vector3.Lerp(transform.position, _target, ShipSpeed * Time.deltaTime); } } // 如果鼠标移出相机,物体就停止跟随,保持当前位置 }
关键细节说明:
ScreenToViewportPoint:把屏幕坐标(像素)转换成相机视口的相对坐标,这样不管屏幕分辨率是多少,都能准确判断鼠标是否在画面内。- 你可以根据需求调整边界判断的阈值,比如把
0改成0.02f,1改成0.98f,避免鼠标刚碰到边缘就停止跟随的生硬感。 offset参数用来控制物体在Z轴上的位置,确保它在相机的可视范围内(如果是2D项目,通常设置成相机的远裁剪面到物体的距离)。
内容的提问来源于stack exchange,提问作者Anghelina Guznac
相关产品推荐
相关产品推荐

