User Tools

Site Tools


zh_cn:tutorial:datagen_model

模型生成

你可以通过 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_BLOCKBlockItem 已经存在并且已经注册,所以会自动生成一个物品模型,该物品模型直接继承方块模型。这可以在 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) {
		// ...
	}
}
zh_cn/tutorial/datagen_model.txt · Last modified: 2023/02/24 10:41 by hanatomizu