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

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

【Unity技术积累】人物移动 坦克式移动 WASD 动画相关推荐

  1. 【Unity技术积累】使用协程实现地刺动画

    使用协程实现路障动画效果. 路障本身是两个模型,我们要控制子模型进行上下位移. public class Spike : MonoBehaviour {private Transform splikO ...

  2. 【Unity技术积累】鼠标控制人物移动 导航系统 动画

    使用导航系统来实现鼠标点击控制人物移动 1. 导入素材 以小球机器人为例(Unity商店下载) 布置场景 2. 添加 Nav Mesh Agent 组件 更改红框里的参数即可 Steering 操纵 ...

  3. 【Unity技术积累】代码生成菱形地图

    技术要点: Resources 资源加载 Quaternion 四元数 Mathf 数学计算 1. 通过Resources动态加载方块 首先在 Project 面板中创建 Resources 文件夹, ...

  4. 【Unity技术积累】实现鼠标画线功能 LineRenderer

    using System.Collections; using System.Collections.Generic; using UnityEngine;public class Painting ...

  5. 【Unity技术积累】模拟FPS射击功能 射线检测

    public class Shoot : MonoBehaviour {RaycastHit hitInfo;void Update(){// 从相机的位置发射射线Ray ray = Camera.m ...

  6. 2011年度十大最具技术影响力人物

    年度十大最具技术影响力人物(国外篇) Dennis Ritchie 如果在Google上搜索Ritchie的简历,你会发现虽然有很多结果,但内容却相差无几.对于Ritchie的生平,我们能够确认的部分 ...

  7. 工作中如何做好技术积累

    引言 古人云:"活到老,学到老."互联网算是最辛苦的行业之一,"加班"对工程师来说已是"家常便饭",同时互联网技术又日新月异,很多工程师都疲 ...

  8. 美团大咖:程序员35岁前应做好的技术积累

    刘丁 读完需要 26 分钟 速读仅需 9 分钟 引言 古人云:"活到老,学到老."互联网算是最辛苦的行业之一,"加班"对工程师来说已是"家常便饭&qu ...

  9. 颠覆游戏开发,引领行业革命,从 Unite 2019 看 Unity 技术亮点

    在谈及 Unity 引擎时,或许不少开发者对其还停留在游戏开发的固有认知中.事实上,Unity 在"实时 3D 内容创作"的伟大航路上,已向更为广阔的全行业领域的星辰大海前进. 从 ...

最新文章

  1. 技术14期:关于深度学习中耳熟能详的Embedding
  2. hive的Specified key was too long; max key length is 767 bytes问题解决
  3. [BSidesSF2019]slashslash
  4. 从上往下打印出二叉树的每个节点,同层节点从左至右打印。
  5. 查看宝塔面板账号密码命令_宝塔面板升级到最新版图文教程
  6. style.width与offsetWidth的区别
  7. HBase基本概念与基本使用
  8. 为何我中断执行的线程不起作用,Why
  9. Linux网络管理相关命令详解
  10. win10读取linux硬盘,win10怎么读取lxext4格式硬盘
  11. C语言格式化输出日期时间
  12. Vue 2.x + Element后台模板开发教程(三)后台首页模板设计
  13. hive的distribute by应用
  14. 嵌入式作业STM32F103C8T6和stm32CubeMX实现LED灯
  15. SQL 基础(五)数据查询实战演练一
  16. 活跃地址下降,成交量大幅上涨,疑似青黄不接——陀螺财经周报第八期
  17. SSH Tunnel隧道
  18. Docker-入门基础知识(1)
  19. PostgreSQL全局替换字符串函数
  20. 获取三个数的中间值 宏

热门文章

  1. java-No route to host 解决办法
  2. c语言项目实战 —— 图书管理系统
  3. 用HBuilder插入图片、动态图、音乐、视频、上传文件
  4. Axure实战——实现登录注册功能
  5. 常见五轴机床的机械结构形式讲解!
  6. 直接启动htpp服务
  7. 心率检测实现报告(一)
  8. 工匠精神消失的手机2020:衰落、变局、绝唱、破圈
  9. 蒲香仲夏、专注字体全产业链接研究-江西字研#174;所隆重揭牌
  10. 18 | 需求管理:太多人给你安排任务,怎么办?