【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
此文章只是个人积累,如果有错误还请见谅,能帮助到你是我的荣幸!
【Unity技术积累】人物移动 坦克式移动 WASD 动画相关推荐
- 【Unity技术积累】使用协程实现地刺动画
使用协程实现路障动画效果. 路障本身是两个模型,我们要控制子模型进行上下位移. public class Spike : MonoBehaviour {private Transform splikO ...
- 【Unity技术积累】鼠标控制人物移动 导航系统 动画
使用导航系统来实现鼠标点击控制人物移动 1. 导入素材 以小球机器人为例(Unity商店下载) 布置场景 2. 添加 Nav Mesh Agent 组件 更改红框里的参数即可 Steering 操纵 ...
- 【Unity技术积累】代码生成菱形地图
技术要点: Resources 资源加载 Quaternion 四元数 Mathf 数学计算 1. 通过Resources动态加载方块 首先在 Project 面板中创建 Resources 文件夹, ...
- 【Unity技术积累】实现鼠标画线功能 LineRenderer
using System.Collections; using System.Collections.Generic; using UnityEngine;public class Painting ...
- 【Unity技术积累】模拟FPS射击功能 射线检测
public class Shoot : MonoBehaviour {RaycastHit hitInfo;void Update(){// 从相机的位置发射射线Ray ray = Camera.m ...
- 2011年度十大最具技术影响力人物
年度十大最具技术影响力人物(国外篇) Dennis Ritchie 如果在Google上搜索Ritchie的简历,你会发现虽然有很多结果,但内容却相差无几.对于Ritchie的生平,我们能够确认的部分 ...
- 工作中如何做好技术积累
引言 古人云:"活到老,学到老."互联网算是最辛苦的行业之一,"加班"对工程师来说已是"家常便饭",同时互联网技术又日新月异,很多工程师都疲 ...
- 美团大咖:程序员35岁前应做好的技术积累
刘丁 读完需要 26 分钟 速读仅需 9 分钟 引言 古人云:"活到老,学到老."互联网算是最辛苦的行业之一,"加班"对工程师来说已是"家常便饭&qu ...
- 颠覆游戏开发,引领行业革命,从 Unite 2019 看 Unity 技术亮点
在谈及 Unity 引擎时,或许不少开发者对其还停留在游戏开发的固有认知中.事实上,Unity 在"实时 3D 内容创作"的伟大航路上,已向更为广阔的全行业领域的星辰大海前进. 从 ...
最新文章
- 技术14期:关于深度学习中耳熟能详的Embedding
- hive的Specified key was too long; max key length is 767 bytes问题解决
- [BSidesSF2019]slashslash
- 从上往下打印出二叉树的每个节点,同层节点从左至右打印。
- 查看宝塔面板账号密码命令_宝塔面板升级到最新版图文教程
- style.width与offsetWidth的区别
- HBase基本概念与基本使用
- 为何我中断执行的线程不起作用,Why
- Linux网络管理相关命令详解
- win10读取linux硬盘,win10怎么读取lxext4格式硬盘
- C语言格式化输出日期时间
- Vue 2.x + Element后台模板开发教程(三)后台首页模板设计
- hive的distribute by应用
- 嵌入式作业STM32F103C8T6和stm32CubeMX实现LED灯
- SQL 基础(五)数据查询实战演练一
- 活跃地址下降,成交量大幅上涨,疑似青黄不接——陀螺财经周报第八期
- SSH Tunnel隧道
- Docker-入门基础知识(1)
- PostgreSQL全局替换字符串函数
- 获取三个数的中间值 宏