zh_cn:tutorial:datagen_model
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
zh_cn:tutorial:datagen_model [2025/04/01 14:51] – [先从最简单的开始] solidblock | zh_cn:tutorial:datagen_model [2025/04/01 15:47] (current) – [模型生成] solidblock | ||
---|---|---|---|
Line 6: | Line 6: | ||
> :!: **注意:**我们在之前的教程中,在 '' | > :!: **注意:**我们在之前的教程中,在 '' | ||
- | ===== 先从最简单的开始 | + | > :!: **注意:**从 1.21.4 开始,数据生成会区分客户端和服务器,原版中与模型有关的类都会被加上 '' |
+ | ===== 准备 | ||
首先,先创建一个类,继承 '' | 首先,先创建一个类,继承 '' | ||
Line 40: | Line 41: | ||
</ | </ | ||
- | ==== 简单的方块模型 ==== | + | ===== 简单的方块模型 |
我们在 [[blocks]] 的教程中创建过一个示例方块。那么在这里,我们使用短短几行代码,为它创建方块状态映射和方块模型: | 我们在 [[blocks]] 的教程中创建过一个示例方块。那么在这里,我们使用短短几行代码,为它创建方块状态映射和方块模型: | ||
<code java TutorialModelGenerator.java> | <code java TutorialModelGenerator.java> | ||
Line 62: | Line 63: | ||
</ | </ | ||
- | ==== 简单的物品模型(1.21.4 之后) ==== | + | ===== 简单的物品模型(1.21.4 之后) |
生成物品模型也很简单: | 生成物品模型也很简单: | ||
<code java TutorialModelGenerator.java> | <code java TutorialModelGenerator.java> | ||
Line 83: | Line 84: | ||
</ | </ | ||
- | =====添加方块模型===== | + | ===== 常见的原版方块模型(以楼梯和台阶为例) |
- | '' | + | 有时方块模型并不简单,因为涉及多种复杂的方块状态。例如,楼梯就有多种朝向,可以是东南西北,可以是正放或倒放,而且还可以是角落的。我们自己去为这些方块创建模型和方块状态映射显然会很费神。好在这些常用的方块,原版已经给我们写好了,我们只需要使用就可以。这里以楼梯和台阶为例,我们为钻石块创建相应的楼梯和台阶。首先,我们先快速地创建这些方块: |
- | <code java> | + | 对于 1.21.2 及之后的版本: |
- | public static Block SIMPLE_BLOCK | + | <code java TutorialBlocks.json> |
- | public static | + | public static |
- | // ... | + | settings -> new StairsBlock(Blocks.DIAMOND_BLOCK.getDefaultState(), settings), |
+ | AbstractBlock.Settings.copy(Blocks.DIAMOND_BLOCK)); | ||
+ | public static | ||
+ | SlabBlock::new, | ||
+ | AbstractBlock.Settings.copy(Blocks.DIORITE_SLAB)); | ||
+ | </code> | ||
- | @Override | + | |
- | public | + | 对于 1.21.2 之前的版本: |
- | blockStateModelGenerator.registerSimpleCubeAll(SIMPLE_BLOCK); | + | <code java TutorialBlocks.json> |
- | } | + | |
+ | new StairsBlock(Blocks.DIAMOND_BLOCK.getDefaultState(), | ||
+ | | ||
+ | | ||
+ | new SlabBlock(AbstractBlock.Settings.copy(Blocks.DIORITE_SLAB))); | ||
</ | </ | ||
- | 因为 '' | + | 然后,我们先分别创建常规楼梯模型、内角落楼梯模型、外角落楼梯模型、底台阶模型、顶台阶模型。双台阶模型我们直接使用原版的钻石块模型。创建这些模型时,会返回模型的 id,然后使用 |
- | ====严格验证===== | + | <code java TutorialModelGenerator.json> |
+ | final TextureMap diamondTexture | ||
+ | |||
+ | final Identifier stairsModelId | ||
+ | final Identifier innerStairsModelId | ||
+ | final Identifier outerStairsModelId | ||
+ | blockStateModelGenerator.blockStateCollector.accept( | ||
+ | BlockStateModelGenerator.createStairsBlockState(TutorialBlocks.DIAMOND_STAIRS, | ||
+ | BlockStateModelGenerator.createWeightedVariant(innerStairsModelId), | ||
+ | BlockStateModelGenerator.createWeightedVariant(stairsModelId), | ||
+ | BlockStateModelGenerator.createWeightedVariant(outerStairsModelId))); | ||
+ | blockStateModelGenerator.registerParentedItemModel(TutorialBlocks.DIAMOND_STAIRS, | ||
- | 默认情况下,如果运行过程中,没有为所有属于被处理的模组的方块生成方块模型,数据生成将报错。Fabric API 允许禁用该功能。为此,请编辑你的 '' | + | final Identifier slabBottomModelId = Models.SLAB.upload(TutorialBlocks.DIAMOND_SLAB, |
- | =====添加物品模型===== | + | final Identifier slabTopModelId |
+ | blockStateModelGenerator.blockStateCollector.accept( | ||
+ | BlockStateModelGenerator.createSlabBlockState(TutorialBlocks.DIAMOND_SLAB, | ||
+ | BlockStateModelGenerator.createWeightedVariant(slabBottomModelId), | ||
+ | BlockStateModelGenerator.createWeightedVariant(slabTopModelId), | ||
+ | BlockStateModelGenerator.createWeightedVariant(Identifier.ofVanilla(" | ||
+ | ); | ||
+ | blockStateModelGenerator.registerParentedItemModel(TutorialBlocks.DIAMOND_SLAB, | ||
+ | </ | ||
- | '' | + | > 在 1.21.4 及之前的版本中,不需要调用 |
- | 在这个例子中,我们重写上一个例子中的 '' | + | 大功告成!我们就仅仅通过这么几行代码,成功地添加了楼梯和台阶所需要的一切模型、方块状态映射和物品模型映射! |
- | <code java> | + | ===== 带有朝向的方块(以竖直台阶为例) ===== |
- | public static Block SIMPLE_BLOCK | + | |
- | public static BlockItem SIMPLE_BLOCK_ITEM | + | |
- | // ... | + | |
- | @Override | + | 带有朝向的方块通常仅使用一个方块模型,但是在方块模型映射中,会映射到不同的模型变种,例如不同的 x 旋转、y 旋转以及 uvlock。(这些词是不是在之前手动写方块状态映射的 JSON 时有些熟悉?) |
- | public | + | |
- | itemModelGenerator.register(SIMPLE_BLOCK_ITEM, Models.GENERATED); | + | 我们以 [[directionalblock]] 中创建的竖直台阶为例,通过数据生成器为其生成模型和方块状态映射。 |
+ | |||
+ | ==== 自定义模型 ==== | ||
+ | |||
+ | 我们之前创建过一个 '' | ||
+ | |||
+ | 为了在数据生成器中继承此模板模型,我们需要为此模板模型创建 '' | ||
+ | <code java TutorialModelGenerator.java> | ||
+ | public class TutorialModelGenerator extends FabricModelProvider { | ||
+ | | ||
+ | Optional.of(Identifier.of(" | ||
+ | | ||
+ | TextureKey.BOTTOM, TextureKey.TOP, | ||
+ | |||
+ | // ... | ||
} | } | ||
</ | </ | ||
- | FIXME //**正在施工中**// | + | 然后再调用 '' |
+ | <code java TutorialModelGenerator.java> | ||
+ | @Override | ||
+ | public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) { | ||
+ | | ||
+ | |||
+ | final Identifier verticalSlabModelId = VERTICAL_SLAB.upload(TutorialBlocks.POLISHED_ANDESITE_VERTICAL_SLAB, | ||
+ | blockStateModelGenerator.registerParentedItemModel(TutorialBlocks.POLISHED_ANDESITE_VERTICAL_SLAB, | ||
+ | } | ||
+ | </code> | ||
- | ==== 为带有朝向的方块添加数据生成 | + | ==== 自定义方块状态映射(1.21.5 之后) |
+ | 重头戏来了——现在我们要为竖直台阶方块创建方块状态映射。其实没那么复杂,因为我们知道模型都是一样的,只需要有不同的旋转而已。 | ||
- | **警告**:这将非常复杂!!! | + | 在 1.21.5 中,方块状态的对象是 '' |
+ | | ||
+ | | ||
- | 在本例中,我们将为 | + | 对于 |
+ | * **方法一**:先指定一个模型变种,然后再根据方块状态修改其变种,如 x 旋转、y 旋转和 uvlock,各方块状态都使用同一模型 id,只是变种可能不同。 | ||
+ | * **方法二**:直接为不同的方块状态分配模型变种,然后仍可继续根据方块状态修改变种。这种情况下,各方块状态可以使用不同的模型 | ||
- | 首先,添加方块自身并且注册它。 | + | 我们的竖直台阶有两个方块状态属性:'' |
+ | <code java TutorialModelGenerator.java> | ||
+ | @Override | ||
+ | public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) { | ||
+ | // ... | ||
+ | |||
+ | blockStateModelGenerator.blockStateCollector.accept( | ||
+ | VariantsBlockModelDefinitionCreator.of(TutorialBlocks.POLISHED_ANDESITE_VERTICAL_SLAB, | ||
+ | BlockStateModelGenerator.createWeightedVariant(verticalSlabModelId)) | ||
+ | .apply(BlockStateModelGenerator.UV_LOCK) | ||
+ | .coordinate(BlockStateVariantMap.operations(VerticalSlabBlock.FACING) | ||
+ | .register(Direction.NORTH, | ||
+ | .register(Direction.EAST, | ||
+ | .register(Direction.SOUTH, | ||
+ | .register(Direction.WEST, | ||
+ | } | ||
+ | </ | ||
- | <code java> | + | 这里的 '' |
- | // 在 Tutorial 类(或者你自己的模组的初始化类中) | + | |
- | public static final Block MACHINE_BLOCK = new Block(FabricBlockSettings.copy(Blocks.BLAST_FURNACE)); | + | |
- | @Override | + | > 可以使用方法二吗?当然可以,代码如下: |
- | public void onInitialize() { | + | > <code java TutorialModelGenerator.java> |
- | | + | blockStateModelGenerator.blockStateCollector.accept( |
- | } | + | VariantsBlockModelDefinitionCreator.of( |
+ | TutorialBlocks.POLISHED_ANDESITE_VERTICAL_SLAB) | ||
+ | | ||
+ | | ||
+ | .register(Direction.EAST, BlockStateModelGenerator.createWeightedVariant(verticalSlabModelId).apply(BlockStateModelGenerator.ROTATE_Y_90)) | ||
+ | .register(Direction.SOUTH, BlockStateModelGenerator.createWeightedVariant(verticalSlabModelId).apply(BlockStateModelGenerator.ROTATE_Y_180)) | ||
+ | | ||
+ | ) | ||
+ | .apply(BlockStateModelGenerator.UV_LOCK) | ||
+ | ); | ||
</ | </ | ||
+ | > 我们发现,在方法二中,调用 '' | ||
- | 现在我们成功地注册好了方块,让我们向好的方向发展! | + | 在上面的方法一和方法二中,除了通过 '' |
- | <code java> | + | 如果方块状态有多个属性,多个属性都会影响到模型变种,那么可以直接在 '' |
- | 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, | + | |
- | BlockStateVariant.create().put(VariantSettings.X, | + | |
- | } | + | |
- | + | ||
- | @Override | + | |
- | public void generateItemModels(ItemModelGenerator itemModelGenerator) { | + | |
- | // ... | + | |
- | } | + | |
- | } | + | |
- | </ | + |
zh_cn/tutorial/datagen_model.1743519083.txt.gz · Last modified: 2025/04/01 14:51 by solidblock