实体的模型要如何一个格式多平台通用?透过Geckolib这个模块可以有效解决这个问题。
简单来说,只要是用Blockbecnh制作的模型,透过Geckolib就可以同时用在Java版模块和基岩版的Add-On,还能够制作实体动画。
(左为Java版画面,右边为基岩版画面)
这篇文章以Fabric为基础,教学如何在Minecraft 1.17.1中加入实体,并用Geckolib来套用模型。
文章目录
1. 注意事项
2. 准备模型文件
3. 在fabric项目中加入Gecolib依赖项目
4. fabric实体的主程序写法
1. 注意事项
开发模块使用Geckolib的话,别人玩你的模块前就必须安装Geckolib这个前置模块。
Geckolib有分forge版跟fabric版,下载时请抓有写”fabric”的版本。
2. 准备模型文件
要制作跨平台模型,应以基岩版格式为基础,因为能无痛转换成Geckolib格式。
转换现有的模型:
Blockbench安装”Geckolib Animation Utils”插件。
2. 按Files -> Convert Project,选择”Geckolib Animated Model”
3. 按Files -> Export -> Export Geckolib Model
会得到一个json文件,里面只有记载模型信息。材质的png文件要另外导出。
如果有动画文件,在Animation皮肤按下 Animation -> Export Animations,同样会得到一个json文件。
4. fabric模块的材质大部分都在src/main/resources/assests/模块ID/。
在这个例子中,
我将模型文件放在geo文件夹里,叫做”shimakaze.json”。
材质放在/entity/kanmusu/,叫做”shimakaze.png”
动画放在animations,叫做”shimakaze.animation.json”
3. 在fabric项目中加入Geckolib依赖项目
1. 开启项目的build.gradle,加入Geckolib:
repositories { maven { url ‘https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/’ } }
dependencies { modImplementation ‘software.bernie.geckolib:geckolib-fabric-1.17:3.0.13:dev’ } |
2. 开启fabric.mod.json,注明要使用Geckolib。
fabric.mod.json可以不声明依赖Geckolib,但若出错游戏就会直接崩溃,而不是由Fabric提示玩家缺少Geckolib模块。
“depends”: { “fabricloader”: “>=0.11.6”, “fabric”: “*”, “minecraft”: “1.17.x”, “java”: “>=16”, “geckolib3”: “*” } |
fabric中创建实体需要以下文件:
- 注册实体的class
- 注册渲染器的class (需在fabric.mod.json注明client entry)
- 渲染器的class
- 模型的lass
我的目录结构长这样:
模块会从Main.java开始,接着会调用ModEntities的registerEntities()方法,用这个class来注册实体(->ShimakazeEntity.java)。
同时,EntityClinet.java会在初始化时注册渲染器(->ShimakazeRenderer.java)。
ShimakazeEntity.java包含注册实体的方法,以及定义实体的行为程序,但这里仅加入一个静止实体。
ShimakazeModel.java为最关键的一步,使用Geckolib来创造模型、材质、动画。
ModEntities.java:
package net.mcbedev.kancolle.client;
import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; import net.mcbedev.kancolle.Main; import net.mcbedev.kancolle.client.entity.ShimakazeEntity; import net.minecraft.entity.EntityDimensions; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry;
public class ModEntities {
// 注册实体 public static final EntityType<ShimakazeEntity> SHIMAKAZE = Registry.register(Registry.ENTITY_TYPE, new Identifier(Main.MOD_ID, “shimakaze”), FabricEntityTypeBuilder .create(SpawnGroup.CREATURE, ShimakazeEntity::new).dimensions(EntityDimensions.fixed(0.5f, 2f)).build());
public static void registerEntities() { // 注册实体属性 FabricDefaultAttributeRegistry.register(SHIMAKAZE, ShimakazeEntity.createMobAttributes()); System.out.println(“Registering mod mobs for” + Main.MOD_ID); }
}
|
package net.mcbedev.kancolle.client;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.client.rendering.EntityRendererRegistryImpl; import net.mcbedev.kancolle.client.renderer.ShimakazeRenderer;
@Environment(EnvType.CLIENT) public class EntityClient implements ClientModInitializer {
@Override public void onInitializeClient() { //注册渲染器 EntityRendererRegistryImpl.register(ModEntities.SHIMAKAZE, ShimakazeRenderer::new);
} } |
ShimakazeEntity.java:
package net.mcbedev.kancolle.client.entity;
import net.minecraft.entity.EntityType; import net.minecraft.entity.mob.PathAwareEntity; import net.minecraft.world.World; import software.bernie.geckolib3.core.IAnimatable; import software.bernie.geckolib3.core.manager.AnimationData; import software.bernie.geckolib3.core.manager.AnimationFactory;
public class ShimakazeEntity extends PathAwareEntity implements IAnimatable { private AnimationFactory factory = new AnimationFactory(this);
public ShimakazeEntity(EntityType<? extends PathAwareEntity> type, World worldIn) { super(type, worldIn); this.ignoreCameraFrustum = true; }
@Override public AnimationFactory getFactory() { return this.factory; }
@Override public void registerControllers(AnimationData arg0) {
} } |
package net.mcbedev.kancolle.client.renderer;
import net.mcbedev.kancolle.client.entity.ShimakazeEntity; import net.mcbedev.kancolle.client.model.ShimakazeEntityModel; import net.minecraft.client.render.entity.EntityRendererFactory; import software.bernie.geckolib3.renderers.geo.GeoEntityRenderer;
public class ShimakazeRenderer extends GeoEntityRenderer<ShimakazeEntity> { public ShimakazeRenderer(EntityRendererFactory.Context renderManager) { super(renderManager, new ShimakazeEntityModel()); } } |
ShimakazeModel.java,跟第一步骤准备的路径要一致。
package net.mcbedev.kancolle.client.model;
import net.mcbedev.kancolle.client.entity.ShimakazeEntity; import net.minecraft.util.Identifier; import software.bernie.geckolib3.model.AnimatedGeoModel;
public class ShimakazeEntityModel extends AnimatedGeoModel<ShimakazeEntity> {
@Override public Identifier getModelLocation(ShimakazeEntity object) { return new Identifier(“kancollemod”, “geo/shimakaze.json”); }
@Override public Identifier getTextureLocation(ShimakazeEntity object) { return new Identifier(“kancollemod”, “textures/entity/kanmusu/shimakaze.png”); }
@Override public Identifier getAnimationFileLocation(ShimakazeEntity animatable) { return new Identifier(“kancollemod”, “animations/shimakaze.animation.json”); } } |
在处理完import的问题之后,实际在游戏中测试,用指令/summon kancolle:shimakaze,会召唤静止状态的岛风。
本文来自网络,不代表3楼猫立场,转载请注明出处:https://www.3loumao.org/16538.html