How to Develop a Game
FSM
PublishDate: 2025-06-01 | CreateDate: 2025-06-01 | LastModify: 2025-06-01 | Creator:ljf12825

FSM(Finite State Machine,有限状态机)是一种常用的编程模型,广泛应用于游戏开发中,尤其是在行为控制、游戏角色AI、UI系统、动画控制方面

它的核心就是在一组有限的状态中进行切换,且每次状态转移都遵循一定的规则

基本概念

FSM由以下几个基本元素构成:

FSM的组成部分

FSM的工作流程

FSM的工作过程可以概括为:每个时刻系统处于某个状态,系统等待某个事件的发生,一旦事件发生,就会根据事件的定义从当前状态转移到下一个状态,并可能触发某些动作。这个过程是循环的,状态机一直在不断地检查事件、进行状态转移。

FSM示例:AI行为

假设开发一个游戏中的敌人AI,敌人的行为可以通过FSM来管理,比如敌人有以下几个行为状态:

状态转移图:

每当敌人状态发生变化时,会有相应的动作,比如进入追击时播放追击动画,攻击时播放攻击动画

FSM在Unity中的实现

在Unity中,FSM通常通过脚本来实现。可以使用enum来定义状态,if条件判断或switch语句来管理状态转移,甚至用状态机设计模式来封装整个逻辑

一个简单FSM实现

public enum EnemyState
{
    Patrolling,
    Chasing,
    Attacking,
    Idle
}

public class EnemyAI : MonoBehaviour
{
    public EnemyState currentState;
    public Transform player;
    public float attackRange = 1.5f;
    public float chaseRange = 10f;

    private void Update()
    {
        switch (currentState)
        {
            case EnemyState.Patrolling:
                Patrolling();
                break;

            case EnemyState.Chasing:
                Chasing();
                break;

            case EnemyState.Attacking:
                Attacking();
                break;

            case EnemyState.Idle:
                Idle();
                break;
        }
    }

    void Patrolling()
    {
        // 巡逻逻辑
        if (Vector3.Distance(transform.position, player.position) < chaseRange)
        {
            currentState = EnemyState.Chasing;
        }
    }

    void Chasing()
    {
        // 追击逻辑
        if (Vector3.Distance (transform.position, player.position) < attackRange)
        {
            currentState = EnemyState.Attacking;
        }
        else if (Vector3.Distance (transform.position, player.position) > chaseRange)
        {
            currentState = EnemyState.Patrolling;
        }
    }

    void Attacking()
    {
        // 攻击逻辑
        if (Vector3.Distance(transform.position - player.position, player.position) >= attackRange)
        {
            currentState = EnemyState.Attacking;
        }
    }

    void Idle()
    {
        // 待机逻辑
        if (Vector3.Distance(transform.position, player.position) < chaseRange)
        {
            currentState = EnemyState.Chasing;
        }
    }
}

解释:

FSM的优缺点

优点:

缺点:

优化与扩展

应用场景

FSM不仅在游戏AI中有广泛应用,还可以在其他许多领域发挥作用,例如: