在Unity中实现有限状态机

本文介绍了如何在Unity中实现有限状态机,包括基本的有限状态机概念、状态的进入与退出行为、技能类的示例以及状态机的封装和优化,如静态与实例化状态、全局状态和状态翻转。文章还讨论了并发状态机和状态分层的概念,以适应更复杂的游戏逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Unity中实现有限状态机

概要

本文将介绍Unity开发中的有限状态机,给出对应的实现代码。

背景

有限状态机借鉴了图灵机的思想,可以看作是最简单的图灵机。

它包含4要素:

  • 现态
  • 条件
  • 动作
  • 次态

有限状态机的基本实现

基础的有限状态机不复杂,无非是几个状态定义成类,提供OnEnter/OnExit/OnUpdate方法,这里直接根据需求给出对应的代码实现。

需求
  • 按住左Ctrl蓄力
  • 蓄力0.5s 内松开取消蓄力
  • 蓄力2.0s 内松开播放技能动作1
  • 蓄力2.0s 以上松开播放技能动作2
  • 蓄力超过3.5s 播放技能动作2
  • 点击空格跳跃
实现

抽象类,定义进入状态和退出状态的行为

public interface IState
{
    public IState OnUpdate(Character t);
    public void OnEnter(Character t);
    public void OnExit(Character t);
}

状态机的关键在于控制状态的切换,这里直接在Character里进行相关逻辑控制。

public class Character : MonoBehaviour
{
    public Animator animator;
    protected IState state;

    public virtual void Update()
    {
        if (null != state)
        {
            IState newState = state.OnUpdate(this);
            //状态切换
            //state switch
            if (null != newState)
            {
                TransitionState(newState);
            }
        }
    }

    /// <summary>
    /// 状态切换
    /// Transition state
    /// </summary>
    /// <param name="newState"></param>
    public void TransitionState(IState newState)
    {
        Debug.Log($"状态变更{newState}");
        newState.OnEnter(this);

        if (null != state)
            state.OnExit(this);
        state = newState;
    }
}

演示一个技能类

public class UltimateSkillState : IState
{
    private int _fullPathHash;
    private int _skillId;
    private float _dt = 0;

    private int _prevHashId = 0;
    public void OnEnter(Character t)
    {
        _dt = 0;
        t.animator.SetInteger(AnimationTriggers.hashIdDefaultSkill, _skillId);

    }
    /// <summary>
    /// 构造
    /// </summary>
    /// <param name="skillId">技能id</param>
    /// <param name="animatorFullPath">动画全路径(如Base Layer.Jump)</param>
    public UltimateSkillState
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NickPansh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值