此笔记中的人物移动对标RPG游戏中的人物移动
首先,要知道什么是坦克式移动,个人的理解是通过不同的按键来决定人物的移动方向,想要向前走就要按下规定的按键,人物就会转向规定的方向再进行移动。
接下来就是主题了
1. Unity 实现人物移动
使用角色控制器(Character Controller)控制人物移动
以小球机器人为例(Unity商店下载)
导入机器人后添加 角色控制器组件(Character Controller) 并设置好相关参数
接下来就是实现移动的代码
创建脚本 PlayerMove
public class PlayerMove : MonoBehaviour
{
private CharacterController characterController;
private float speed = 4.4f;
void Start()
{
// 获取角色控制器组件
characterController = GetComponent<CharacterController>();
}
void Update()
{
// 水平移动 返回的值是浮点数 区间[-1,1],按A是-1 按D是1,正好对应左右
float h = Input.GetAxis("Horizontal");
// 垂直移动 返回的值是浮点数 区间[-1,1],按S是-1 按W是1,正好对应上下
float v = Input.GetAxis("Vertical");
// 使用角色控制器自带的 Move() 方法实现移动
characterController.Move(new Vector3(h, 0, v) * Time.deltaTime * speed);
}
}
Input.GetAxis() 方法官方API
CharacterController.Move() 方法官方API
基本的移动解决了,但是还要满足一个条件:人物转向,按下A键人物可以面朝左边,按下D可以朝右边。这样才是合格的人物移动,接下来继续吧!
解决人物转向问题
public class PlayerMove : MonoBehaviour
{
private CharacterController characterController;
private float speed = 4.4f;
private float turnSpeed = 14f; // 转向速度
void Start()
{
// 获取角色控制器组件
characterController = GetComponent<CharacterController>();
}
void Update()
{
// 水平移动 返回的值是浮点数 区间[-1,1],按A是-1 按D是1,正好对应左右
float h = Input.GetAxis("Horizontal");
// 垂直移动 返回的值是浮点数 区间[-1,1],按S是-1 按W是1,正好对应上下
float v = Input.GetAxis("Vertical");
// 使用角色控制器自带的 Move() 方法实现移动
characterController.Move(new Vector3(h, 0, v) * Time.deltaTime * speed);
if (h != 0 || v != 0)
{
Rotating(h, v);
}
}
void Rotating(float h,float v)
{
Vector3 targetDir = new Vector3(h, 0, v);
// 传入一个向量值使物体朝向向量方向
Quaternion targetRotation = Quaternion.LookRotation(targetDir, Vector3.up);
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, turnSpeed * Time.deltaTime);
}
}
Quaternion.Lerp() 方法官方API
Quaternion.# LookRotation() 方法官方API
移动告一段落,本人技术有限,四元数部分没有理解到位,无法解释原理。
接下来就是移动配合动画!
2. Unity 配合动画进行移动
创建动画控制器,并拖到机器人身上(需要把机器人默认Controller的删掉)。
双击 Robot 可以打开 Animator窗口
在左边创建需要用到的值,点击 + 号然后点击float创建下图的两个参数
拖入相关动画 Idle、Walk 并进行连线。想要创建多个三角形的连线只需要右键重复创建 Make Transition即可
从 Idle 到 Walk过渡的参数如下
从Walk 返回 Idle 参数如下
接下来就是代码的补充
public class PlayerMove : MonoBehaviour
{
private CharacterController characterController;
private Animator anim;
private float speed = 4.4f;
private float turnSpeed = 14f; // 转向速度
void Start()
{
// 获取角色控制器组件
characterController = GetComponent<CharacterController>();
anim = GetComponent<Animator>();
}
void Update()
{
// 水平移动 返回的值是浮点数 区间[-1,1],按A是-1 按D是1,正好对应左右
float h = Input.GetAxis("Horizontal");
// 垂直移动 返回的值是浮点数 区间[-1,1],按S是-1 按W是1,正好对应上下
float v = Input.GetAxis("Vertical");
// 使用角色控制器自带的 Move() 方法实现移动
characterController.Move(new Vector3(h, 0, v) * Time.deltaTime * speed);
if (h != 0 || v != 0)
{
Rotating(h, v);
}
anim.SetFloat("水平速度", h);
anim.SetFloat("垂直速度", v);
}
void Rotating(float h, float v)
{
Vector3 targetDir = new Vector3(h, 0, v);
// 传入一个向量值使物体朝向向量方向
Quaternion targetRotation = Quaternion.LookRotation(targetDir, Vector3.up);
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, turnSpeed * Time.deltaTime);
}
}
现在你的机器人就可以动了!
这个人物移动代码参考了以下视频
https://www.bilibili.com/video/BV1uq4y1Z7Fm?spm_id_from=333.999.0.0
此文章只是个人积累,如果有错误还请见谅,能帮助到你是我的荣幸!