【攻略】Fabric + Geckolib模块添加生物实体

实体的模型要如何一个格式多平台通用?透过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”: “*”
  }


4. fabric实体的主程序写法

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);
  }

}

EntityClient.java:
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) {

    }
}

ShimakazeRenderer.java:
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
返回顶部