User Tools

Site Tools


zh_cn:tutorial:model_predicate_providers

Differences

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

Link to this comparison view

Next revision
Previous revision
zh_cn:tutorial:model_predicate_providers [2021/07/25 01:55] – created solidblockzh_cn:tutorial:model_predicate_providers [2022/06/01 11:51] (current) – external edit 127.0.0.1
Line 3: Line 3:
 ==== 介绍 ==== ==== 介绍 ====
  
-模型谓词提供器用于动态改变Model providers are used to dynamically change the model of items based on data from ''ItemStack''s. A common example is the bow, which has different textures based on how long the bow has been pulled. All providers are then used in the model file for the item, in the ''overrides'' section.+模型谓词提供器用于给予 ''ItemStack'' 的数据动态改变物品的模型。一个简单的例子是弓,其在不同的拉伸度下会有不同的纹理。所有的提供器都会用在物品的模型文件中,位于 ''overrides'' 部分。
  
 ==== 可行示例 ==== ==== 可行示例 ====
  
-在此例中,我们假定有了自定义的弓,叫做''EXAMPLE_BOW''+在此例中,我们假定有了自定义的弓,叫做 ''EXAMPLE_BOW''
  
-在其方法中,使用其物品和一个''Identifier''注册一个''ModelPredicateProvider''。对于''Identifier''的使用,不需要提供命名空间,因为这些不会与Minecraft的提供器冲突。这些必须在你的''ClientModInitializer''的''onInitializeClient''方法中完成。如果你没有''ClientModInitializer'',可以看看[[zh_cn:documentation:entrypoint|入口点]]教程以添加一个。+在其方法中,使用其物品和一个 ''Identifier'' 注册一个 ''ModelPredicateProvider''。对于 ''Identifier'' 的使用,不需要提供命名空间,因为这些不会与 Minecraft 的提供器冲突。这些必须在你的 ''ClientModInitializer'' 的 ''onInitializeClient'' 方法中完成。如果你没有 ''ClientModInitializer'',可以看看[[zh_cn:documentation:entrypoint|入口点]]教程以添加一个。
  
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
  
-FabricModelPredicateProviderRegistry.register(EXAMPLE_BOW, new Identifier("pull"), (itemStack, clientWorld, livingEntity) -> {+ModelPredicateProviderRegistry.register(EXAMPLE_BOW, new Identifier("pull"), (itemStack, clientWorld, livingEntity) -> {
  if (livingEntity == null) {  if (livingEntity == null) {
  return 0.0F;  return 0.0F;
Line 20: Line 20:
 }); });
  
-FabricModelPredicateProviderRegistry.register(EXAMPLE_BOW, new Identifier("pulling"), (itemStack, clientWorld, livingEntity) -> {+ModelPredicateProviderRegistry.register(EXAMPLE_BOW, new Identifier("pulling"), (itemStack, clientWorld, livingEntity) -> {
  if (livingEntity == null) {  if (livingEntity == null) {
  return 0.0F;  return 0.0F;
Line 27: Line 27:
 }); });
 </code> </code>
 +
 +如果 ''ModelPredicateProviderRegistry'' 在某些版本不存在,考虑使用 ''FabricModelPredicateProviderRegistry''
  
-''ModelPredicateProvider''时功能性的接口,需要一个''ItemStack''作为当前被渲染的物品堆,一个''ClientWorld''作为客户端所在的当前世界,以及一个''LivingEntity''作为物品的用户(在1.17+,还需要接收一个''int'')。+''ModelPredicateProvider'' 是函数型接口,需要一个 ''ItemStack'' 作为当前被渲染的物品堆,一个 ''ClientWorld'' 作为客户端所在的当前世界,以及使用该物品的玩家 ''LivingEntity''(在1.17+,还需要接收一个''int'')。
  
-所有的''ModelPredicateProvider''返回浮点数,用来代表模型的不同状态,或者通过返回''1.0f''和''0f''来分别表示真假值。+所有的 ''ModelPredicateProvider'' 返回浮点数,用来代表模型的不同状态,或者通过返回 ''1.0f'' 和 ''0f'' 来分别表示真假值。返回的值会被限制在 0.0f 到 1.0f 之间
  
-仔细看看''pull''谓词,我们会看到我们首先检查实体是否无效(null,因为物品可以在其使用的环境之外渲染(例如掉落在地上)。我们确保实体使用我们的物品,否则物品会让模型谓词在不被使用的时候应用。最后,我们将''itemStack.getMaxUseTime()''减去''livingEntity.getItemUseTimeLeft()''以表示物品所被持有的刻数。因为完全拉满一把弓需要20刻即1秒的时间,所以我们将这个数字除以''20.0f''以使其介于''0f''到''1.0f''之间来表示正常的拉伸进度。+仔细看看 ''pull'' 谓词,我们会看到我们首先检查实体是否为 null,因为物品可以在其使用的环境之外渲染(例如掉落在地上)。我们确保实体使用我们的物品,否则物品会让模型谓词在不被使用的时候应用。最后,我们将 ''itemStack.getMaxUseTime()'' 减去 ''livingEntity.getItemUseTimeLeft()'' 以表示物品所被持有的刻数。因为完全拉满一把弓需要 20 刻即 1 秒的时间,所以我们将这个数字除以 ''20.0f'' 以使其介于 ''0f'' 到 ''1.0f'' 之间来表示正常的拉伸进度。
  
 所有这些都是有用的,但为了让我们的物品改变其模型,我们只需要实现其一部分的特性。 所有这些都是有用的,但为了让我们的物品改变其模型,我们只需要实现其一部分的特性。
Line 61: Line 63:
 </code> </code>
  
-Minecraft运作的方式是,在指定的值中,检查模型大于等于的值的最后一个值。所以拉伸值为''0.8''时,会使用''tutorial:item/example_bow_pulling_1'',而值为''0.5''时使用''tutorial:item/example_bow_pulling_0''+Minecraft 运作的方式是,在指定的值中,检查模型大于等于的值的最后一个值。所以拉伸值为 ''0.8'' 时,会使用 ''tutorial:item/example_bow_pulling_1'',而值为 ''0.5'' 时使用''tutorial:item/example_bow_pulling_0''
zh_cn/tutorial/model_predicate_providers.1627178123.txt.gz · Last modified: 2021/07/25 01:55 by solidblock