Fabric 1.21.11中自定义游泳动物实体无法正常移动的解决方法咨询
你好呀!看你描述的情况,自定义鲸鱼实体继承Animal后游泳行为异常,要么不动、要么浮到水面甚至被弹出,还碰到了WaterAnimal基类导入不了的问题,这确实挺头疼的。我来帮你一步步梳理解决思路,不管是想搞定WaterAnimal的导入,还是坚持用Animal基类做水生实体,都有对应的办法。
一、先解决WaterAnimal导入失败的问题(更推荐用这个基类)
其实1.21.11里WaterAnimal并没有消失,大概率是你包路径导错了或者依赖没配对:
- 检查包路径:Minecraft 1.21之后,
WaterAnimal从旧的net.minecraft.entity.animal包迁移到了net.minecraft.entity.passive包下,所以你应该导入net.minecraft.entity.passive.WaterAnimal,而不是原来的路径,旧路径已经被废弃了,这是很多人会踩的坑! - 核对Fabric API版本:确保你的build.gradle里Fabric API的依赖版本和1.21.11完全匹配,比如对应版本的Fabric API应该是0.100.0及以上(比如0.100.1),版本不匹配也会导致类无法解析。
如果搞定了WaterAnimal的导入,直接继承它就省心多了,这个基类已经封装了水生实体的所有核心逻辑(比如游泳移动、重力调整、空气值处理等),你只需要补充鲸鱼的特有属性和行为就行。
二、坚持继承Animal基类的情况下,修复游泳行为
如果暂时没法用WaterAnimal,那我们就手动给Animal子类补上水生实体的必要配置,你目前的设置还差几个关键步骤:
1. 调整实体属性(核心!)
陆地动物的默认重力和游泳属性完全不适合水生生物,必须在属性构建器里修改:
public static AttributeContainer.Builder createAttributes() { return Animal.createAttributes() .add(Attributes.SWIM_SPEED, 0.8D) // 给个合适的游泳速度,根据鲸鱼大小调整 .add(Attributes.GRAVITY, 0.01D); // 大幅降低重力,避免实体快速下沉/浮起失控 }
2. 修正移动控制参数
你用的SmoothSwimmingMoveControl最后一个参数是canJump,鲸鱼是水生实体不需要跳跃,设为false可以避免不必要的跳跃逻辑干扰:
this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.1F, 0.5F, false);
3. 清理并替换目标任务(Goals)
Animal基类默认带了陆地移动的goal(比如WanderAroundGoal),这些会和水生移动逻辑冲突,必须清理并替换成水生相关的goal:
@Override protected void initGoals() { super.initGoals(); // 先清空所有默认的陆地相关goal this.goalSelector.clear(); // 添加基础游泳goal,确保实体能在水里保持浮态 this.goalSelector.add(1, new SwimGoal(this)); // 添加水中漫游的goal,让鲸鱼能自主移动 this.goalSelector.add(2, new WanderAroundWaterGoal(this, 1.0D, 0.0F)); // 这里可以加你的自定义移动goal,比如追逐目标的逻辑 }
4. 重写必要的实体方法
这些方法能避免陆地逻辑干扰水生行为:
// 避免流体推力干扰游泳 @Override public boolean isPushedByFluids() { return false; } // 水生实体不受跌落伤害,避免水里移动触发跌落逻辑 @Override protected boolean handleFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { return true; } // 水里不减速,保持游泳速度 @Override public float getWaterSlowDown() { return 0.0F; } // 明确标记实体可以游泳 @Override public boolean canSwim() { return true; }
5. 调试技巧
如果还是有问题,可以试试这些排查方法:
- 按
F3+B开启碰撞箱显示,看看鲸鱼的碰撞箱是否和模型匹配,有没有卡在地形里 - 打印
moveControl的目标位置和实体当前位置,确认移动控制是否真的接收到了目标指令 - 调整重力参数,比如从
0.01D改成0.005D,找到最适合鲸鱼的漂浮感
总结
优先推荐你搞定WaterAnimal的导入问题,因为这个基类是Minecraft官方为水生实体准备的,省得自己造轮子;如果实在不行,按照上面的步骤调整Animal子类的属性、移动控制和goal,也能让鲸鱼正常游泳。你可以先试试修改包路径解决WaterAnimal的导入问题,这个应该是最快的解决方案!




