外部类触发角色状态切换

在使用状态机的时候,很容易出现这种情况

在游戏开发中,当其他类(比如敌人、道具、环境等)触发了某个事件,想要改变玩家的状态,而玩家使用的是状态机(State Machine)来管理行为和状态,那么关键在于:如何优雅地让外部事件通知状态机,进而触发玩家状态的变更或行为的调整

下面是几种常见且合理的实现方式,按照推荐程度和清晰度排序:


一、核心思路

状态机通常封装了玩家当前的状态以及状态之间的切换逻辑。外部不应该直接修改玩家的状态(比如强制将状态设为“跳跃”或“受伤”),而是应该通过事件/消息/接口通知玩家对象,由玩家内部的状态机决定如何响应。


二、推荐的实现方案

方案1:通过事件/消息系统通知玩家(解耦推荐 ✅✅✅)

适用场景:游戏架构较为复杂,希望各系统之间低耦合,比如使用观察者模式、事件总线(Event Bus)、信号槽(Signal/Slot)等。

实现步骤:
  1. 定义事件类型

    • 比如PlayerHitEventPowerUpCollectedEventEnemyNearbyEvent等。
  2. 其他类触发事件

    • 当敌人攻击玩家时,敌人不直接调用玩家的方法,而是向事件系统发送一个事件,如:

      csharp

      EventSystem.Publish(new PlayerHitEvent(damage));
  3. 玩家对象监听事件

    • 玩家类(或状态机类)注册监听这些事件,当收到事件后,通知当前状态或者直接让状态机处理
    • 例如:

      csharp

      // 在玩家初始化时 EventSystem.Subscribe<PlayerHitEvent>(OnPlayerHit); private void OnPlayerHit(PlayerHitEvent e) { stateMachine.HandleEvent(e); // 或直接调用状态机方法 }
  4. 状态机或具体状态处理事件

    • 状态机有一个统一的事件处理入口,或者每个状态自己处理关心的事件。
    • 例如,在状态机中:

      csharp

      public void HandleEvent(GameEvent e) { currentState.HandleEvent(e); }
    • 每个状态类实现自己的HandleEvent方法,决定是否要切换状态或执行某些行为。

优点:高度解耦,易于扩展和维护,适合大型项目。
缺点:需要实现事件系统,稍微复杂一点。


方案2:通过玩家暴露的接口方法(直接但需控制访问 ✅✅)

适用场景:中小型项目,事件系统未引入,但依然希望有一定封装性。

