FSM 在游戏中的简单实现

 1. 状态宏
#define STATE_ID_UNCARING 1
#define STATE_ID_MAD 2
#define STATE_ID_RAGE 3
#define STATE_ID_BERSERK 4
#define STATE_ID_ANNOYED 5


2. 输入宏
#define INPUT_ID_PLAYER_SEEN 1
#define INPUT_ID_PLAYER_ATTACK 2
#define INPUT_ID_PLAYER_GONE 3
#define INPUT_ID_MONSTER_HURT 4
#define INPUT_ID_MONSTER_HEALED 5

3. 代码实现



FSMclass::m_map是FSMstate对象的集合,是从STL<map>中实现的。
FSMclass::m_iCurrentState是FSMstate对象的状态标识,是“有限状态机”的当前状态。
FSMclass::GetCurrentState()可以用之访问当前的FSMstate对象的状态的标识符。
FSMclass::SetCurrentState()可以设置当前FSMstate对象的状态的标识符。
FSMclass::GetState()可以取得有限状态机中的任何FSMstate对象的指针。
FSMclass::AddState()增加有限状态机中的FSMstate对象。
FSMclass::DeleteState()删除有限状态机中的FSMstate对象
FSMclass::StateTransition()初始化状态转换,根据输入返回输出状态。


4. 使用示例

在Unity引擎,Finite State Machine (FSM,有限状态机)是一种常见的设计模式,用于组织游戏逻辑,特别是管理角色的行为。它将复杂的游戏流程分解成一系列简单的状态,并定义了状态之间的转换规则。 要实现一个基本的FSM在Unity,你可以按照以下步骤操作: 1. **创建状态类**:为每个游戏状态创建一个单独的C#类,例如`IdleState`, `WalkingState`, `AttackingState`等。这些类通常包含描述当前状态的行为方法(如`Enter()`, `Update()`, `Exit()`)。 2. **创建上下文类**:这是FSM的核心部分,负责管理状态。`StateMachineContext`是一个例子,它可以包含一个状态列表、一个当前状态以及状态间的切换逻辑。 ```csharp public class FSMContext : MonoBehaviour { private List<State> states; private State currentState; // 状态添加、删除和切换的方法... } ``` 3. **添加状态**:将状态类实例化并加入到上下文,比如`currentState.Add( new IdleState(this) )`。 4. **设置状态转换**:在`StateMachineContext`定义状态之间的转换规则,比如当检测到特定事件(按钮点击、碰撞等)时,调用`SwitchTo(State newState)`。 5. **状态处理**:在状态类里实现`Update()`方法,根据状态特性和游戏逻辑更新相应的属性和行为。 6. **事件触发和状态变更**:在游戏通过脚本来触发状态的改变,例如检查玩家输入或游戏条件变化。 ```csharp // 示例:当用户按下攻击键时 if (Input.GetKeyDown(KeyCode.Space)) { fsmContext.SwitchTo(AttackState.Instance); } ``` 7. **生命周期管理**:记得在适当的时候销毁无用的状态,比如游戏结束或者角色死亡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值