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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:12:24