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 15:03] – solidblock | zh_cn:tutorial:datagen_model [2025/04/01 15:47] (current) – [模型生成] solidblock | ||
---|---|---|---|
Line 6: | Line 6: | ||
> :!: **注意:**我们在之前的教程中,在 '' | > :!: **注意:**我们在之前的教程中,在 '' | ||
+ | > :!: **注意:**从 1.21.4 开始,数据生成会区分客户端和服务器,原版中与模型有关的类都会被加上 '' | ||
===== 准备 ===== | ===== 准备 ===== | ||
Line 137: | Line 138: | ||
大功告成!我们就仅仅通过这么几行代码,成功地添加了楼梯和台阶所需要的一切模型、方块状态映射和物品模型映射! | 大功告成!我们就仅仅通过这么几行代码,成功地添加了楼梯和台阶所需要的一切模型、方块状态映射和物品模型映射! | ||
- | ===== 为带有朝向的方块 ===== | + | ===== 带有朝向的方块(以竖直台阶为例) |
- | **警告**:这将非常复杂!!! | + | 带有朝向的方块通常仅使用一个方块模型,但是在方块模型映射中,会映射到不同的模型变种,例如不同的 x 旋转、y 旋转以及 uvlock。(这些词是不是在之前手动写方块状态映射的 JSON 时有些熟悉?) |
- | 在本例中,我们将为 '' | + | 我们以 [[directionalblock]] 中创建的竖直台阶为例,通过数据生成器为其生成模型和方块状态映射。 |
- | 首先,添加方块自身并且注册它。 | + | ==== 自定义模型 ==== |
- | <code java> | + | 我们之前创建过一个 '' |
- | // 在 Tutorial 类(或者你自己的模组的初始化类中) | + | |
- | public static final Block MACHINE_BLOCK = new Block(FabricBlockSettings.copy(Blocks.BLAST_FURNACE)); | + | |
- | @Override | + | 为了在数据生成器中继承此模板模型,我们需要为此模板模型创建 '' |
- | public | + | <code java TutorialModelGenerator.java> |
- | | + | public |
+ | | ||
+ | Optional.of(Identifier.of(" | ||
+ | Optional.empty(), | ||
+ | TextureKey.BOTTOM, | ||
+ | |||
+ | // ... | ||
} | } | ||
</ | </ | ||
- | 现在我们成功地注册好了方块,让我们向好的方向发展! | + | 然后再调用 '' |
+ | <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 java> | + | ==== 自定义方块状态映射(1.21.5 之后) ==== |
- | private static class MyModelGenerator extends FabricModelProvider { | + | 重头戏来了——现在我们要为竖直台阶方块创建方块状态映射。其实没那么复杂,因为我们知道模型都是一样的,只需要有不同的旋转而已。 |
- | private MyModelGenerator(FabricDataGenerator generator) { | + | |
- | super(generator); | + | 在 1.21.5 中,方块状态的对象是 '' |
- | } | + | * '' |
- | + | * '' | |
- | @Override | + | |
- | public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) { | + | 对于 '' |
- | // ... | + | * **方法一**:先指定一个模型变种,然后再根据方块状态修改其变种,如 x 旋转、y 旋转和 uvlock,各方块状态都使用同一模型 id,只是变种可能不同。 |
- | blockStateModelGenerator.blockStateCollector.accept(MultipartBlockStateSupplier.create(Tutorial.MACHINE_BLOCK) | + | * **方法二**:直接为不同的方块状态分配模型变种,然后仍可继续根据方块状态修改变种。这种情况下,各方块状态可以使用不同的模型 id。 |
- | .with(When.create().set(Properties.HORIZONTAL_FACING, | + | |
- | | + | 我们的竖直台阶有两个方块状态属性:'' |
- | } | + | <code java TutorialModelGenerator.java> |
- | + | @Override | |
- | @Override | + | public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) { |
- | public void generateItemModels(ItemModelGenerator itemModelGenerator) { | + | // ... |
- | // ... | + | |
- | } | + | |
- | } | + | VariantsBlockModelDefinitionCreator.of(TutorialBlocks.POLISHED_ANDESITE_VERTICAL_SLAB, |
+ | | ||
+ | | ||
+ | | ||
+ | .register(Direction.NORTH, | ||
+ | | ||
+ | | ||
+ | .register(Direction.WEST, BlockStateModelGenerator.ROTATE_Y_270))); | ||
+ | } | ||
</ | </ | ||
+ | |||
+ | 这里的 '' | ||
+ | |||
+ | > 可以使用方法二吗?当然可以,代码如下: | ||
+ | > <code java TutorialModelGenerator.java> | ||
+ | blockStateModelGenerator.blockStateCollector.accept( | ||
+ | VariantsBlockModelDefinitionCreator.of( | ||
+ | TutorialBlocks.POLISHED_ANDESITE_VERTICAL_SLAB) | ||
+ | .with(BlockStateVariantMap.models(VerticalSlabBlock.FACING) | ||
+ | .register(Direction.NORTH, | ||
+ | .register(Direction.EAST, | ||
+ | .register(Direction.SOUTH, | ||
+ | .register(Direction.WEST, | ||
+ | ) | ||
+ | .apply(BlockStateModelGenerator.UV_LOCK) | ||
+ | ); | ||
+ | </ | ||
+ | > 我们发现,在方法二中,调用 '' | ||
+ | |||
+ | 在上面的方法一和方法二中,除了通过 '' | ||
+ | |||
+ | 如果方块状态有多个属性,多个属性都会影响到模型变种,那么可以直接在 '' |
zh_cn/tutorial/datagen_model.1743519814.txt.gz · Last modified: 2025/04/01 15:03 by solidblock