736 字
4 分钟
【Unity小白教程】用刚体和DOTween做一个丝滑的八向移动

准备工作#

  • 一个八核十六线程的脑子

  • 一个Unity(笔者版本为2022.x),一个DOTween插件(Assetstore免费,链接:AssetStore下载

  • 你大概还需要这么一个东西,Player的图片(如下图)

正式开始#

随便创建一个GameObject,添加SpriteRenderer脚本,将SpriteRenderer脚本上的Sprite赋值为Player的图片(我的Player图片名字叫Player-White)

创建一个C#脚本并命名为PlayerController,开始编写代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;//DOTween插件命名空间
public class PlayerController : MonoBehaviour
{
public float MaxSpeed, Speed;//最大移动速度/当前移动速度
public Vector2 Raw_Axis = Vector2.zero;//玩家输入向量
Vector2 Rot_Axis = Vector2.zero;//下面处理旋转会用到的输入向量
private Rigidbody2D _rb;//玩家刚体组件
void Start()
{
Speed = MaxSpeed;//初始化Speed
_rb = GetComponent<Rigidbody2D>();//初始化刚体组件
}
void Update()
{
//处理玩家输入,用GetAxis获取玩家当前输入的方向
//Horizontal是水平轴(WASD中的A,D键,方向键中的左右键)
//Vertical是垂直轴(WASD中的W,D键,方向键中的上下键)
Raw_Axis = Vector2.right * Input.GetAxisRaw("Horizontal") + Vector2.up * Input.GetAxisRaw("Vertical");
transform.DORotate(Rotate(), 0.1f);//DORotate:DOtween插件方法,前一个参数是Vector3向量,代表旋转到哪里,第二个参数是旋转所耗费的时间
}
void FixedUpdate()
{
if (Raw_Axis != Vector2.zero)//判断用户是否进行输入
{
_rb.velocity = Raw_Axis * Speed * Time.fixedDeltaTime + (IsSpring ? Raw_Axis * Spring * Time.fixedDeltaTime : Vector2.zero);//刚体移动
Rot_Axis = Raw_Axis;//将旋转输入向量赋值
}
else
{
_rb.velocity = Vector2.zero;//刚体速度归零
//注意此时并没有将Rot_Axis赋值,也就是当玩家第一次输入后,Rot_Axis始终保持着有值状态
}
}
Vector3 Rotate()//旋转方法,返回一个向量表示旋转值
{
int x = (int)Rot_Axis.x;//旋转向量的x轴
int y = (int)Rot_Axis.y;//旋转向量的y轴
if (x == 0 && y == 0) return Vector3.zero;//玩家没有输入,此时保持原来的旋转(向上)
if (x == 1 && y == 0) return Vector3.forward * -90;//玩家按下D/→键,此时旋转负九十度(向右)
if (x == -1 && y == 0) return Vector3.forward * 90;//玩家按下A/←键,此时旋转九十度(向左)
if (x == 0 && y == 1) return Vector3.zero;//玩家没有输入,此时保持原来的旋转(向上)
if (x == 0 && y == -1) return Vector3.forward * 180;//玩家按下S/↓键,此时旋转180度(向下)
if (x == 1 && y == 1) return Vector3.forward * -45;//玩家按下W和D键(或者↑和→键)此时旋转负45度(向右上)
if (x == -1 && y == -1) return Vector3.forward * 135;//玩家按下S和A键(或者↓和←键)此时旋转135度(向左下)
if (x == 1 && y == -1) return Vector3.forward * -135;//玩家按下S和D键(或者↓和→键)此时旋转负135度(向右下)
if (x == -1 && y == 1) return Vector3.forward * 45;//玩家按下A和W键(或者上和←键)此时旋转负45度(向左上)
return Vector3.zero;//都不是,保持原来的旋转(向上)
}
}
【Unity小白教程】用刚体和DOTween做一个丝滑的八向移动
https://fuwari.vercel.app/posts/cv0005/
作者
丘比女王
发布于
2025-08-12
许可协议
CC BY-NC-SA 4.0