插件配置调度

一般的plugin自己就决定了在哪个调度中执行system. 灵活性高一点的plugin则将决定权交给开发者.

下面这段代码非常有意思,将调度做为Plugin的配置进行动态设置.

声明:schedule: Interned<dyn ScheduleLabel>, 使用:schedule.intern().

学习资料汇总

做为一个0基础学Bevy的淌坑者,下面是一下学习资料汇总,没有这些开源者的贡献,Bevy社区不会高速发展,请给他们认可.

预计10分钟(包含做笔记的时间).

官网首页了解Bevy是什么,包含什么,主打优势是什么.

预计2周(8*14=112小时,如果每天看1小时,周末每天4小时,且刨除不感兴趣的部分,半个月就能啃完).

这个部分是最基础的部分,也是基石,时间花的多,回报也高.这部分花的时间少了,后续提速使用AI时,就缺少分辨能力了.

官方example是初学者/熟练者都需要反复学习的, 捡一些能懂的看,对于看不懂的先跳过,不要但心会遗漏什么,因为后续这些例子会升级, API的升级,性能的优化都会直接体现在这些例子种,需要反复学习,所以别担心遗漏.

对于example经常出现的类型和方法,需要跟进去,简单看一下源码和注释,这是熟悉Bevy用法最好时机.

预计1周.

bevy cheatbook入门书籍,优点是成体系,快速扫盲.

阅读时需要将书中提到的每一个概念都弄明白,每个链接都浏览一下. 以Bevy内置概念为例,我个人的学习方法是:

  1. Bevy独有的,查源码的注释,这个非常丰富,是什么,怎么样,和谁打配合都有详细描述
  2. 其他生态的,如gltf/wgpu,搜索引擎,AI聊天,很快就知道是什么了
  3. 行业的,如图片格式有很多种,查其优缺点和适用范围,是哪家主导的,支持怎么样
  4. fork+新分支,将cheatbook做成双语,查到的资料贴在下方

入门书籍本身就包含了两点意思:

  1. 仅包含入门所需的最小知识,如果入门的知识点不掌握透彻,那后续的高级知识点就很模糊
  2. 仅仅是入门,仅包含Bevy本身.那些更高级的方案并没有包含在内.这是一个起点.

看完后,再刷一下example,有内功的加持,阅读速度会大大提升.

查生态库有两个地方:

  1. bevy汇总
  2. 自己搜索,很多优秀的库和例子都没被收录到上面的链接中

每一个生态库就是一层封装,生态库会跟随Bevy发展,内部的API变化和逻辑变化就被隔离了.

比如说input/audio/animation/ui等场景,生态库一定是要看的.

至于为什么,很好解释:Bevy是通用底座,在具体方面不足才有了生态库,就像树干和树枝的关系, 树枝粗到一定程度,就会被Bevy吸收成为底座的一部分,这是Bevy的发展策略, 几大顶级生态库作者也是Bevy的核心开发者,他们都是认同这个做法的.

生态库专精一方面,所以不会很复杂,源码阅读即能学习Bevy的高质量用法,又能学习如何扩展新功能.

前面做的种种都是为了实现自己的游戏,有了前面的基础功,下一步就是大量学习别人的写游戏.

itch jam 都是好去处,看看bevy能做到哪一步.

itch还提供了大量资产,大量游戏,是个宝库.

多关注bevy issue和生态,很多人都在努力让Bevy变的更好.

游戏AI的资料收集

游戏之所以需要 AI,本质上是为了让虚拟世界里的角色看起来有“智能”, 让玩家觉得“他们在思考”,从而增加沉浸感、挑战性和乐趣

