zh
切换语言
  1. PowerNukkitX
  2. 快速入门
  3. 服务器配置

    1. server.properties
    2. nukkit.yml
    3. pnx-cli-config.ini
    4. 反矿透
    5. 资源包加密
    6. 硬件加速压缩
    7. 使用WaterDogPE
    8. 超平坦世界
  4. FAQ

    1. 新人必看
    2. PNX-CLI教程
    3. 常见问题
    4. Terra问题
    5. 重生点问题
    6. 转换地图
  5. 开发者文档

    1. Java

      1. 跳转到JavaDoc
      2. Mod API

        1. 自定义方块
        2. 自定义物品
        3. 自定义实体
        4. 自定义附魔
      3. 生物AI

        1. 行为
        2. 记忆
        3. 传感器
        4. 运动控制器
        5. 寻路器
        6. 行为组
        7. 工作周期
    2. JavaScript

      1. 配置开发环境
      2. 基于LLSELib开发
      3. Hello World
      4. 基本知识
      5. 事件监听
      6. 常见开发问题
    3. API

      1. 简介
      2. 通用API
      3. Git-API
      4. 下载API
      5. 延迟返回API
      6. 插件API
    4. 实用资源

      1. 事件对照表
      2. 物品方块ID

第七章 工作周期

author: daoge_cmd

了解完所有组件后,我们最后来研究下AI的工作周期

1.0 什么是工作周期

在开始内容之前,我们先明确下工作周期的概念

工作周期,类似于游戏刻gametick,在一个工作周期中,AI会完成包括但不限于以下内容:

所有工作都是并行的,我们需要结合源码继续介绍:

1.1 asyncPrepare()方法

asyncPrepare()方法在实体之间并行运行。其完成了一个工作周期的全部内容

详细如下:

public class EntityIntelligent{

    /**
     * 此处省略其他方法
     */
    
    @Override
    public void asyncPrepare(int currentTick) {
        // 计算是否活跃
        isActive = level.isHighLightChunk(getChunkX(), getChunkZ());
        if (!this.isImmobile()) { // immobile会禁用实体AI
            var behaviorGroup = getBehaviorGroup();
            if (behaviorGroup == null) return;
            behaviorGroup.collectSensorData(this);
            behaviorGroup.evaluateCoreBehaviors(this);
            behaviorGroup.evaluateBehaviors(this);
            behaviorGroup.updateRoute(this);
            behaviorGroup.tickRunningCoreBehaviors(this);
            behaviorGroup.tickRunningBehaviors(this);
            behaviorGroup.applyController(this);
            if (EntityAI.checkDebugOption(EntityAI.DebugOption.BEHAVIOR)) behaviorGroup.debugTick(this);
        }
        super.asyncPrepare(currentTick);
    }
}

整理一下,我们可以总结出在一个工作周期中先后做了哪些事:

1.2 题外话: 关于调试模式

框架存在一个“DEBUG模式”,在此模式下,生物名称将显示当前行为运行情况,当你拿木棍右键实体时将出现一个弹窗,显示有关此实体的信息

你可以通过设置nukkit.yml中的debug.commandstrue并在游戏中使用命令/debug entity <option> true来开启调试模式


© PowerNukkitX 开发组