DeepSeek教unity------State Machine

news/2025/2/21 16:27:15/

在Unity游戏开发中,状态机(State Machine)是一种常用的设计模式,用于管理游戏对象的不同状态及其转换。状态机可以帮助你更好地组织代码,使其更易于维护和扩展。以下是一个简单的状态机实现示例,适用于Unity中的游戏对象。

1. 定义状态接口

首先,我们定义一个状态接口 IState,所有具体状态类都需要实现这个接口。

/****************************************************文件:IState.cs作者:Edision日期:#CreateTime#功能:状态接口
*****************************************************/public interface IState
{void Enter();void Update();void Exit();
}

2. 实现具体状态类

接下来,我们实现一些具体的状态类。每个状态类都需要实现 IState 接口。

/****************************************************文件:StateMachine.cs作者:Edision日期:#CreateTime#功能:默认(空闲)状态
*****************************************************/using UnityEngine;public class IdleState : IState
{public void Enter(){Debug.Log("Entering Idle State");}public void Update(){Debug.Log("Updating Idle State");}public void Exit(){Debug.Log("Exiting Idle State");}
}/****************************************************文件:StateMachine.cs作者:Edision日期:#CreateTime#功能:追逐状态
*****************************************************/
public class ChaseState : IState
{public void Enter(){Debug.Log("Entering Chase State");}public void Update(){Debug.Log("Updating Chase State");}public void Exit(){Debug.Log("Exiting Chase State");}
}/****************************************************文件:StateMachine.cs作者:Edision日期:#CreateTime#功能:攻击状态
*****************************************************/
public class AttackState : IState
{public void Enter(){Debug.Log("Entering Attack State");}public void Update(){Debug.Log("Updating Attack State");}public void Exit(){Debug.Log("Exiting Attack State");}
}

3. 实现状态机类

状态机类 StateMachine 负责管理状态的转换和更新。

/****************************************************文件:StateMachine.cs作者:Edision日期:#CreateTime#功能:状态机类
*****************************************************/public class StateMachine
{private IState currentState;public void ChangeState(IState newState){if (currentState != null){currentState.Exit();}currentState = newState;currentState.Enter();}public void Update(){if (currentState != null){currentState.Update();}}
}

4. 在游戏对象中使用状态机

最后,我们在一个游戏对象(例如敌人AI)中使用状态机来管理其行为。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class EnemyAI : MonoBehaviour
{private StateMachine stateMachine;private IdleState _idleState;private ChaseState _chaseState;private AttackState _attackState;private void Awake(){_idleState = new IdleState();_chaseState = new ChaseState();_attackState = new AttackState();}void Start(){stateMachine = new StateMachine();stateMachine.ChangeState(_idleState);}void Update(){stateMachine.Update();// 示例:根据条件切换状态if (Input.GetKeyDown(KeyCode.Space)){stateMachine.ChangeState(_chaseState);}if (Input.GetKeyDown(KeyCode.A)){stateMachine.ChangeState(_attackState);}}
}

5. 运行游戏

将 EnemyAI 脚本附加到一个游戏对象上,运行游戏。你可以通过按下空格键和 A 键来切换状态,并在控制台中看到状态转换的日志输出。


http://www.ppmy.cn/news/1573436.html

相关文章

3DsMax快捷键

鼠标中键 平移 alt鼠标中键 旋转 鼠标中键滚动 缩放 v 快速切换视图 F3 材质显示 F4 线框显示 QWER 选择 移动 旋转 缩放 CtrlI 反选 S 捕捉吸附 可编辑多边形 1点模式 2线模式 3边界模式 4面模式 5体模式 6物体编辑模式 ShiftE 挤出 AltR 环选 CtrlF 封口…

Word中的文档信息域

Word中的文档信息域 DocProperty包含文档信息的多个属性, 也可以自定义属性. 查看文档预定义的自定义属性 【文件】→【信息】→【属性】→【高级属性】 参考链接 WORD中文档属性域DocProperty的应用-CSDN博客 第06套 Word_哔哩哔哩_bilibili

Qt之线程的创建与启动

在应用开发中,多线程技术是提高程序响应速度和处理能力的关键。Qt框架作为一个强大的C++跨平台工具集,为我们提供了丰富的多线程支持。本文将详细讲解如何在Qt中创建和启动线程 Qt的线程机制 Qt中的多线程处理主要依赖于QThread类。这个类封装了底层的线程启动、运行和终止…

怎么查股指期货持仓量?

如果你对股指期货感兴趣,或者正在参与股指期货交易,那么了解持仓量是非常重要的。持仓量可以帮助你判断市场的热度、多空双方的力量对比,甚至还能为你的投资决策提供参考。那么,如何查看股指期货的每日持仓量呢?别担心…

【系列专栏】银行IT的云原生架构-存储架构-数据安全 11

银行 IT 的云原生架构-存储架构(数据安全) 一、引言 在银行 IT 云原生架构中,存储架构是数据存储与管理的基石,而数据安全则是保障银行业务稳定运行、维护客户信任以及满足监管要求的核心要素。随着银行业务数字化程度的不断加深…

精读解析:华为MPP营销计划流程培训课件

本文概述了华为MPP(Marketing Plan Process,营销计划流程)及其在产品交付过程中的常见问题与解决方案。MPP旨在为产品和解决方案上市前的营销活动提供清晰、可控、基于流程的方法,确保产品在推向市场前具备可交付条件。文中指出&a…

神经网络剪枝技术的重大突破:sGLP-IB与sTLP-IB

神经网络剪枝技术的重大突破:sGLP-IB与sTLP-IB 在人工智能飞速发展的今天,深度学习技术已经成为推动计算机视觉、自然语言处理等领域的核心力量。然而,随着模型规模的不断膨胀,如何在有限的计算资源和存储条件下高效部署这些复杂的神经网络模型,成为了研究者们亟待解决的…

PHP支付宝--转账到支付宝账户

官方参考文档: ​https://opendocs.alipay.com/open/62987723_alipay.fund.trans.uni.transfer?sceneca56bca529e64125a2786703c6192d41&pathHash66064890​ 可以使用默认应用,也可以自建新应用,此处以默认应用来讲解【默认应用默认支持…