實體的模型要如何一個格式多平台通用?透過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?variant=zh-tw