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

如何将Unity现有移动脚本修改为基于Rigidbody实现以支持碰撞检测

完全基于Rigidbody实现的飞行控制脚本方案

前置准备

  • 给挂载该脚本的游戏对象添加Rigidbody组件
  • 按需调整Rigidbody参数:飞行模式建议关闭Use Gravity,同时勾选Constraints下的Freeze Rotation的X、Y、Z三个轴,避免物理碰撞导致视角不受控偏移

修改后完整代码

using UnityEngine;

public class Fly : MonoBehaviour
{
    public float moveSpeed = 10f;
    public float rotateSensitivity = 0.5f; // 对应原代码的旋转灵敏度系数
    private Rigidbody _rb;
    private Vector2 _rotateInput;
    private bool _isPressMove;
    private Vector3 _currentEulerAngles;

    void Start()
    {
        _rb = GetComponent<Rigidbody>();
        // 初始化欧拉角为当前物体的初始旋转值
        _currentEulerAngles = transform.eulerAngles;
    }

    void Update()
    {
        // 输入检测放在Update里避免漏判按键
        _isPressMove = Input.GetKey(KeyCode.Space);
        _rotateInput.x = Input.GetAxis("Horizontal");
        _rotateInput.y = Input.GetAxis("Vertical");
    }

    private void FixedUpdate()
    {
        // 处理旋转逻辑
        _currentEulerAngles.y += _rotateInput.x;
        _currentEulerAngles.x -= _rotateInput.y * rotateSensitivity;
        // 用Rigidbody的MoveRotation方法实现旋转,符合物理系统规范
        _rb.MoveRotation(Quaternion.Euler(_currentEulerAngles));

        // 处理移动逻辑
        if (_isPressMove)
        {
            // 沿自身正前方移动,和原transform.Translate效果一致
            _rb.velocity = transform.forward * moveSpeed;
        }
        else
        {
            // 松开空格立刻停下,和原逻辑表现一致
            _rb.velocity = Vector3.zero;
        }
    }
}

关键改动说明

  • 所有物理相关的操作(旋转、移动)全部放在FixedUpdate中执行,适配Unity物理系统的更新频率,避免碰撞检测异常、卡顿等问题
  • 旋转使用Rigidbody自带的MoveRotation方法实现,不再直接修改transform属性,保证物理交互正常
  • 移动直接设置Rigidbody的速度为自身朝向的前进速度,表现和原transform.Translate完全一致,同时支持碰撞检测
  • 如果希望移动带惯性效果,可以把直接设velocity的逻辑改成_rb.AddRelativeForce(Vector3.forward * moveSpeed),按需调整即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:36:04