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

如何阻止Unity相机穿透物体?附相机移动脚本

嘿,我注意到你贴了这个SmoothMouseLook的Unity相机控制脚本,还说翻了一堆相关问题都没找到适配自己需求的方案。先别愁,咱们先从你现有的代码基础出发,给你几个常见的优化和问题排查方向,要是你能补充下具体遇到的问题(比如是多人同步卡、鼠标旋转不流畅还是相机跟随出问题),我还能给你更精准的解决办法:

针对你的Smooth Mouse Look脚本的核心调整方案

1. 先解决多人同步的坑(你用了NetworkBehaviour)

做多人游戏时,相机控制绝对不能在服务端执行,必须加上本地玩家判断,不然会出现所有客户端相机同步乱转的问题:

void Update()
{
    // 只在本地玩家身上跑相机逻辑
    if (!isLocalPlayer) return;
    // 你的鼠标旋转、相机跟随代码都放在这里面
}

另外,建议别把相机直接挂在带有NetworkBehaviour的玩家对象上,最好单独给相机做本地控制,只同步玩家的旋转角度给其他客户端就行。

2. 优化相机看向目标的平滑逻辑

你代码里的public Transform应该是相机要始终看向的目标(比如玩家头部)吧?可以试试这个更稳定的平滑看向写法:

public Transform lookAtTarget;
public float smoothLookSpeed = 5f;

void LateUpdate()
{
    if (!isLocalPlayer || lookAtTarget == null) return;
    
    // 计算目标方向,可选锁定Y轴避免水平旋转受抬头低头影响
    Vector3 targetDirection = lookAtTarget.position - transform.position;
    targetDirection.y = 0; 
    
    Quaternion targetRotation = Quaternion.LookRotation(targetDirection);
    // 用Lerp做平滑插值,避免生硬跳转
    transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, smoothLookSpeed * Time.deltaTime);
}

3. 修复鼠标输入的平滑与灵敏度问题

很多这类脚本会出现鼠标延迟或者灵敏度失控的情况,调整输入处理逻辑试试:

public float mouseSensitivity = 2f;
public float smoothMouseSpeed = 3f;
private Vector2 currentMouseInput;
private Vector2 smoothMouseInput;

void Update()
{
    if (!isLocalPlayer) return;
    
    // 获取原始鼠标输入
    currentMouseInput = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")) * mouseSensitivity;
    // 用Lerp做输入平滑,减少抖动
    smoothMouseInput = Vector2.Lerp(smoothMouseInput, currentMouseInput, smoothMouseSpeed * Time.deltaTime);
    
    // 应用旋转:玩家对象负责水平旋转,相机单独负责上下旋转(避免万向锁)
    transform.Rotate(Vector3.up, smoothMouseInput.x);
    if (myCamera != null)
    {
        myCamera.transform.Rotate(Vector3.left, smoothMouseInput.y);
        // 可选:限制相机上下旋转角度,避免抬头低头过度
        var currentCamRot = myCamera.transform.localEulerAngles;
        currentCamRot.x = Mathf.Clamp(currentCamRot.x, -80f, 80f);
        myCamera.transform.localEulerAngles = currentCamRot;
    }
}

4. 确保相机引用正确初始化

别忘了解决myCamera的赋值问题,避免空引用报错:

void Awake()
{
    // 如果相机是当前对象的子物体,自动查找赋值
    if (myCamera == null)
        myCamera = GetComponentInChildren<Camera>();
}

要是你能说清楚具体需求(比如要实现第三人称肩扛相机、第一人称平滑旋转,还是解决多人模式下的相机不同步),我可以给你更贴合的修改方案!

内容的提问来源于stack exchange,提问作者Aleksa Ristic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:45:56