Skip to main content

Mind系统

一、MindMachine类

MindMachine 是NPC的“大脑”,负责管理一系列意图(Intention),并根据优先级执行这些意图。


二、Intention类及其子类

Intention 是所有意图的基类,每个意图代表一个行为目标。

1. 基础抽象类

  • Intention(Entity origin, IntentionType type)
  • Intention(Entity origin, IntentionType type, IntentionPriority priority)

关键方法

  • abstract boolean execute():当该意图作为焦点是每tick调用,返回true表示完成,意图将被抛弃。
  • abstract void hold():当有更高优先级意图作为焦点导致当前意图被暂停时每tick调用。

内部可操作属性


2. 内置意图类型

a. SimpleIntention

最基础的意图类型,不带任何具体逻辑,需要自行实现execute()。

b. MoveIntention

让NPC移动到指定位置。

  • 构造方法:
    • MoveIntention(Entity origin, Vec3 pos)
    • MoveIntention(Entity origin, Vec3 pos, IntentionPriority priority)
  • 行为:持续向目标点移动,到达后完成。

c. FollowIntention

  • 构造方法:
    • FollowIntention(Entity origin, Entity target)
    • FollowIntention(Entity origin, Entity target, IntentionPriority priority)
    • FollowIntention(Entity origin, Entity target, double distance)
    • FollowIntention(Entity origin, Entity target, double distance, IntentionPriority priority)
    • FollowIntention(Entity origin, Entity target, double distance, boolean forcedDistance)
    • FollowIntention(Entity origin, Entity target, double distance, boolean forcedDistance, IntentionPriority priority)
  • 行为:持续跟随目标实体,可设置与目标之间的距离以及是否强制保持该距离。

d. MeleeAttackIntention

近战攻击目标实体。

  • 构造方法:
    • MeleeAttackIntention(Entity origin, Entity target)
    • MeleeAttackIntention(Entity origin, Entity target, IntentionPriority priority)
  • 行为:接近目标并进行近战攻击,直到目标死亡或意图被中断。

e. RangeAttackIntention

远程攻击目标实体,支持自定义攻击方式。

  • 构造方法:
    • RangeAttackIntention(Entity origin, Entity target, double distance, BiConsumer<Entity, Entity> attackFunction)
    • RangeAttackIntention(Entity origin, Entity target, double distance, BiConsumer<Entity, Entity> attackFunction, IntentionPriority priority)
  • 参数说明:
  • 行为:在指定距离外攻击目标。

三、IntentionPriority 意图优先级

用于控制意图的执行顺序,值越小优先级越低。

优先级名称描述
NEVER绝不会被执行
LOWEST最低优先级
LOW较低优先级
NORMAL正常优先级
HIGH高优先级
HIGHEST最高优先级
URGENT紧急优先级,插入队列最前

提示:NEVER优先级一般为MindMachine内部使用,除非您确信您知道您在做什么,否则请不要使用该优先级初始化行动。 提示:除URGENT外其他优先级都遵循先加入先执行原则,多个URGENT优先级意图则遵循先加入后执行原则。

四、IntentionType 意图类型

枚举类型,表示意图的基础种类:

  • IDLE:空闲状态
  • MOVE:移动
  • FOLLOW:跟随
  • MELEE:近战
  • RANGE:远程
  • CUSTOM:自定义
  • NONE:无效类型

五、使用示例

示例1:创建MindMachine并添加意图

MindMachine mind = new MindMachine(npcEntity);
mind.addIntention(new MoveIntention(npcEntity, new Vec3(100, 64, 100)));
mind.addIntention(new FollowIntention(npcEntity, playerEntity));

示例2:添加远程攻击意图

mind.addIntention(new RangeAttackIntention(npcEntity, playerEntity, 15, (attacker, target) -> {
// 自定义发射投射物逻辑
}));

示例3:手动Tick更新

// 在NPC的tick方法中调用
mind.tick();

提示:一般而言,NPC的Tick更新由系统托管,除非您确信您知道自己在做什么,否则不建议手动更新。


六、注意事项

  • 每个NPC应拥有独立的MindMachine实例。
  • 意图之间可通过优先级抢占执行权,建议合理分配优先级以避免冲突。
  • 所有意图线程安全地存储于MindMachine中,无需担心并发问题。