ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MCreator 实体“启用 AI 任务“选项详解:开关原理、AI 任务编辑器与 mob base 协同机制

MCreator 实体“启用 AI 任务“选项详解:开关原理、AI 任务编辑器与 mob base 协同机制
  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

【免费下载链接】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 生物实体定义中的Enable AI(启用 AI 任务)选项展开,说明该开关在 Java 版生物(Living Entity)建模中的实际作用、底层代码生成机制,以及它与 AI 任务编辑器(AI Task Builder)、AI 基类(AI Base)之间的协同关系。读完本文,你将掌握该选项的适用场景、如何判断何时应关闭它,并能从源码层面理解勾选/取消勾选后生成代码的差异。

一、选项位置与基本语义

在 MCreator 的生物实体编辑器(Living Entity元素)中,Enable AI是一个位于 AI 参数区域顶部的复选框,UI 中同时以帮助按钮挂接本帮助文档条目。从源码看,它由LivingEntityGUI中的hasAI复选框承载,并通过withEntry("entity/enable_ai")关联到对应帮助文档:

// src/main/java/net/mcreator/ui/modgui/LivingEntityGUI.java#L139 private final JCheckBox hasAI = L10N.checkbox("elementgui.living_entity.has_ai"); // src/main/java/net/mcreator/ui/modgui/LivingEntityGUI.java#L749-L752 JPanel aitop = new JPanel(new GridLayout(3, 1, 0, 2)); aitop.setOpaque(false); aitop.add(PanelUtils.join(FlowLayout.LEFT, HelpUtils.wrapWithHelpButton(this.withEntry("entity/enable_ai"), hasAI)));

该复选框与可繁殖(Breedable)、可驯服(Tameable)、AI 基类(AI Base)同处 AI 参数面板顶部,是实体 AI 体系的总开关。它对应的数据字段定义在实体数据模型中:

// src/main/java/net/mcreator/element/types/LivingEntity.java#L180 public boolean hasAI;

勾选状态通过hasAI.setSelected(livingEntity.hasAI)加载、通过livingEntity.hasAI = hasAI.isSelected()保存(见 LivingEntityGUI.java 与 LivingEntityGUI.java)。

基本语义(帮助文档原文要点):

  • 勾选后,实体的 AI 任务(AI Tasks)会被激活;
  • 未勾选时,在 AI 任务编辑器中定义的所有 AI 任务全部不会生效;
  • 除非你正在制作某种特殊的"技术性实体"(misc entity),否则应当保持该选项启用。

二、关闭后 AI 任务为何全部失效:代码生成层原理

MCreator 的 Java 版生成器(NeoForge)在生成实体类时,直接根据hasAI的值决定两处关键代码。

1. 构造器中的setNoAi()调用

生成模板在实体构造器中写入:

// plugins/generator-1.21.1/neoforge-1.21.1/templates/livingentity/livingentity.java.ftl#L97-L100 public ${name}Entity(EntityType<${name}Entity> type, Level world) { super(type, world); xpReward = ${data.xpAmount}; setNoAi(${(!data.hasAI)});

当hasAI = false时,该行编译为setNoAi(true)——原版 Minecraft 中这会直接关闭实体的 AI 更新逻辑(包括寻路、目标选择、行为目标等)。这一行在neoforge-1.21.1与neoforge-26.3两个生成器中的写法完全一致(见 plugins/generator-26.3.x/neoforge-26.3/templates/livingentity/livingentity.java.ftl)。

2. 条件包裹的registerGoals()与 AI 代码注入

模板进一步用<#if data.hasAI>包裹整个目标注册方法的覆盖:

// plugins/generator-1.21.1/neoforge-1.21.1/templates/livingentity/livingentity.java.ftl#L203-L223 <#if data.hasAI> @Override protected void registerGoals() { super.registerGoals(); <#if aicode??> <#if aiblocks?seq_contains("doors_open") || aiblocks?seq_contains("doors_close")> this.getNavigation().getNodeEvaluator().setCanOpenDoors(true); </#if> ${aicode} </#if> <#if data.ranged> this.goalSelector.addGoal(1, new RangedAttackGoal(this, 1.25, ${data.rangedAttackInterval}, ${data.rangedAttackRadius}f) { ... }); </#if> } </#if>

这里揭示了三层含义:

  • ${aicode}是 AI 任务编辑器中 Blockly 积木被编译后的 Java 代码。它由LivingEntity#getAdditionalTemplateData()中的BlocklyToJava生成(见 LivingEntity.java),所用编辑器类型为BlocklyEditorType.AI_TASK,注册名为aitasks、起始积木为aitasks_container(见 BlocklyEditorType.java)。
  • 未勾选Enable AI时,registerGoals()覆盖方法根本不会被生成,自然也不存在注入 AI 积木代码的问题——这就是"AI 任务编辑器里定义的任务全部失效"的生成层原因。
  • 即使勾选了,若 AI 积木中用到了开关门任务(doors_open/doors_close),生成器还会额外把寻路节点评估器设为可开门,保证 AI 能实际操作门。

三、与 AI 基类(AI Base)的协同:谁会覆盖你的 AI 任务

Enable AI复选框下方是AI 基类(AI Base)下拉框,其可选值受数据模型中的@LimitedOptions约束:

// src/main/java/net/mcreator/element/types/LivingEntity.java#L181-L183 @LimitedOptions({ "(none)", "Bat", "Blaze", "Chicken", "Cow", "Creeper", "Enderman", "Horse", "IronGolem", "MagmaCube", "Ocelot", "Pig", "Skeleton", "Slime", "Spider", "Squid", "Villager", "Witch", "Wolf", "Zombie" }) public String aiBase;

