☰
MCreator 实体 AI 起始条件(AI Start Condition)实战指南:从 Blockly 配置到 Goal 代码生成原理
2026/10/16 2:47:06 网站建设 项目流程
  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

【免费下载链接】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.

项目地址:https://gitcode.com/gh_mirrors/mc/MCreator
点击查看免费下载

导读

本文围绕 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 从元素到生成的整体链路

从源码结构看,起始条件的完整调用链为:

  1. 用户在 LivingEntityGUI.java 的 AI 任务面板中编辑 Blockly 任务(aixml);
  2. 双击条件字段 → field_ai_condition_selector.js →javabridge.openAIConditionEditor→ AIConditionEditor.java 返回起始条件,继续条件;
  3. 代码生成时,Blockly XML 中的condition字段值经procedureNamesToObjects解析为过程对象,由 aiconditions.java.ftl 生成canUse()/canContinueToUse()覆写代码;
  4. 生成的实体类在游戏运行期通过 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.

项目地址:https://gitcode.com/gh_mirrors/mc/MCreator
点击查看免费下载

相关推荐

上一篇:zsh-completions 与 Spring Boot:mvn 补全增强
下一篇:awesome-prometheus-alerts密钥轮换监控规则详解

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询