You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不改变Vector3方向的前提下缩短向量?物体鼠标跟随需靠近相机

解决物体跟随鼠标且靠近相机的问题

你的核心问题是没搞清楚世界位置向量和方向向量的区别,直接对RaycastHit的位置做归一化/缩放是基于原点的操作,和相机位置无关,自然达不到靠近相机的效果。

正确实现思路

  1. 先通过鼠标射线获取与目标的交点(RaycastHit.point)
  2. 计算相机到该交点的方向向量(从相机指向交点)
  3. 缩短这个方向向量的长度,再从相机位置出发计算出新的位置

完整代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:40:34