目的 说明
制造挑战 让敌人会战斗、躲避、追击,增加对抗的乐趣
增强沉浸感 让NPC像真人一样说话、巡逻、吃饭、反应
节省成本 不可能让所有角色都由真人控制,AI 可以自动化行为
创造剧情/氛围 AI 控制的角色可以推动剧情发展,或者制造环境氛围(如围观、逃跑等)
功能类型 示例
敌人行为 巡逻、警觉、追击、攻击、撤退等
角色控制 队友协作、自动寻路、选择技能等
生活模拟 村民按时间表上下班、聊天、购物
战术决策 决定是否攻击、防守、集结,RTS中常见
对话/情绪系统 简单的聊天逻辑,甚至配合 NLP 模拟更真实互动
群体行为 蜂群AI、群体移动、动态避障
任务执行 角色自动完成“去某地”“收集物品”等任务步骤

游戏 AI 是让 NPC 看起来“活着”的灵魂,让游戏世界有逻辑、有反馈、有惊喜。如果没有 AI,所有角色就像木偶,只会傻站着或重复动作,根本无法打动玩家。

目标 替代方案 缺点
巡逻行为 写死路径,定时移动或随机方向 + 碰撞判断 没有感知能力,容易出BUG
敌人攻击 碰到就打 or 距离小于X就攻击 不会判断形势,显得“蠢”
队友跟随 始终跟主角一段距离,简单追踪 卡位、掉队、绕障碍差
剧情NPC互动 写死对话逻辑 + 时间表 + 脚本事件 没有状态判断,行为不连贯
逃跑/反应行为 如果生命<30%,向远离玩家方向移动 无环境评估,容易走火入魔
选择技能/战术 随机选或轮流用技能,或HP低用治疗 缺少上下文判断,看起来不聪明
  1. 大量的状态/条件判断代码(手动实现“if…else…”)
  2. 写死行为逻辑树(每个 NPC 单独写行为流程)
  3. 人工调试每种情况的切换(异常容易错)
  4. 使用计时器、事件系统模仿“感知”和“选择”
  5. 更多维护成本(越复杂越难 debug)

比如你想让敌人“看到玩家就追,追一段时间没追到就放弃”, 如果用 AI(比如行为树或状态机),只需要几条规则就能搞定。

依赖库是否编译

一个项目依赖性多少库,可以从这个视角来看:项目包含feature,feature依赖库, 不想依赖某些库,就disable对应的feature.

Rustfmt

.rustfmt.toml是rust项目的格式化配置,这些自定义选项会增加工程的通用性. 以下是从各个Bevy生态库中汇总而成的.

不常见的system

ECS是一个完整的体系,不管是component还是system的参数解析信息都有cache, 这样能显著提高性能,另外各调度的延后执行让并行概率提高,这都得益于ECS的设计.

那么有没有这么一个system,不仅仅使用了system param,还要使用其他非systemparam的参数呢?

bevy有扩展:In,表明system的第一个参数In是调用方传入的.

屏幕环绕ScreenWrap的实现

ScreenWrap 是一种游戏机制,当角色或物体从屏幕的一侧移动出去,会从对面另一侧“穿出来”,就像世界是环形的那样。

🎮 举个例子说明游戏画面: 你控制一艘飞船,在一个 2D 太空中飞行。 飞船从右边飞出屏幕 → 它会从左边重新出现。 飞船从下方飞出屏幕 → 会从上方跳出来。 像是一个穿了个洞的世界地图,角色在边界不断“转圈圈”,没有尽头。

这个机制有什么用?

  • 节省资源:地图可以很小,视觉上却像是无限的。
  • 增强玩法:让玩家思考更多空间策略,比如“绕过去攻击敌人”。
  • 增强节奏:物体不会飞出地图消失,而是持续存在,战斗更激烈。

多态效果 提高复用

OO中的多态是子类各有各的逻辑,调用时用父类类型但传入子类, 保障代码简约的同时大大提高扩展性,是OO的三大基本特征之一.

在下面的代码,使用两个特型就模拟出了类似的效果. 特型Spawn实体生成器有两个实现: EntityCommands普通实体生成器和RelatedSpawnerCommands关系实体生成器.

这里核心是实体生成器Spawn可以生成挂件Widgets. 不管是挂件还是实体生成器都是特型,后期就算新增了其他的实体生成器,这块的代码都不用修改,灵活.