1、有限状态机
有限状态机(Finite - state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型
有限:表示是有限度的不是无限的
状态:指所拥有的所有状态
举例说明:
假设我们人会做很多个动作,也就是有很多种状态
这些状态包括 站立、走路、跑步、攻击、防守、睡觉等等
我们每天都会在这些状态中切换,而且这些状态虽然多但是是有限的
当达到某种条件时,我们就会在这些状态中进行切换
而且这种切换时随时可能发生的
游戏开发中有很多功能系统都是有限状态机
最典型的状态机系统
- 动作系统 —— 当满足某个条件切换一个动作,且动作是有限的
- AI(人工智能)系统 —— 当满足某个条件切换一个状态,且状态时有限的
2、简单的状态机实现
//最简单的状态机实现代码就是基于switch的实现
//假设我们只有一个值来控制当前玩家的状态
string animName = "idle";
switch (animName)
{
case "idle":
//待机动作逻辑
break;
case "move":
//移动动作逻辑
break;
case "run":
//跑步动作逻辑
break;
case "atk":
//攻击动作逻辑
break;
}
3、创建动画状态机
两种方法:
- 通过为场景中物体创建动画时自动创建
- 手动创建动画状态机文件
4、动画状态机窗口参数
5、添加切换连线
在每一个动画状态播放完毕后,如果没有设置切换条件,会自动跳转到连线相关联的另一个动画状态
6、添加动画
- 自动添加——为对象创建动画后会自动将动画添加到状态机中
- 手动添加1——将动画文件拖入到状态机中(注意:直接创建的Animation动画拖入会有警告)
- 手动添加2——右键创建状态,再关联动画
7、添加切换条件
在左侧面板点击参数页签可以在这里添加4中类型的切换条件。如果切换条件有多个,他们之间是 与 的关系。
8、Animator组件参数
9、Animator的API
animator = this.GetComponent<Animator>();
// 1.通过状态机条件切换动画
animator.SetFloat("条件名", 1.2f);
animator.SetInteger("条件名", 5);
animator.SetBool("条件名", true);
animator.SetTrigger("条件名");
animator.GetFloat("条件名");
animator.GetInteger("条件名");
animator.GetBool("条件名");
// 2.直接切换动画 除非特殊情况 不然一般不使用
// 注意!!!不是动画名,动画名是动画资源的名称,状态名是Animator窗口中的名称,是可以修改的
animator.Play("状态名");
注意:在修改状态后,对象可以会在播放完当前动画后才会跳转到状态更改后的动画,如果需要立即跳转,可以将连线的 Inspector 窗口中的 Has Exit Time 勾掉即可。
10、Animation创建序列帧动画
- 方法一:
1.创建一个空物体
2.创建一个动画
3.直接将某一个动作的序列帧(多张图片)拖入Animation窗口中
- 方法二:
直接将多张图片拖入Hierarchy层级窗口中,通常用来创建第一个动画
注意:需要修改动画帧率(Inspector——>Debug窗口下的 Sample Rate 或者 Animation 窗口中的 Show Sample Rate 修改,来控制动画的播放速度,但是一般是将Animation窗口中的关键帧删除掉,修改动画帧率后再将图片拖入创建序列中,直接修改可能会造成帧的丢失。