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/