选择某个原版生物作为 AI 基类,会使你的实体行为"像对应的原版生物",但同时也会覆盖部分参数(如掉落物)。因此帮助文档(见 entity/base.md)建议:除非确有需要,应保持默认的(none)。

对Enable AI而言,aiBase有一个重要影响:部分 AI 基类的 AI 行为不可自定义。生成器定义中声明了不可修改 AI 基类列表:

# plugins/generator-1.21.1/neoforge-1.21.1/livingentity.definition.yaml#L25 unmodifiable_ai_bases: [ Bat, MagmaCube, Slime ]

对应地,LivingEntity在生成 AI 代码时会做判断——若当前aiBase属于该列表,则不把 AI 任务编辑器中的积木编译成代码(aicode为空字符串),并在 UI 中显示一条"AI 不可修改"的编译提示(见 LivingEntity.java 与 LivingEntityGUI.java)。也就是说:选了蝙蝠/岩浆怪/史莱姆这类基类时,Enable AI只能控制其整体 AI 是否激活,具体行为由基类决定,无法再靠 AI 任务积木叠加。

四、什么时候应该关闭 Enable AI

帮助文档给出了明确的指导原则:除非你在做某种特殊实体,否则保持启用。结合源码可以归纳出几类典型场景:

  • 纯展示/装饰性实体:不希望实体自主移动、寻路或攻击,只需静态存在(如建筑装饰、动画演示物)。
  • 行为完全由自定义流程(Procedure)驱动的实体:当实体的移动、交互都由"实体更新时(on tick update)"等事件流程控制,原版 AI 反而可能干扰自定义逻辑。
  • 技术性实体(misc entity):作为其他机制的一部分存在,不需要任何自主行为。

关闭后请注意两点连带影响:

  1. 实体不会再执行任何registerGoals()逻辑,aiBase提供的原版行为同样不会生效;
  2. AI 任务编辑器中的积木即使搭好也不参与代码生成(但积木 XML 仍保存在aixml字段中,重新勾选后可恢复生效)。

五、实战:AI 任务编辑器与任务块分类

启用Enable AI后,真正的行为定义来自 AI 任务编辑器。该编辑器由BlocklyEditorType.AI_TASK定义(注册名aitasks),在 LivingEntityGUI.java 中通过BlocklyPanel加载,并监听变化实时重新编译:

blocklyPanel.addChangeListener( _ -> new Thread(() -> regenerateBlockAssemblies(true), "AITasksRegenerate").start());

任务积木库存放在 plugins/mcreator-core/aitasks/ 目录,按功能分为 7 大类(以$开头的 JSON 定义分类元数据):

分类文件代表任务积木
$basictasks.json基础行为类
$combattasks.jsonattack_entity(攻击指定实体)、attack_on_collide(碰撞攻击)、attack_with_range(远程攻击)等
$movementtasks.jsonwander(随机游荡)、fly(飞行)、swim_in_water(游泳)、leap_at_target(扑向目标)等
$targettasks.json目标选择类,如follow_entity、follow_owner、watch_closest_entity
$parentownertasks.json与主人/亲子相关的跟随、保护类任务(protect_owner、fight_as_owner、follow_parent)
$villagetasks.json村庄行为类(move_indoors、doors_open/doors_close/doors_break)
$othertasks.json其他杂项(如panic_when_attacked、restrict_sun、avoid_entity、eat_grass)

每个任务积木都是一个 JSON 定义文件。以attack_entity为例(见 plugins/mcreator-core/aitasks/attack_entity.json),它提供insight(是否无视遮挡视线)、nearby(是否仅附近目标)、entity(目标实体选择)和condition(附加条件流程)等参数,并归入combattasks工具盒子。任务积木通常可以串联(previousStatement/nextStatement),形成从上到下依次执行的 AI 行为序列。

六、核心要点速览

问题结论
Enable AI 不勾选会怎样?构造器生成setNoAi(true),registerGoals()覆盖方法不生成,AI 任务编辑器内容全部不生效
如何重新启用?重新勾选即可,AI 任务积木 XML(aixml)仍保留
什么情况应关闭?制作无自主行为的装饰性/技术性实体,或行为完全由 Procedure 驱动时
与 AI Base 的关系AI 基类为Bat/MagmaCube/Slime时 AI 不可自定义;aiBase为(none)时行为完全由 AI 任务积木决定
生成的代码在哪里看?生成工作空间的实体类中,构造器内setNoAi(...)与registerGoals()方法

七、延伸阅读:相关源码索引

  • UI 实现与帮助按钮挂接:LivingEntityGUI.java 、LivingEntityGUI.java
  • 数据模型字段定义:LivingEntity.java
  • AI 代码编译与模板数据注入:LivingEntity.java
  • NeoForge 代码生成模板(1.21.1):livingentity.java.ftl
  • NeoForge 代码生成模板(26.3):livingentity.java.ftl
  • 生成器定义中的不可修改 AI 基类:livingentity.definition.yaml
  • AI 任务编辑器类型定义:BlocklyEditorType.java
  • AI 任务积木库:plugins/mcreator-core/aitasks/
  • 相邻帮助文档:AI 基类说明 entity/base.md、生物类型说明 entity/behaviour.md
  • 低代码
  • 代码生成
  • 桌面应用
  • 游戏开发

【免费下载链接】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
点击查看免费下载

相关推荐

上一篇:终极Sei Chain路线图解读:探索未来技术突破与生态扩张全景
下一篇:phenomenon调试与问题排查:常见WebGL错误及解决方案

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进