User Tools

Site Tools


zh_cn:tutorial:datagen_model

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
zh_cn:tutorial:datagen_model [2025/04/01 15:36] – [为带有朝向的方块] solidblockzh_cn:tutorial:datagen_model [2025/04/01 15:47] (current) – [模型生成] solidblock
Line 6: Line 6:
 > :!: **注意:**我们在之前的教程中,在 ''resources'' 文件夹内可能已经手动创建了一些 JSON 文件。当数据生成器生成同名的 JSON 文件时,会与我们已经手动创建的 JSON 冲突,因此在运行数据生成前,请删除它们。 > :!: **注意:**我们在之前的教程中,在 ''resources'' 文件夹内可能已经手动创建了一些 JSON 文件。当数据生成器生成同名的 JSON 文件时,会与我们已经手动创建的 JSON 冲突,因此在运行数据生成前,请删除它们。
  
 +> :!: **注意:**从 1.21.4 开始,数据生成会区分客户端和服务器,原版中与模型有关的类都会被加上 ''@Environment(EnvType.CLIENT)'',仅在客户端环境下可用。如果你在实际运行数据生成时,发现是服务器环境从而报错,请参考[[datagen_setup|数据生成入门教程]]的手动数据生成部分,在 ''build.gradle'' 中修改 ''fabricApi'' 块以启用客户端环境,然后重新生成 IDE 的运行配置。
 ===== 准备 ===== ===== 准备 =====
  
Line 137: Line 138:
 大功告成!我们就仅仅通过这么几行代码,成功地添加了楼梯和台阶所需要的一切模型、方块状态映射和物品模型映射! 大功告成!我们就仅仅通过这么几行代码,成功地添加了楼梯和台阶所需要的一切模型、方块状态映射和物品模型映射!
  
-===== 带有朝向的方块 =====+===== 带有朝向的方块(以竖直台阶为例) =====
  
-带有朝向的方块通常仅使用一个方块模型,但是在方块模型映射中,会映射到不同的模型变种,例如不同的 x 旋转、y 旋转以及 uvlock。(这些词在之前手动写方块状态映射的 JSON 时是不是有些熟悉?)+带有朝向的方块通常仅使用一个方块模型,但是在方块模型映射中,会映射到不同的模型变种,例如不同的 x 旋转、y 旋转以及 uvlock。(这些词是不是在之前手动写方块状态映射的 JSON 时有些熟悉?)
  
 我们以 [[directionalblock]] 中创建的竖直台阶为例,通过数据生成器为其生成模型和方块状态映射。 我们以 [[directionalblock]] 中创建的竖直台阶为例,通过数据生成器为其生成模型和方块状态映射。
Line 179: Line 180:
 对于 ''VariantsBlockModelDefinitionCreator'',我们需要指定方块状态与方块模型变种的关系,也就是要说清楚:什么方块状态使用什么模型变种。多个方块状态可以使用同一模型变种(例如含水和不含水的方块,模型都是一样的),同一方块状态也可以使用多个变种(例如泥土、沙子等方块的随机旋转)——但必须不重不漏:不一定每个方块状态属性都要考虑到,但每个可能的方块状态都要被包括,且不能重复,否则就会有错误。在 1.21.5 中,有两种方法指定方块状态与模型变种的关系: 对于 ''VariantsBlockModelDefinitionCreator'',我们需要指定方块状态与方块模型变种的关系,也就是要说清楚:什么方块状态使用什么模型变种。多个方块状态可以使用同一模型变种(例如含水和不含水的方块,模型都是一样的),同一方块状态也可以使用多个变种(例如泥土、沙子等方块的随机旋转)——但必须不重不漏:不一定每个方块状态属性都要考虑到,但每个可能的方块状态都要被包括,且不能重复,否则就会有错误。在 1.21.5 中,有两种方法指定方块状态与模型变种的关系:
   * **方法一**:先指定一个模型变种,然后再根据方块状态修改其变种,如 x 旋转、y 旋转和 uvlock,各方块状态都使用同一模型 id,只是变种可能不同。   * **方法一**:先指定一个模型变种,然后再根据方块状态修改其变种,如 x 旋转、y 旋转和 uvlock,各方块状态都使用同一模型 id,只是变种可能不同。
-  * **方法二**:为不同的方块状态分配模型变种。这种情况下,各方块状态可以使用不同的模型 id。+  * **方法二**:直接为不同的方块状态分配模型变种,然后仍可继续根据方块状态修改变种。这种情况下,各方块状态可以使用不同的模型 id。
  
 我们的竖直台阶有两个方块状态属性:''facing'' 和 ''waterlogged''。''waterlogged'' 不影响其模型,所以我们只看 ''facing''。因为模型 id 不受朝向影响,所以这里我们使用方法一。 我们的竖直台阶有两个方块状态属性:''facing'' 和 ''waterlogged''。''waterlogged'' 不影响其模型,所以我们只看 ''facing''。因为模型 id 不受朝向影响,所以这里我们使用方法一。
Line 215: Line 216:
     );     );
 </code> </code>
-> 我们发现,在方法二中,调用 ''VariantsBlockModelDefinitionCreator.of'' 时没有将 ''WeightedVariant'' 作为第二个参数,而是在后面每个方块状态提供一次。通过调用 ''with'' 分配模型变种之后,就可以继续像方法一那样使用 ''apply'' 或 ''coordinate'' 方法修改变种。+> 我们发现,在方法二中,调用 ''VariantsBlockModelDefinitionCreator.of'' 时没有将 ''WeightedVariant'' 作为第二个参数,而是在后面每个方块状态提供一次,我们也注意到方法一中调用的是 ''BlockStateVariantMap.operations'',每次注册的也仅是对模型变种的操作,而在方法二中,调用的是 ''BlockStateVariantMap.models'',每次注册的都是个完整的模型变种。通过调用 ''with'' 分配模型变种之后,就可以继续像方法一那样使用 ''apply'' 或 ''coordinate'' 方法修改变种。 
 + 
 +在上面的方法一和方法二中,除了通过 ''register'' 方法逐个注册模型操作或模型变种之外,也可以使用 ''generate'' 方法,通过 lambda 的方式指定模型操作或者模型变种,这个 lambda 是一个函数,接收对应的属性值作为参数,返回的是模型操作或模型变种。 
 + 
 +如果方块状态有多个属性,多个属性都会影响到模型变种,那么可以直接在 ''BlockStateVariantMap.operations'' 或 ''BlockStateVariantMap.models'' 中提供多个属性,然后在后面调用 ''register'' 或 ''generate'' 时同时指定或使用多个值,也可以调用两次 ''coordinate'',让每个属性各自决定对方块状态的修改
zh_cn/tutorial/datagen_model.1743521765.txt.gz · Last modified: 2025/04/01 15:36 by solidblock