Mind系统
一、MindMachine类
MindMachine 是NPC的“大脑”,负责管理一系列意图(Intention),并根据优先级执行这些意图。
构造函数
- MindMachine(Entity origin):创建一个MindMachine实例,绑定到某个实体(NPC)。
主要方法
- addIntention(Intention intention):添加一个意图到队列中,会根据优先级自动排序。
- tick():每Tick调用一次,触发意图执行。
- interrupt():中断当前正在执行的意图,并移除它。
二、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)
- 参数说明:
- attackFunction:自定义攻击逻辑,例如发射弹射物等。
- 行为:在指定距离外攻击目标。
三、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中,无需担心并发问题。