User Tools

Site Tools


zh_cn:tutorial:features
no way to compare when less than two revisions

Differences

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


Previous revision
Next revision
zh_cn:tutorial:features [2021/07/12 01:07] – [创建Feature类] solidblock
Line 1: Line 1:
 +===== 添加特征地形 [1.17] =====
 +岩石,树木,矿石和池塘都是Feature的示例。 它们是对世界的简单补充,它们的生成取决于它们的配置方式。 在本教程中,我们将研究如何在我们的世界中随机生成一个简单的石螺旋Feature。
  
 +岩石、树木、矿石、池塘都是特征地形的例子,是对世界的简单补充生成,并根据配置的方式生成。本教程中,我们将研究如何随机生成简单的石头螺旋地形。
 +
 +往生物群系中添加特征地形需要3个步骤。
 +  * 创建特征地形
 +  * 配置特征地形
 +  * 使用[[https://github.com/FabricMC/fabric/pull/1097|Fabric API中的生物群系修改API]]以往生物群系中添加特征地形。
 +
 +注意生物群系修改API标记为实验性。如果API不起作用,考虑使用[[?rev=1599388928|mixin版本]]。
 +
 +==== 创建特征地形 ====
 +一个简单的特征地形如下所示:
 +<code java>
 +public class StoneSpiralFeature extends Feature<DefaultFeatureConfig> {
 +  public StoneSpiralFeature(Codec<DefaultFeatureConfig> config) {
 +    super(config);
 +  }
 +
 +  @Override
 +  public boolean generate(StructureWorldAccess world, ChunkGenerator generator, Random random, BlockPos pos,
 +      DefaultFeatureConfig config) {
 +    BlockPos topPos = world.getTopPosition(Heightmap.Type.WORLD_SURFACE, pos);
 +    Direction offset = Direction.NORTH;
 +
 +    for (int y = 1; y <= 15; y++) {
 +      offset = offset.rotateYClockwise();
 +      world.setBlockState(topPos.up(y).offset(offset), Blocks.STONE.getDefaultState(), 3);
 +    }
 +
 +    return true;
 +  }
 +}
 +</code>
 +
 +''Feature<DefaultFeatureConfig>''构造器采用''Codec<DefaultFeatureConfig>''。你可以直接在构造器的超级调用中或者实例化特性时为默认的配置特性传入''DefaultFeatureConfig.CODEC''
 +
 +区块决定生成特征地形时调用''generate''。如果特征地形配置为在每个区块生成,则每个区块被生成时都会调用一次。在特征被配置为以每个生物群系特定的概率生成的情况下,''generate''只会在世界想要生成结构的实例中调用。
 +
 +在我们的实现中,我们从世界最高位置的方块构建一个简单的15个方块高的岩石螺旋。
 +
 +特征地形可以像游戏其他内容一样被注册,且你不需要担心没有特定的构建器(builder)和机制(mechanic)。
 +
 +<code java>
 +public class ExampleMod implements ModInitializer {
 +  private static final Feature<DefaultFeatureConfig> STONE_SPIRAL = new StoneSpiralFeature(DefaultFeatureConfig.CODEC);
 +
 +  @Override
 +  public void onInitialize() {
 +    Registry.register(Registry.FEATURE, new Identifier("tutorial", "stone_spiral"), STONE_SPIRAL);
 +  }
 +}
 +</code>
 +
 +==== 注册一个Feature ====
 +可以像注册游戏中的其他大多数内容一样注册Feature,而且您不必担心任何特殊的构建器或机制。
 +<code java>
 +private static final Feature<DefaultFeatureConfig> LAVA_HOLE = Registry.register(
 + Registry.FEATURE,
 + new Identifier("tutorial", "stone_spiral"),
 + new StoneSpiralFeature(DefaultFeatureConfig::deserialize)
 +);
 +</code>
 +
 +==== 向生物群落添加Feature ====
 +生物群系有一种称为''addFeature''的方法,用于将Feature添加到生物群落的生成过程中。 您可以在每个生物群落类(例如''ForestBiome''或''SavannaBiome'')中查看此方法的更详细用法。
 +
 +我们可以遍历''Registry.BIOME''以将我们的Feature添加到每个生物群系中。
 +<code java>
 +Registry.BIOME.forEach(biome -> biome.addFeature(
 +        GenerationStep.Feature.RAW_GENERATION,
 + Biome.configureFeature(
 + LAVA_HOLE,
 + new DefaultFeatureConfig(),
 + Decorator.CHANCE_HEIGHTMAP,
 + new ChanceDecoratorConfig(100)
 + )
 +));
 +</code>
 +
 +''addFeature''的第一个参数有助于确定何时生成结构。 对于地上的房屋,您可以使用''SURFACE_STRUCTURES'',对于洞穴,您可以使用'' RAW_GENERATION''
 +
 +''addFeature''的第二个参数是ConfiguredFeature,可以通过''Biome.configureFeature''创建。 后者接收功能的实例,功能的config类,装饰器和装饰器配置的实例。
 +
 +装饰器代表世界如何选择放置要素。 ''CHANCE_HEIGHTMAP''可通过查看高度图来工作,而''NOISE_HEIGHTMAP_32''可使用噪声来工作。 要选择正确的装饰器,请签出与您自己风格相似的香草功能。 装饰器配置将分支此分支; 对于''CHANCE_HEIGHTMAP'',您将传入''ChanceHeightmapDecorator的实例。
 +
 +=== 结果 ===
 +{{https://i.imgur.com/Kr59o0B.png}}
zh_cn/tutorial/features.txt · Last modified: 2022/08/18 03:37 by solidblock