【Unity技术积累】人物移动 & 坦克式移动 WASD & 动画

此笔记中的人物移动对标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

此文章只是个人积累,如果有错误还请见谅,能帮助到你是我的荣幸!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值