Unity开发:如何实现Sprite沿自身旋转方向移动
Unity 2D Sprite沿自身旋转方向移动实现方案
现有代码问题
- 移动逻辑固定修改世界坐标系Y轴速度,和物体自身旋转角度完全无关,所以只会向上飞不会跟着朝向转向
- 刚体的速度、旋转属于物理计算逻辑,写在
Update里会和物理帧不同步,容易出现移动抖动、旋转延迟 - 原旋转逻辑每帧固定增减2度,没有乘以
Time.deltaTime,会导致转速随设备帧率变化,高帧率下转得极快,低帧率下转得慢
实现原理
2D物体旋转后,transform.up会自动返回物体自身Y轴正方向(即物体当前朝向)的单位向量,将这个向量乘以移动速度赋值给刚体速度,就能让物体始终沿着头部朝向移动。所有刚体相关的物理操作统一放到FixedUpdate中执行,保证物理计算帧率稳定。
修正后完整代码
using UnityEngine; public class PlayerControl : MonoBehaviour { public float moveSpeed = 13f; public float rotateSpeed = 120f; public Rigidbody2D rigidBody2D; private float currentRotation; void Start() { rigidBody2D = GetComponent<Rigidbody2D>(); currentRotation = rigidBody2D.rotation; } void Update() { // 输入检测放在Update中,避免按键输入丢失 if(Input.GetKey(KeyCode.A)){ currentRotation += rotateSpeed * Time.deltaTime; } if(Input.GetKey(KeyCode.D)){ currentRotation -= rotateSpeed * Time.deltaTime; } } void FixedUpdate() { // 物理操作统一在FixedUpdate执行 rigidBody2D.rotation = currentRotation; if(Input.GetKey(KeyCode.W)){ rigidBody2D.velocity = transform.up * moveSpeed; } else { // 不需要惯性就保留,要滑行效果就删掉这个else分支,给刚体设置Linear Drag参数模拟阻尼 rigidBody2D.velocity = Vector2.zero; } } }
适配注意事项
- 如果你的飞船Sprite素材默认船头朝右(X轴正方向),把移动代码里的
transform.up替换成transform.right即可 - 需要保留惯性滑行效果的话,除了删掉速度清零的代码,还可以在Rigidbody2D组件面板调整
Linear Drag参数,数值越小滑行距离越长 - 不要直接在脚本里每帧修改
transform.rotation控制2D刚体旋转,会触发刚体位置重新计算,导致碰撞检测异常,统一通过修改Rigidbody2D的rotation属性控制旋转
内容的提问来源于stack exchange,提问作者Kajus Rudokas
相关产品推荐
相关产品推荐

