- 低代码
- 代码生成
- 桌面应用
- 游戏开发
【免费下载链接】MCreator
MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an integrated code editor. It is used worldwide by Minecraft players, aspiring mod developers, for education, online classes, and STEM workshops.
导读
本文围绕 MCreator 中实体 AI 任务的"起始条件"(AI Start Condition)展开,核心依据是仓库内 de_DE 帮助文档(及其英文原版 default 版)的说明:如果指定了条件,实体只有在条件通过时才会开始执行该 AI 任务。读完本文,你将掌握在 MCreator 实体编辑器中为任意 AI 任务配置起始条件的完整操作流程,理解它在生成代码中如何落地为 Minecraft 的canUse()/canContinueToUse()判定,并能据此设计"只在特定时刻触发"的高阶实体行为。
一、起始条件在 AI 任务体系中的定位
在 MCreator 中,实体(Living Entity)的 AI 行为由一个 Blockly 任务容器(aitasks_container)承载。实体元素类型中的aixml字段(见 LivingEntity.java)以 Blockly XML 形式保存全部任务块,并通过BlocklyEditorType.AI_TASK(见 BlocklyEditorType.java)在内置的 AI 任务编辑器中渲染。
MCreator 内置的 AI 任务块定义位于 plugins/mcreator-core/aitasks/ 目录,涵盖战斗(attack_entity、attack_on_collide、avoid_entity)、移动(fly、wander)、生存(eat_grass、doors_open)等数十种任务。几乎每一个任务块的参数中都包含一个condition字段,其类型是field_ai_condition_selector(AI 条件选择器)。以攻击实体任务为例(attack_entity.json):
{ "type": "field_ai_condition_selector", "name": "condition" }这个字段正是"起始条件"的入口。帮助文档所描述的行为——"实体只有在条件通过时才会开始执行此任务"——指的就是当该字段被配置为某个条件过程(Procedure)后,Minecraft 的 Goal 系统会先用该条件判定"能否开始"。
二、实际操作:在 AI 条件编辑器中配置起始条件
2.1 如何打开编辑器
在实体编辑器的 AI 任务(AI Tasks)区块中,任意带有"条件"字段的任务块上双击该字段即可打开"AI 条件编辑器"。该交互由 Blockly 字段前端实现,见 field_ai_condition_selector.js:单击记录点击时间,500 毫秒内的第二次点击(即双击)会通过 Java 桥接调用openAIConditionEditor,把当前值(形如null,null)传给编辑器。
编辑器窗口本身由 AIConditionEditor.java 实现,其中明确挂载了entity/ai_start_condition帮助入口(IHelpContext.NONE.withEntry("entity/ai_start_condition")),也就是本文依据的那份帮助文档。
2.2 两个条件选择器:起始条件与继续条件
对话框内并排提供两个 ProcedureSelector(过程选择器),中文界面文本为"附加启动条件"和"附加中继条件"(见 texts_zh_CN.properties):
| 选择器 | 界面文本(zh_CN) | 作用阶段 | 对应英文原文 |
|---|---|---|---|
| startCondition | 附加启动条件 | 任务开始前判定(canUse()) | additional start condition |
| continueCondition | 附加中继条件 | 任务执行中判定是否继续(canContinueToUse()) | additional continue condition |
两者均为LOGIC(逻辑/布尔)类型过程,且固定提供以下依赖参数(源码 AIConditionEditor.java):
x:number / y:number / z:number / world:world / entity:entity这意味着在编写条件过程时,可以直接引用当前实体的坐标(x/y/z)、所在世界(world)以及实体本身(entity),例如"仅在夜晚执行""仅在血量低于 30% 时攻击""仅在玩家靠近时逃跑"等。
选中的条件会以名称,名称的逗号分隔形式写回字段(未选择时为null)。字段上会即时显示"条件"标签及两个状态的缩写:O表示未选(Open),X表示已选(eXists),见 field_ai_condition_selector.js。例如:
OO:起始与继续条件均未设置;XO:仅设置了起始条件;OX:仅设置了继续条件;XX:两者均已设置。
把鼠标悬停在字段上,会弹出 tooltip 分别列出"启动条件"与"继续条件"的具体过程名(field_ai_condition_selector.js),方便快速核对已绑定的过程。
2.3 保存与取消
点击"确定"后,startCondition与continueCondition两个选择器中选中的过程名会被分别写入返回值,未选择则写入"null"(AIConditionEditor.java)。点击"取消"则丢弃本次修改。
三、生成原理:条件如何变成 Minecraft Goal 代码
理解了界面操作后,最关键的问题是:起始条件最终如何影响游戏内 AI?答案在生成器的 FreeMarker 模板中。
3.1 conditionCode 宏
NeoForge 1.21.1 生成器(generator-1.21.1/neoforge-1.21.1)在 utils/aiconditions.java.ftl 中定义了核心宏conditionCode。它读取任务的condition字段值,将其拆分为两个过程对象(conditions[0]为起始条件、conditions[1]为继续条件),然后为实体类生成两个覆写方法:
@Override public boolean canUse() { double x = this.getX(); double y = this.getY(); double z = this.getZ(); Entity entity = this; Level world = this.level(); return super.canUse() && <起始条件过程生成的代码>; } @Override public boolean canContinueToUse() { double x = this.getX(); double y = this.getY(); double z = this.getZ(); Entity entity = this; Level world = this.level(); return super.canContinueToUse() && <继续条件过程生成的代码>; }这里可以看到生成代码中会注入x/y/z/entity/world五个变量,与编辑器中的依赖列表一一对应——这就是条件过程中可直接引用这些参数的根本原因。
需要特别说明:canUse()对应"开始执行"的判定。Minecraft 的 Goal(PathfinderMob的goalSelector)每个 tick 都会调用canUse();只有返回true,Goal 才会被选中并调用其start()进入执行状态。这与帮助文档"实体只有在条件通过时才会开始执行此任务"的表述完全一致。而canContinueToUse()则是在执行过程中持续判定——一旦返回false,Goal 会被中断,实体停止该行为。
值得注意的是,起始条件(canUse)与继续条件(canContinueToUse)是相互独立的:即使起始条件在任务启动后立刻失效,只要继续条件成立,任务仍会继续执行;反之亦然。这一设计允许"进场时满足条件才触发、触发后按另一套标准维持"的精细控制。
3.2 自定义 Goal 的完整示例
对于内置 Goal(如MeleeAttackGoal、BreedGoal等),模板直接以匿名子类的方式附加条件覆写,见 attack_on_collide.java.ftl:
this.goalSelector.addGoal(priority, new MeleeAttackGoal(this, speed, longMemory) { @Override protected boolean canPerformAttack(LivingEntity entity) { ... } <@conditionCode field$condition false/> });而像fly(飞行追击)这类任务,本身就是内联自定义Goal,起始条件与继续条件被分别写入canUse()与canContinueToUse(),见 attack_fly.java.ftl:
public boolean canUse() { if (target != null && !moveControl.hasWanted()) { // 注入 x/y/z/entity/world 依赖 return <起始条件过程代码,未设置时为 true>; } else { return false; } } @Override public boolean canContinueToUse() { return <继续条件过程代码,未设置时为 true> && moveControl.hasWanted() && target != null && target.isAlive(); }可见:未设置条件时,模板会生成字面量true,即该任务退化为无条件执行;一旦设置了条件过程,则生成"原有判定 && 条件过程"的复合逻辑。整个 1.21.1 生成器中的绝大多数 AI 任务模板(attack_entity、avoid_entity、break_blocks、doors_open、breed等)都通过<#include "aiconditions.java.ftl">复用了同一套宏,因此起始条件行为对全部任务一致。相同机制同样存在于 26.3.x 生成器(generator-26.3.x/neoforge-26.3/utils/aiconditions.java.ftl)。
3.3 从元素到生成的整体链路
从源码结构看,起始条件的完整调用链为:
- 用户在 LivingEntityGUI.java 的 AI 任务面板中编辑 Blockly 任务(
aixml); - 双击条件字段 → field_ai_condition_selector.js →
javabridge.openAIConditionEditor→ AIConditionEditor.java 返回起始条件,继续条件; - 代码生成时,Blockly XML 中的
condition字段值经procedureNamesToObjects解析为过程对象,由 aiconditions.java.ftl 生成canUse()/canContinueToUse()覆写代码; - 生成的实体类在游戏运行期通过 Minecraft Goal 系统执行这些判定。
四、实战设计建议与注意事项
4.1 典型用法示例
- 昼夜行为切换:为"攻击玩家"任务设置起始条件过程,判定
world.getDayTime() % 24000 > 13000(夜晚),实体便只在夜晚发起攻击; - 血线触发:为"逃跑"任务设置起始条件,判定
entity.getHealth() < entity.getMaxHealth() * 0.3,实体仅在低血量时逃离; - 区域限定:借助 x/z 依赖判断实体是否位于某坐标范围内,让任务只在特定区域生效。
这些场景都只需在条件过程中引用编辑器提供的五个依赖参数(x/y/z/world/entity),无需编写任何 Java 代码。
4.2 性能与行为注意事项
- 条件过程每个 tick 都会被调用:
canUse()在 Goal 选择阶段每 tick 执行,因此条件过程应保持轻量,避免放置开销大的循环或复杂计算; - 默认值为
null(不设置):所有任务块的 condition 字段默认值为null,null(field_ai_condition_selector.js),不设置即无条件限制,这是默认且推荐的起步状态; - 起始条件与继续条件职责分离:起始条件决定"何时触发",继续条件决定"何时维持",两者语义不同,混用会导致难以预期的行为(例如把一次性触发条件放进继续条件,会让任务立即被中断);
- 类型必须为 LOGIC:条件选择器只接受返回布尔值(LOGIC 类型)的过程,选择器源码中明确指定了
VariableTypeLoader.BuiltInTypes.LOGIC。
五、Bedrock 版与多语言帮助文档
起始条件机制不仅存在于 Java 版生成器。Bedrock 实体(BEEntity)同样拥有aitasksBlockly 容器(见 BEEntity.java)与 AI 任务面板(见 BEEntityGUI.java),其行为逻辑与 Java 版类似,但底层映射到 Bedrock 的minecraft:behavior.*组件。
此外,本文依据的帮助文档是 MCreator 本地化体系的一部分,同一份文档在 help/default/entity/ai_start_condition.md(英文原版)与 help/zh_CN/entity/ai_start_condition.md(简体中文版:"如果指定了条件,实体只有在条件通过时才会开始执行此任务。")中语义一致。de_DE 德语版(Wenn angegeben, wird die Entität diese Aufgabe nur ausführen, wenn sie diese Bedingung übergeht.)同样是对这一语义的本地化翻译,二者共同印证了该功能在所有语言环境下的统一行为。
六、总结
MCreator 的 AI 起始条件是一个"零代码、高价值"的实体行为开关:它在 Blockly 任务块上以condition字段暴露入口,通过 AI 条件编辑器绑定 LOGIC 过程,最终在生成代码中落地为 Goal 的canUse()判定。借助它,你可以用纯粹的图形化配置,让实体的攻击、逃跑、繁殖、开门等数十种 AI 任务只在指定条件成立时触发,这正是帮助文档那句简短描述背后的完整技术机制。
延伸阅读:继续条件(additional continue condition)与起始条件成对出现,控制任务执行中的存续逻辑,其生成实现同样位于 aiconditions.java.ftl;完整的 AI 任务块清单可浏览 plugins/mcreator-core/aitasks/ 目录,查看各任务的可用参数与字段定义。
- 低代码
- 代码生成
- 桌面应用
- 游戏开发
【免费下载链接】MCreator
MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an integrated code editor. It is used worldwide by Minecraft players, aspiring mod developers, for education, online classes, and STEM workshops.
相关推荐
MCreator GUI 实体模型显示条件(Entity Model Display Condition):条件筛选机制与代码生成原理
MCreator GUI 实体模型显示条件(Entity Model Display Condition):条件筛选机制与代码生成原理 本文围绕 MCreato
低代码代码生成桌面应用游戏开发ng-zorro-antd 步骤条起始序号(nzStartIndex)实战指南:从配置到源码原理
ng zorro antd 步骤条起始序号(nzStartIndex)实战指南:从配置到源码原理 导读 nzStartIndex 是 ng zorro antd
UI组件前端MCreator 方块"骨粉成功条件"(Bonemeal Success Condition)深度解析:判定语义、界面配置与代码生成原理
MCreator 方块"骨粉成功条件"(Bonemeal Success Condition)深度解析:判定语义、界面配置与代码生成原理 导读 本文围绕 MCr
低代码代码生成桌面应用游戏开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考