我们今天简单介绍一下MC中的一些生物智能,以及实现一个自定义AI到自己的生物身上
猫狗会被驯服,僵尸会被太阳晒,墨鱼会游泳,劫掠兽会进行AOE攻击…
1.首先,我的世界的所有的生物ai都会使用addGoal函数添加:
//参数:ai优先级(越小越优先),特定ai函数
this.goalSelector.addGoal(1, new EntityUrias.AttackGoal(this));
所有的ai基本都在registerGoals()中进行声明与注册:
//ai注册函数
@Override
protected void registerGoals() {
super.registerGoals();
//行为选择器goalSelector
this.goalSelector.addGoal(1, new EntityUrias.AttackGoal(this));
this.goalSelector.addGoal(1, new RandomLookAroundGoal(this));
this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 8.0F));
//this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 0, false, false, LIVING_ENTITY_SELECTOR));
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D));
//攻击目标选择器targetSelector
this.targetSelector.addGoal(1, (new HurtByTargetGoal(this)).setAlertOthers(ZombifiedPiglin.class));
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false));
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true));
}
2.一般来讲生物的行为选择器的可用ai大致包括这些:
| 优先级 |
名称 |
| 0 |
FloatGoal(水面漂浮) |
| 1 |
PanicGoal(受到伤害,被攻击后会逃跑) |
| 2 |
BreedGoal (可被喂养) |
| 3 |
TemptGoal(跟随小麦) |
| 4 |
LandOnOwnersShoulderGoal(落到主人肩膀上) |
| 5 |
EatBlockGoal(吃草) |
| 6 |
WaterAvoidingRandomStrollGoal(在水中不会随便活动) |
| 7 |
LookAtPlayerGoal(看着玩家) |
| 8 |
FollowOwnerGoal(跟随主人) |
| 9 |
RandomLookAroundGoal(四下张望) |
3.一般生物的目标选择器的可用ai大致包括这些:
| 优先级 |
名称 |
| 0 |
HurtByTargetGoal(可被攻击) |
| 1 |
NearestAttackableTargetGoal (最近攻击单位) |
| 2 |
AttackGoal (攻击行为ai) |
4.为了自定义一个我们的ai,专门用于攻击其他生物,可以在我们的生物类中新建一个AttackGoal类:
static class AttackGoal extends Goal {
//这里为我们的生物
private final EntityDund parentEntity;
protected int attackTimer = 0;
//这里为我们的生物