====== モデルプレディケートプロバイダー =======
〔Predicateは、英語で述語という意味があります。 [[https://ufcpp.net/study/csharp/sp_delegate.html#pred|述語という言葉は「××は○○である」という文章の「○○である」の部分を指します。プログラミングの世界では、 あるオブジェクト x が「x は○○である」という条件を満たすかどうかを調べるメソッドのことをプレディケート(predicate)と呼びます。]]〕
==== 導入 ====
モデルプロバイダーは、''ItemStack'' からのデータに基づいて項目のモデルを動的に変更するために使用されます。一般的な例は、弓が引かれた時間に基づいて異なるテクスチャを持つ弓です。すべてのプロバイダーは、アイテムのモデルファイルの ''overrides'' セクションで使用されます。
==== 実践例 ====
この例では、 ''EXAMPLE_BOW'' というカスタムの弓アイテムがあるとします。
メソッド内で、 ''ModelPredicateProvider'' をアイテムと ''Identifier'' に登録します。 ''Identifier'' 〔識別子〕を使用する場合、名前空間を指定する必要はありません。名前空間はいずれも Minecraft のプロバイダーと競合しないためです。これは、''ClientModInitializer'' の ''onInitializeClient'' メソッドで行う必要があります。 ''ClientModInitializer'' がない場合は、[[documentation:entrypoint|エントリポイント]] チュートリアルで追加方法を確認してください。
ModelPredicateProviderRegistry.register(EXAMPLE_BOW, new Identifier("pull"), (itemStack, clientWorld, livingEntity) -> {
if (livingEntity == null) {
return 0.0F;
}
return livingEntity.getActiveItem() != itemStack ? 0.0F : (itemStack.getMaxUseTime() - livingEntity.getItemUseTimeLeft()) / 20.0F;
});
ModelPredicateProviderRegistry.register(EXAMPLE_BOW, new Identifier("pulling"), (itemStack, clientWorld, livingEntity) -> {
if (livingEntity == null) {
return 0.0F;
}
return livingEntity.isUsingItem() && livingEntity.getActiveItem() == itemStack ? 1.0F : 0.0F;
});
''ModelPredicateProviderRegistry'' が一部のバージョンに存在しない場合は、 ''FabricModelPredicateProviderRegistry'' を使用できます。
''ModelPredicateProvider'' は、レンダリングされている現在のスタックの ''ItemStack''、クライアントがいる現在のワールドの''ClientWorld''、および ''LivingEntity'' を受け取る機能インターフェースです。アイテムのユーザーとして(1.17 以降では、''int'' も受け取ります)。
すべての ''ModelPredicateProvider'' は、モデルのさまざまな状態を表すために使用できる float を返すか、''1.0f'' と ''0f'' をそれぞれ返すことによって true/false 値を返します。 float 値は 0.0f と 1.0f の間の値を取ります。
''pull'' 〔弓引き〕プレディケートを詳しく見てみると、エンティティが null かどうかを最初に確認することがわかります。これは、アイテムが使用されている(つまり、地面に落とされた)コンテキストの外でアイテムをレンダリングできるためです。次に、エンティティがアイテムを使用していることを確認します。そうでない場合、使用されていないときにアイテムにモデルプレディケートが適用される可能性があります。最後に、 ''itemStack.getMaxUseTime()'' から ''livingEntity.getItemUseTimeLeft()'' を引きます。これにより、アイテムが保持されたティック数がわかります。弓を完全に引くするには 20 ティックまたは 1 秒かかるため、この数値を ''20.0f'' で割って、通常の引きの進行のために ''0f'' と ''1.0f'' の間に正規化します。
これらはすべて便利ですが、アイテムのモデルを変更するために実装する必要がある機能の半分にすぎません。
"overrides": [
{
"predicate": {
"pulling": 1
},
"model": "tutorial:item/example_bow_pulling_0"
},
{
"predicate": {
"pulling": 1,
"pull": 0.65
},
"model": "tutorial:item/example_bow_pulling_1"
},
{
"predicate": {
"pulling": 1,
"pull": 0.9
},
"model": "tutorial:item/example_bow_pulling_2"
}
]
Minecraft が機能する方法は、指定された値よりも大きい値または一致するモデルがリストの最後にあることを確認することです。 したがって、''0.8'' の弓引き値で、モデル ''tutorial:item/example_bow_pulling_1'' を使用します。 ''0.5'' は''tutorial:item/example_bow_pulling_0'' になります。