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
zh_cn:tutorial:datagen_model [2025/04/18 14:21] solidblockzh_cn:tutorial:datagen_model [2025/04/18 14:55] (current) solidblock
Line 140: Line 140:
 ===== 带有朝向的方块(以竖直台阶为例) ===== ===== 带有朝向的方块(以竖直台阶为例) =====
  
-带有朝向的方块通常仅使用一个方块模型,但是在方块模型映射中,会映射到不同的模型变种,例如不同的 x 旋转、y 旋转以及 uvlock。(这些词是不是在之前手动写方块状态映射的 JSON 时有些熟悉?)+带有朝向的方块通常仅使用一个方块模型,但是在方块状态映射中,会映射到不同的模型变种,例如不同的 x 旋转、y 旋转以及 uvlock。(这些词是不是在之前手动写方块状态映射的 JSON 时有些熟悉?)
  
 我们以 [[directionalblock]] 中创建的竖直台阶为例,通过数据生成器为其生成模型和方块状态映射。 我们以 [[directionalblock]] 中创建的竖直台阶为例,通过数据生成器为其生成模型和方块状态映射。
Line 146: Line 146:
 ==== 自定义模型 ==== ==== 自定义模型 ====
  
-我们之前创建过一个 ''tutorial:block/vertical_slab'' 的模型,作为竖直方块模型的模板。这种模板模型通常不需要使用数据生成器生成。然后我们为竖直的磨制安山岩台阶方块创建名为 ''tutorial:block/polished_andesite_vertical_slab'',继承前面提到的模板模型,并提供纹理变量。+我们之前创建过一个 ''tutorial:block/vertical_slab'' 的模型,作为竖直台阶方块模型的模板。这种模板模型通常不需要使用数据生成器生成。然后我们为竖直的磨制安山岩台阶方块创建名为 ''tutorial:block/polished_andesite_vertical_slab'' 的模型,继承前面提到的模板模型,并提供纹理变量。
  
 为了在数据生成器中继承此模板模型,我们需要为此模板模型创建 ''Model'' 对象。该模型的 JSON 中会使用 ''bottom''、''top'' 和 ''side'' 这三个纹理变量,因此我们在这里的代码中也依赖这三个纹理变量,数据生成器将在生成模型时为这几个变量赋值。 为了在数据生成器中继承此模板模型,我们需要为此模板模型创建 ''Model'' 对象。该模型的 JSON 中会使用 ''bottom''、''top'' 和 ''side'' 这三个纹理变量,因此我们在这里的代码中也依赖这三个纹理变量,数据生成器将在生成模型时为这几个变量赋值。
Line 174: Line 174:
 重头戏来了——现在我们要为竖直台阶方块创建方块状态映射。其实没那么复杂,因为我们知道模型都是一样的,只需要有不同的旋转而已。 重头戏来了——现在我们要为竖直台阶方块创建方块状态映射。其实没那么复杂,因为我们知道模型都是一样的,只需要有不同的旋转而已。
  
-在 1.21.5 中,方块状态的对象是 ''BlockModelDefinitionCreator'',分为两种:+在 1.21.5 中,方块状态映射是 ''BlockModelDefinitionCreator'',分为两种:
   * ''VariantsBlockModelDefinitionCreator'':根据方块状态分配一个方块模型变种。简单的方块都是用的这种。我们这里所讨论的竖直台阶也是这种。   * ''VariantsBlockModelDefinitionCreator'':根据方块状态分配一个方块模型变种。简单的方块都是用的这种。我们这里所讨论的竖直台阶也是这种。
   * ''MultipartBlockModelDefinitionCreator'':由多个部分组成的方块,每个部分都是一个方块模型变种,每个部分会根据其方块状态来决定是否显示。原版的红石线就是这种。   * ''MultipartBlockModelDefinitionCreator'':由多个部分组成的方块,每个部分都是一个方块模型变种,每个部分会根据其方块状态来决定是否显示。原版的红石线就是这种。
  
 对于 ''VariantsBlockModelDefinitionCreator'',我们需要指定方块状态与方块模型变种的关系,也就是要说清楚:什么方块状态使用什么模型变种。多个方块状态可以使用同一模型变种(例如含水和不含水的方块,模型都是一样的),同一方块状态也可以使用多个变种(例如泥土、沙子等方块的随机旋转)——但必须不重不漏:不一定每个方块状态属性都要考虑到,但每个可能的方块状态都要被包括,且不能重复,否则就会有错误。在 1.21.5 中,有两种方法指定方块状态与模型变种的关系: 对于 ''VariantsBlockModelDefinitionCreator'',我们需要指定方块状态与方块模型变种的关系,也就是要说清楚:什么方块状态使用什么模型变种。多个方块状态可以使用同一模型变种(例如含水和不含水的方块,模型都是一样的),同一方块状态也可以使用多个变种(例如泥土、沙子等方块的随机旋转)——但必须不重不漏:不一定每个方块状态属性都要考虑到,但每个可能的方块状态都要被包括,且不能重复,否则就会有错误。在 1.21.5 中,有两种方法指定方块状态与模型变种的关系:
-  * **方法一**:先指定一个模型变种,然后再根据方块状态修改其变种,如 x 旋转、y 旋转和 uvlock,各方块状态都使用同一模型 id,只是变种可能不同。+  * **方法一**:先指定一个模型变种,然后再根据方块状态修改其变种,如修改 x 旋转、y 旋转和 uvlock,各方块状态都使用同一模型 id,只是变种可能不同。
   * **方法二**:直接为不同的方块状态分配模型变种,然后仍可继续根据方块状态修改变种。这种情况下,各方块状态可以使用不同的模型 id。   * **方法二**:直接为不同的方块状态分配模型变种,然后仍可继续根据方块状态修改变种。这种情况下,各方块状态可以使用不同的模型 id。
  
Line 220: Line 220:
 在上面的方法一和方法二中,除了通过 ''register'' 方法逐个注册模型操作或模型变种之外,也可以使用 ''generate'' 方法,通过 lambda 的方式指定模型操作或者模型变种,这个 lambda 是一个函数,接收对应的属性值作为参数,返回的是模型操作或模型变种。 在上面的方法一和方法二中,除了通过 ''register'' 方法逐个注册模型操作或模型变种之外,也可以使用 ''generate'' 方法,通过 lambda 的方式指定模型操作或者模型变种,这个 lambda 是一个函数,接收对应的属性值作为参数,返回的是模型操作或模型变种。
  
-如果方块状态有多个属性,多个属性都会影响到模型变种,那么可以直接在 ''BlockStateVariantMap.operations'' 或 ''BlockStateVariantMap.models'' 中提供多个属性,然后在后面调用 ''register'' 或 ''generate'' 时同时指定或使用多个值,也可以调用两次 ''coordinate'',让每个属性各自决定对方块状态的修改。+如果方块状态有多个可能会影响到模型变种的属性,那么可以直接在 ''BlockStateVariantMap.operations'' 或 ''BlockStateVariantMap.models'' 中提供多个属性,然后在后面调用 ''register'' 或 ''generate'' 时同时指定或使用多个值,也可以调用两次 ''coordinate'',让每个属性各自决定对模型变种的修改。
zh_cn/tutorial/datagen_model.txt · Last modified: 2025/04/18 14:55 by solidblock