目录
1 不同状态之间的切换模式
1.1 在1个连续状态和一个连续状态之间的transition,使用trigger
1.2 在2个连续状态之间的转换,使用bool值切换转换
2 至少现在有2种角色的移动控制方式
2.1 用CharacterController 控制角色的移动
2.2 用animator1 控制角色移动
2.3 共同特点, WASD键盘控制可以通过这2个轴形成的向量的方法实现
3 代码控制移动动画的播放
3.1 检测WASD移动,用轴向量的代码实现
3.2 按键改变面向
3.3 播放动画
3.4 移动
3.5 Animator的设置
3.5.1 动作状态的设置
3.5.2 设置好新的参数
3.5 完整代码
3.6 小心难缠的BUG
1 不同状态之间的切换模式
- 1个连续状态和一个连续状态之间的transition,使用trigger触发那个一次性状态即可
- 2个连续状态之间的转换,使用bool值,在2个连续状态之间进行转换
1.1 在1个连续状态和一个连续状态之间的transition,使用trigger
- 不勾选wave参数时,始终执行run
- 勾选了wave参数时,相当于满足了一次 wave的trigger触发条件
- 可以看到会执行一次wave动作
- 使用trigger来触发单次的动作
1.2 在2个连续状态之间的转换,使用bool值切换转换
- 2个连续状态之间的转换
- 因为2个状态都是连续的,所以任何一个状态都能持续
- 使用bool值,在2个连续状态之间进行转换
2 至少现在有2种角色的移动控制方式
- 角色控制器 CharacterController
- 控制角色的移动动画 Animator
2.1 用CharacterController 控制角色的移动
- 需要角色上有CharacterController 的component
private CharacterController player1;
player1=GetComponent<CharacterController>();
void Update()
{
//水平轴
float horizontal=Input.GetAxis("Horizontal");
//垂直轴
float vertical=Input.GetAxis("Vertical");
//创建成一个方向向量
Vector3 dir1=new Vector3(horizontal,0,vertical);
Debug.DrawRay(transform.position,dir1,Color.red);
//
player1.SimpleMove(dir1);
//player1.transform.Translate(dir1*2.0f*Time.deltaTime);
player1.Move(dir1*moveSpeed*Time.deltaTime);
}
}
2.2 用animator1 控制角色移动
- 需要角色上有animator的component
- animator 吧动画state设置好
- 且角色模型有不同的动作
private Animator animator1;
animator1=GetComponent<Animator>();void Update()
{
float horzontal=Input.GetAxis("Horizontal");
float vetical=Input.GetAxis("Vertical");
Vector3 dir1=new Vector3(horzontal,0,vetical);
Debug.DrawRay(transform.position,dir1,Color.red);
//如果按下了移动按键
if(dir1 != Vector3.zero)
{
//面向向量
transform.rotation=Quaternion.LookRotation(dir1);
//播放跑步动画
animator1.SetBool("IsRun",true);
//朝着面向的前方移动
//transform.Translate(Vector3.forward*2*Time.deltaTime);
2.3 共同特点, WASD键盘控制可以通过这2个轴形成的向量的方法实现
float horzontal=Input.GetAxis("Horizontal");
float vetical=Input.GetAxis("Vertical");
Vector3 dir1=new Vector3(horzontal,0,vetical);
3 代码控制移动动画的播放
3.1 检测WASD移动,用轴向量的代码实现
float horzontal=Input.GetAxis("Horizontal");
float vetical=Input.GetAxis("Vertical");
Vector3 dir1=new Vector3(horzontal,0,vetical);
3.2 按键改变面向
- 可以实现原地播放动画
//面向向量
transform.rotation=Quaternion.LookRotation(dir1);//可以实现原地播放动画
3.3 播放动画
//播放跑步动画
animator1.SetBool("IsRun",true);//播放walk动画
animator1.SetBool("IsRun",false);
3.4 移动
//朝着面向的前方移动
//transform.Translate(Vector3.forward*2*Time.deltaTime);
3.5 Animator的设置
3.5.1 动作状态的设置
3.5.2 设置好新的参数
- entry接着默认状态是walk
- 新增参数IsRun
- IsRun,用来切换walk和RUN
- wave参数继续控制WAVE动作
3.5 完整代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestPlayer1 : MonoBehaviour
{private Animator animator1;// Start is called before the first frame updatevoid Start(){animator1=GetComponent<Animator>();}// Update is called once per framevoid Update(){float horzontal=Input.GetAxis("Horizontal");float vetical=Input.GetAxis("Vertical");Vector3 dir1=new Vector3(horzontal,0,vetical);Debug.DrawRay(transform.position,dir1,Color.red);//如果按下了移动按键if(dir1 != Vector3.zero){//面向向量transform.rotation=Quaternion.LookRotation(dir1);//播放跑步动画animator1.SetBool("IsRun",true);//朝着面向的前方移动transform.Translate(Vector3.forward*2*Time.deltaTime);}else{//播放walk动画animator1.SetBool("IsRun",false);}if(Input.GetKeyDown(KeyCode.Q)){//触发wave参数GetComponent<Animator>().SetTrigger("wave");}}
}
实测OK
3.6 小心难缠的BUG
- 不要把轴名字写错
- 否则怎么也无法移动,但是很难定位错误
- float vetical=Input.GetAxis("Vetical"); //错误的轴,但是不给你报错,大概时因为轴可以自定义名称吧
- float vetical=Input.GetAxis("Vertical"); //正确的轴