======模型生成====== 你可以通过 ''[[https://github.com/FabricMC/fabric/blob/1.19.2/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestEntrypoint.java|FabricModelProvider]]'' 类轻松地生成方块(包括动态方块属性)和物品模型。 开始之前,我们创建一个类来继承(extends) ''FabricModelProvider'' ,然后像这样在数据根入口(datagen entrypoint)注册它: private static class MyModelGenerator extends FabricModelProvider { private MyModelGenerator(FabricDataGenerator generator) { super(generator); } @Override public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) { // ... } @Override public void generateItemModels(ItemModelGenerator itemModelGenerator) { // ... } } // ... @Override public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { // ... fabricDataGenerator.addProvider(MyModelGenerator::new); // ... } =====添加方块模型===== ''BlockStateModelGenerator'' 类包含了很多创建方块模型的方法。在本例中,我们将会创建一个每个面都相同的方块,也就是 JSON 中的 ''minecraft:block/cube_all''。 public static Block SIMPLE_BLOCK = Registry.register(Registries.BLOCK, new Identifier("tutorial", "simple_block"), new Block(...)); public static BlockItem SIMPLE_BLOCK_ITEM = Registry.register(Registries.ITEM, ..., new BlockItem(SIMPLE_BLOCK, ...)); // ... @Override public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) { blockStateModelGenerator.registerSimpleCubeAll(SIMPLE_BLOCK); } 因为 ''SIMPLE_BLOCK'' 的 ''BlockItem'' 已经存在并且已经注册,所以会自动生成一个物品模型,该物品模型直接继承方块模型。这可以在 ''generateItemModels'' 方法中重写。 ====严格验证===== 默认情况下,如果运行过程中,没有为所有属于被处理的模组的方块生成方块模型,数据生成将报错。Fabric API 允许禁用该功能。为此,请编辑你的 ''build.gradle'' 文件,删除 ''loom {}'' 块中的 VM 参数 ''-Dfabric-api.datagen.strict-validation''。 =====添加物品模型===== ''ItemModelGenerator'' 包含了其他的多种创建物品模型的方法。 在这个例子中,我们重写上一个例子中的 ''SIMPLE_BLOCK'' 方块模型生成的物品模型。我们将从 ''SIMPLE_BLOCK_ITEM'' 生成一个物品模型。 public static Block SIMPLE_BLOCK = Registry.register(Registries.BLOCK, new Identifier("tutorial", "simple_block"), new Block(...)); public static BlockItem SIMPLE_BLOCK_ITEM = Registry.register(Registries.ITEM, ..., new BlockItem(SIMPLE_BLOCK, ...)); // ... @Override public void generateItemModels(ItemModelGenerator itemModelGenerator) { itemModelGenerator.register(SIMPLE_BLOCK_ITEM, Models.GENERATED); } FIXME //**正在施工中**// ==== 为带有朝向的方块添加数据生成 ==== **警告**:这将非常复杂!!! 在本例中,我们将为 ''MACHINE_BLOCK'' 生成带有朝向的方块模型。 首先,添加方块自身并且注册它。 // 在 Tutorial 类(或者你自己的模组的初始化类中) public static final Block MACHINE_BLOCK = new Block(FabricBlockSettings.copy(Blocks.BLAST_FURNACE)); @Override public void onInitialize() { Registry.register(Registries.BLOCK, new Identifier("tutorial", "machine"), MACHINE_BLOCK); } 现在我们成功地注册好了方块,让我们向好的方向发展! private static class MyModelGenerator extends FabricModelProvider { private MyModelGenerator(FabricDataGenerator generator) { super(generator); } @Override public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) { // ... blockStateModelGenerator.blockStateCollector.accept(MultipartBlockStateSupplier.create(Tutorial.MACHINE_BLOCK) .with(When.create().set(Properties.HORIZONTAL_FACING, Direction.NORTH), BlockStateVariant.create().put(VariantSettings.X, VariantSettings.Rotation.X))); } @Override public void generateItemModels(ItemModelGenerator itemModelGenerator) { // ... } }