一般来说,每一个游戏物体会有多种状态,每一个状态会对应一个特定动画。如一个游戏角色可能有静止状态,移动状态,攻击状态。每一个状态里都有对应的动画。如果我们只是简单使用一个个if语句判断玩家进行哪个控制来切换动画会让程序可读性和可维护性很差。利用FSM(有限状态机)可以将每一个状态单独封装,使得系统结构更加清晰
我们首先搭建一个游戏场景用于示例
导入素材Character Pack: Free Sample,该素材里包括一个人物模型和一系列人物动画。这里我们使用其中idle,run,wave动画
给人物添加动画器组件,idle和run之间靠boolean值IsRun切换,idle和wave之间用trigger Wave切换
1 将状态封装为方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum State {
idle,
run,
wave
}
public class TestFSM_1 : MonoBehaviour
{
private Animator ani;
private State state = State.idle;
// Start is called before the first frame update
void Start()
{
ani = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
switch (state) {
case State.idle:
idle();
break;
case State.run:
run();
break;
case State.wave:
wave();
break;
}
}
void idle() {
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(horizontal, 0, vertical);
if (dir == Vector3.zero) {
ani.SetBool("IsRun", false);
} else {
state = State.run;
}