unity进阶学习笔记:有限状态机

本文介绍了如何使用有限状态机(FSM)来管理Unity游戏中的角色状态,例如静止、移动和挥手。通过创建状态枚举、封装状态方法和类,以及实现FSMManager,提升游戏逻辑的可读性和可维护性。详细步骤包括设置动画器,创建状态枚举,定义状态基类和FSMManager,以及实现IdleState、RunState和WaveState的详细逻辑。
摘要由CSDN通过智能技术生成

一般来说,每一个游戏物体会有多种状态,每一个状态会对应一个特定动画。如一个游戏角色可能有静止状态,移动状态,攻击状态。每一个状态里都有对应的动画。如果我们只是简单使用一个个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;
        }
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值