どうもこんにちは! 最近は寒すぎてタイピング速度が落ちてきてる気がするさいほうへいきです。ところでMotchiyって誰(唐突)
最近はとあるところで、話の流れでマイクラのリソースパックを作ろうということになったんですよね。まあほぼ僕が勝手にいろいろやってるだけみたいな感じですが……。
で、そのリソパ、せっかく作るなら勉強も兼ねて複数のテクスチャを使い分けれるようにしたいなー……という感じになったので、この記事はその記録です。
やりたいこと
アイテムにcustom_model_dataを使うことで複数のテクスチャを切り替えられるようにしたい。
コマンドやデータパックなどで数値を指定してやれば、簡単に変更ができるようにします。
単一アイテムに複数のテクスチャを指定したいので、まあ具体的にはざっとこんな感じ。
- 鉄の剣のパラメータ『1』の時は、曲がったサーベルのテクスチャ
- 鉄の剣のパラメータ『2』の時は、日本刀のテクスチャ
- 特に指定がないときは普通の剣
……みたいなことができるようになります。
パラメータ自体はコマンドで好きなものを選べるので、Modとか無しでもいろんな外観を実装できるはず。
リソースパックに画像とjsonを書き散らかすことで実現可能ですね。
ただしコマンドに頼る形なので、サバイバルで使いたいときは別途データパックとかを入れないといけないかもしれません。
あくまで、クリエイティブとかでいろいろ並べて遊ぶことができるだけです。
やり方
解説は後回しにしてとりあえず説明しますね。
まずリソースパックを作ります。pack.mcmetaとかについては別の記事を調べてください。
今回作ったリソパのディレクトリ構造は大まかにこんな感じ。フォルダやファイルの名前などは適宜変えてください。
my_pack.zip
┗assets
|┗minecraft
| ┗items
| |┗iron_sword.json
| ┗models
| |┗item
| | ┗iron_sword.json
| | ┗iron_sword_katana.json
| | ┗iron_sword_saber.json
| ┗textures
| ┗item
| ┗iron_sword_katana.png
| ┗iron_sword_saber.png
┗pack.mcmeta
┗pack.png
ディレクトリ構造をこのように整えたら、適当にpack.mcmetaを書いてください。適当でいいです。
次にそれぞれのJSONファイルについてざっくり書いていきますね。
itemsのほうのiron_sword.json
/assets/minecraft/items/iron_sword.jsonです。同名ファイルがもういっこあるので間違えないように気を付けましょう。
中身はこうなっています。
{
"model": {
"type": "minecraft:range_dispatch",
"entries": [
{ "model": { "type": "minecraft:model", "model": "item/iron_sword"}, "threshold": 0 },
{ "model": { "type": "minecraft:model", "model": "item/iron_sword_katana"}, "threshold": 1 },
{ "model": { "type": "minecraft:model", "model": "item/iron_sword_saber"}, "threshold": 2 }
],
"fallback": {
"type": "minecraft:model",
"model": "minecraft:item/iron_sword"
},
"property": "minecraft:custom_model_data"
}
}
そんなに理解必須な部分もないんですが、まあとりあえずcustom_model_dataの数値が1ならカタナ、2ならサーベル、それ以外なら普通の鉄の剣のモデルを使う、という分岐を書いているだけです。
ここで注意してほしいのがこれ、『モデル』を指定する必要があるんですね。使用するテクスチャを直接指定することはできません。
今回はモデルファイル(JSON)とテクスチャファイル(PNG)の名前が同じなのでいいですが、もし違う名前の場合はmodels/itemディレクトリの中にあるJSONの名前を指定するようにしましょう。
modelsのほうのiron_sword.json
{
"parent": "item/handheld",
"textures": {
"layer0": "item/iron_sword"
}
}
すごくシンプルですね。
handheldとテクスチャを指定しているだけです。
ちなみに鉄の剣ならhandheldですが、ジャガイモなどのアイテムの場合はgeneratedとなります。
テクスチャ名はtextures/itemディレクトリにある画像ファイルを指定しましょう。拡張子は不要です。
iron_sword_katana.jsonとか
iron_sword_saber.jsonもそう変わらないのでまとめてしまいます。
{
"parent": "item/iron_sword",
"textures": {
"layer0": "item/iron_sword_katana"
}
}
前項のiron_sword.jsonとほぼ変わりませんが、parentがhandheldからitem/iron_swordに変わっているだけです。
もちろん鉄剣以外の場合は変えてください。
動かす
さて、JSONはだいたいこれだけで済みますので、あとは適切にテクスチャ画像とpack.mcmetaを配置すればオッケー。
次のようなコマンドをそれぞれ実行して、custom_model_dataを指定したアイテムを入手しましょう。
/give @p minecraft:iron_sword
/give @p minecraft:iron_sword[minecraft:custom_model_data={floats:[1]}]
/give @p minecraft:iron_sword[minecraft:custom_model_data={floats:[2]}]
額縁に飾っておけば見やすいと思います。
リソパを読み込む前はだいたいこんな感じだったものが……
リソパを読み込むと、こう。
きちんとcustom_model_dataに応じてテクスチャが変化していますね!
ちょっと青じゃがコインなリソースパックで申し訳ない。
まとめ
この記事ではcustom_model_dataとリソースパックをうまく使って、ひとつのアイテムに複数テクスチャを切り替えられるようにしました。
エンチャントやattribute_modifiersなどとの組み合わせで、Modにも引けを取らない自由度の拡張ができそうですね。
このような手法は、公開サーバーなどでもよく見るものとなっています。アジ鯖のLIFEなどに入ってみると分かりやすいです。
あなたが独自のシステムを持ったプラグイン入りサーバーを建ててみたいなら、けっこうこのテクはお役立ちするはずです。
ぜひやってみてください!