实现步骤:
  1. 在玩家类中提供“受保护”的方法或通过状态机暴露接口

    • 比如:

      csharp

      public class Player { public StateMachine StateMachine { get; private set; } // 外部不直接调用 SetState,而是调用统一接口 public void TakeDamage(int damage) { stateMachine.HandleDamage(damage); } public void CollectPowerUp(PowerUpType type) { stateMachine.HandlePowerUp(type); } }
  2. 状态机或当前状态处理逻辑

    • 状态机根据不同输入,决定是否切换状态。例如:

      csharp

      public void HandleDamage(int damage) { if (currentState is NormalState) { // 切换到受伤状态或减少血量后可能进入击倒状态 ChangeState(new HurtState()); } }

优点:比直接操作状态更安全,逻辑集中。
缺点:如果接口设计不好,仍可能导致外部误用。


方案3:直接调用状态机/设置状态(不推荐 ❌❌❌,除非非常简单)

即:其他类直接调用类似player.StateMachine.ChangeState(new HurtState())player.SetState("Hurt")

⚠️为什么不推荐?

  • 破坏封装性:状态机是玩家内部行为管理机制,外部直接控制状态,容易导致逻辑混乱。
  • 难以维护和调试:多个系统随意切换玩家状态,难以追踪状态流转。
  • 不符合面向对象设计原则:高耦合,低内聚。

🔒除非是极其简单的原型阶段,否则应避免这种做法。


三、最佳实践建议总结

方法耦合度可维护性推荐度适用阶段
事件/消息系统(观察者/Event Bus)✅✅✅中大型项目,复杂交互
玩家封装接口,由状态机处理中高✅✅中小型项目,结构清晰
直接操作状态机/状态❌❌❌原型阶段,临时调试用

四、举个例子(伪代码/简化版)

假设:

  • 玩家有状态机,当前可能是 Idle、Run、Hurt、KnockDown 等状态。
  • 敌人攻击玩家,希望让玩家受伤。

事件驱动方式(推荐)👇

csharp

// 敌人攻击时 void AttackPlayer() { int damage = 10; EventSystem.Publish(new PlayerHitEvent(damage, this)); } // 玩家初始化时订阅事件 void Start() { EventSystem.Subscribe<PlayerHitEvent>(OnHit); } void OnHit(PlayerHitEvent e) { stateMachine.HandleDamage(e.Damage); } // 状态机或状态内部处理 public void HandleDamage(int damage) { if (CurrentState is NormalState) { ChangeState(new HurtState()); health -= damage; } }

五、补充:状态机设计建议

  • 状态模式(State Pattern)是实现状态机的经典方式,每个状态是一个类,实现统一的接口,比如IState,包含Enter()Update()Exit()HandleEvent()等方法。
  • 上下文(Context)是玩家自己,它持有当前状态对象,并委托行为给状态。
  • 通过这种方式,状态的切换和行为都封装在状态类中,外部只关心“发生了什么”,而不关心“怎么切换”。

总结一句话:

🎮当其他类需要影响玩家状态时,不要直接操作玩家状态机,而应该通过事件通知、接口调用等间接方式,最终由玩家的状态机根据逻辑决定是否以及如何切换状态。推荐使用事件系统实现解耦,保障代码清晰可维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1204227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GESP五级考试全攻略:考点、技巧与举一反三

GESP&#xff08;编程能力等级认证&#xff09;五级作为中级阶段的核心认证&#xff0c;聚焦基础算法思维的落地与代码实现的熟练度&#xff0c;考点覆盖均衡且侧重模块间的简单融合。本文严格参照六级攻略格式&#xff0c;从考点权重、核心知识点、应答技巧、知识整合、举一反…

PyTorch-2.x镜像使用心得:开发者日常开发提效实践

PyTorch-2.x镜像使用心得&#xff1a;开发者日常开发提效实践 作为一名长期在深度学习一线“搬砖”的开发者&#xff0c;我深知一个干净、高效、开箱即用的开发环境对生产力的提升有多关键。过去每次换机器或协作项目时&#xff0c;光是配置 Python 环境、装 CUDA 驱动、解决包…

快速构建应用程序,低代码开发助力企业发展

低代码开发&#xff0c;为企业应用搭建按下加速键在当今数字化时代&#xff0c;企业对于应用程序的需求日益增长。然而&#xff0c;传统的开发方式往往需要耗费大量的时间、人力和资源&#xff0c;导致开发周期长、成本高&#xff0c;且难以满足企业快速变化的业务需求。低代码…

2026年湖南热门温室厂家排名:探讨冠丰温室日光温室透光性好不好?

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为农业生产者选型提供客观依据,助力精准匹配适配的温室园艺工程服务伙伴。 TOP1 推荐:冠丰温室 推荐指数:★★★★★ | 口碑评分:国内专业靠谱的…

Emotion2Vec+ Large实战案例:电话销售情绪反馈系统搭建

Emotion2Vec Large实战案例&#xff1a;电话销售情绪反馈系统搭建 1. 为什么需要电话销售情绪反馈系统&#xff1f; 你有没有遇到过这样的情况&#xff1a;销售团队每天打上百通电话&#xff0c;但没人知道客户在说“好的”时是真认可&#xff0c;还是敷衍应付&#xff1f;客…

NewBie-image-Exp0.1快速上手指南:容器内执行命令全解析

NewBie-image-Exp0.1快速上手指南&#xff1a;容器内执行命令全解析 1. 为什么这个镜像值得你花5分钟打开 你有没有试过为一个动漫生成模型配置环境——装CUDA、调PyTorch版本、修报错、下权重、改源码……最后发现卡在“IndexError: arrays used as indices must be of inte…

企业选择OA系统,这几个因素你考虑了吗?

企业信息化升级&#xff0c;OA系统成高效办公新标配 在当今数字化时代&#xff0c;企业的竞争愈发激烈&#xff0c;信息化升级已成为企业提升竞争力的关键。而OA系统&#xff0c;作为企业信息化建设的重要组成部分&#xff0c;正逐渐成为高效办公的新标配。 一、企业信息化升级…

NewBie-image-Exp0.1如何备份?模型权重与配置文件保存指南

NewBie-image-Exp0.1如何备份&#xff1f;模型权重与配置文件保存指南 1. 为什么需要备份你的NewBie-image项目&#xff1f; 你已经用 NewBie-image-Exp0.1 生成了几张惊艳的动漫图像&#xff0c;甚至可能已经开始基于它做二次创作或研究。但有没有想过&#xff1a;如果容器被…

fft npainting lama实战对比:与DeepSeek-Inpainting谁更强?

fft npainting lama实战对比&#xff1a;与DeepSeek-Inpainting谁更强&#xff1f; 1. 引言&#xff1a;图像修复的现实需求与技术选择 你有没有遇到过这样的情况&#xff1f;一张珍贵的照片里有个不想要的路人&#xff0c;或者截图上的水印遮住了关键信息&#xff0c;又或者…

Open-AutoGLM避坑指南:这些配置问题你可能会遇到

Open-AutoGLM避坑指南&#xff1a;这些配置问题你可能会遇到 你是不是也对“用一句话让AI自动操作手机”这件事充满期待&#xff1f;比如&#xff1a;“打开小红书搜美食”、“刷抖音直到看到猫视频为止”。听起来很酷&#xff0c;但当你真正开始部署 Open-AutoGLM 时&#xf…

Qwen情感分析可解释性:判断依据呈现方案设计

Qwen情感分析可解释性&#xff1a;判断依据呈现方案设计 1. 引言&#xff1a;让AI的“情绪判断”不再黑箱 你有没有过这样的体验&#xff1f;输入一句话&#xff0c;AI告诉你“这是正面情绪”&#xff0c;但你却不知道它为什么这么认为。这种“只给结论、不给理由”的情况&am…

IndexTTS-2模型许可证解读:Apache 2.0合规使用教程

IndexTTS-2模型许可证解读&#xff1a;Apache 2.0合规使用教程 1. 为什么你需要关心这个许可证&#xff1f; 你刚下载完IndexTTS-2镜像&#xff0c;双击启动&#xff0c;输入一段文字&#xff0c;点击“生成”&#xff0c;几秒后耳边响起自然流畅的语音——太棒了&#xff01…

Nacos源码与原理 01,Nacos 源码解析:服务注册的核心流程与核心数据结构

Nacos 作为主流的动态服务发现、配置管理和服务管理平台&#xff0c;是微服务架构中服务注册中心的核心组件。服务注册是 Nacos 最基础也最核心的能力&#xff0c;本文将从核心数据结构和完整注册流程两大维度&#xff0c;深入剖析 Nacos 服务注册的底层实现&#xff0c;结合核…

新手友好!科哥版Paraformer WebUI三步完成语音转写

新手友好&#xff01;科哥版Paraformer WebUI三步完成语音转写 1. 为什么你需要这个语音转写工具&#xff1f; 你有没有过这样的经历&#xff1a; 开完一场两小时的会议&#xff0c;回过头来要花半天时间整理录音&#xff1f;收到客户发来的30分钟语音咨询&#xff0c;逐字听…

快速迁移现有模型到verl:适配经验分享

快速迁移现有模型到verl&#xff1a;适配经验分享 在当前大语言模型&#xff08;LLM&#xff09;的后训练阶段&#xff0c;强化学习从人类反馈&#xff08;RLHF&#xff09;已成为提升模型对齐能力与生成质量的核心手段。然而&#xff0c;随着模型规模不断攀升&#xff0c;传统…

BERT掩码语言模型新玩法:实时可视化置信度部署案例

BERT掩码语言模型新玩法&#xff1a;实时可视化置信度部署案例 1. 什么是BERT智能语义填空服务 你有没有试过这样一句话&#xff1a;“他做事总是很[MASK]&#xff0c;让人放心。” 只看前半句&#xff0c;你脑子里是不是立刻蹦出“靠谱”“踏实”“认真”&#xff1f; 这不是…

GPEN+OpenCV联动应用:实时视频流人像增强部署案例

GPENOpenCV联动应用&#xff1a;实时视频流人像增强部署案例 你有没有遇到过这样的问题&#xff1a;想在直播、视频会议或监控场景中实时提升人脸画质&#xff0c;但现有方案要么延迟太高&#xff0c;要么效果生硬&#xff1f;今天要分享的不是单纯跑通GPEN模型的教程&#xf…

为何IQuest-Coder-V1-40B部署总失败?显存优化实战案例详解

为何IQuest-Coder-V1-40B部署总失败&#xff1f;显存优化实战案例详解 你是不是也遇到过这样的情况&#xff1a;满怀期待地拉取了 IQuest-Coder-V1-40B-Instruct 模型&#xff0c;准备在本地或服务器上部署&#xff0c;结果刚一加载就提示“CUDA out of memory”&#xff1f;或…

Llama3-8B长文档摘要不准?RAG增强方案实战案例

Llama3-8B长文档摘要不准&#xff1f;RAG增强方案实战案例 1. 问题背景&#xff1a;Llama3-8B的长文本处理瓶颈 Meta-Llama-3-8B-Instruct 是 Meta 在 2024 年 4 月推出的中等规模指令模型&#xff0c;凭借 80 亿参数、单卡可部署、支持 8k 上下文和 Apache 2.0 类似的商用许…

Paraformer-large离线识别真实体验:准确率高还带标点

Paraformer-large离线识别真实体验&#xff1a;准确率高还带标点 1. 为什么我选了这个语音识别镜像&#xff1f; 你有没有遇到过这种情况&#xff1a;录了一段会议音频&#xff0c;想转成文字整理纪要&#xff0c;结果用的工具识别不准、没有标点、还得手动分段&#xff1f;太…