如何将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
相关产品推荐
相关产品推荐

