Minecraft1.21.1 Mod開発#5:基礎編③(独自のアイテムの見た目や名前を変えよう!)

基礎

こんにちは!
初めましての人は初めまして。
___です。

Minecraft(マイクラ)のMODを実際に作りながら、読者の皆さんにも一緒に作ってもらえるような、実践型連載の第五弾!

今回は前回の(ほぼ)続きとして、

— 独自のアイテムの見た目や名前を変えよう! —

をしていこうと思います!

前回「より実践的に、より体感的に」と言ったな。
筆者には無理だった(説明過多)

まぁお気に召すまま進めていきます。
Let’s Minecraft Mod Life!

前提

テクスチャの準備

さて、いきなり見た目を変えていきたいんですが・・・。

そもそもの話。
マイクラのアイテムやブロックはモデル(形)があって、そこにテクスチャを貼り付けることで見えるようにしています。
つまり。
モデルはマイクラのデフォルトの物を使っても、今回のように「見た目を変える」となると、つまるところ「テクスチャ」が必要になります。

そう、それは作らなければいけないのです!

しかし!今日は見た目を変えるJSONをしていきたい!

ということで・・・

ここに、筆者が作ったテクスチャ素材があります。
アイテム用のアイコンです。
(ダウンロード・私的利用は自由です)
ダウンロードはリンクを押すと自動でダウンロードが始まります。
今回はこれを使って進めていきましょう!

ダウンロードしていただくと、ZIPファイルなので解凍しちゃいましょう。

中にはこんな感じで2つのファイルがあります。
「coal_diamond_icon.png」と「steel_icon.png」です。

これは一旦ここまで。
後ですぐ使います。

フォルダ階層の準備

次の準備は、先に準備したテクスチャを入れるフォルダを作ってあげないといけません!
ということでフォルダを作っていきます。

現在の筆者の階層構造はこんな感じ。

src/
 └─ main/
     └─ resources/
         └─ assets/
             └─ practicemymod/
                 ├─ lang/
                 │   └─ en_us.json
                 └─ models/
                      └─ item/
                           ├─ coal_diamond.json
                           └─ steel.json

これを、以下のようにします。

src/
 └─ main/
     └─ resources/
         └─ assets/
             └─ practicemymod/
                 ├─ lang/
                 │   └─ en_us.json
                 ├─ models/
                 │   └─ item/
                 │        ├─ coal_diamond.json
                 │        └─ steel.json
                 └─ textures/                       ← 新規作成
                      └─ item/                      ← 新規作成
                           ├─ coal_diamond_icon.png
                           └─ steel_icon.png

新しく作るフォルダは「textures」その中に「item」の2つです。
そしてその中に用意したテクスチャ画像を入れます。

まずはこんな感じでフォルダを作ってしまいましょう。

フォルダができたら、今回作った「textures」の中の「item」フォルダの上で右クリック。
出てきたメニューの中から「エクスプローラーで表示する」を押します。

すると、別の画面が開いて、そのフォルダをエクスプローラー(VSCodeのではないです)が開きます。

そうしたらそこにある「item」フォルダを開きます。
そして、その中に用意しておいたテクスチャを入れましょう。
(テクスチャを入れたら、エクスプローラーは閉じてしまっても大丈夫です)

そうすると、VSCodeの方でも、「item」フォルダの中に、テクスチャの名前が表示されると思います。

これで前提準備は完了です!
お疲れ様です。

アイテムの見た目を変えよう!

JSONファイルを編集しよう

前回、アイテムを登録するために作ったJSONファイルを見てみましょう。
(ここではcoal_diamondで進めていきます)

{
  "parent": "minecraft:item/generated",
  "textures": {
    "layer0": "minecraft:item/diamond"
  }
}

これの中で、アイテムの見た目を決めているのは・・・

"textures": {
  "layer0": "minecraft:item/diamond"
}

さらにこれを分解してみると・・・
「:」の左側(texturesやlayer0)は、決められた名前を入力することで、何の項目を設定するか決めていましたね。
そうやって設定したい項目を決めたら、「:」の右側に、その内容を書いていました。

つまり、今回帰る場所は、
「minecraft:item/diamond」です!

これについても見ていきましょう。
ここでは「:」の左側は、何のデータ群の中の物、という定義でした。
そして「:」の右側が、その中の具体的なデータの内容でした。

では今回の状況はどうでしょうか?
新しいテクスチャのデータは、何のデータ群に含まれているかというと・・・

「今作っているMod」です!

ここで「今使っているMod」を指定するためには、「ModID」を指定してあげる必要があります。
(筆者の場合には「practicemymod」です)

つまり「:」の左側と合わせると、「practicemymod:」となりますね!

次は右側!
こちらはデータ群の解析をし始めたところからのフォルダ階層で見ることができます!
今回、コードでは「practicemymod:」しか書いていませんが、データ群が解析されるとき、それが「何に必要で呼び出されたか」によって、解析し始める位置が変わります。
今回の場合は「textures」で呼び出されているので、自動的に「これはpracticemymodの中のtexturesの中から探せばいいんだな!」と判断して、その中が解析されます。

src/
 └─ main/
     └─ resources/
         └─ assets/
             └─ practicemymod/ ← ※解析はここからではないので注意
                 ├─ lang/
                 │   └─ en_us.json
                 ├─ models/
                 │   └─ item/
                 │        ├─ coal_diamond.json
                 │        └─ steel.json
                 └─ textures/  ← ここがデータ群を解析し始めるところ
                      └─ item/
                           ├─ coal_diamond_icon.png ← ここが欲しいデータ
                           └─ steel_icon.png

そうなると「textures」のフォルダから見た「coal_diamond_icon.png」の位置は、「itemの中」なので、つまり「item/coal_diamond_icon.png」となります。

これで、「practicemymod:」と「item/coal_diamond_icon.png」を合体させて「practicemymod:item/coal_diamond_icon.png」と書けばばっちり!

・・・と思いきやここで落とし穴。
マイクラのテクスチャなどのファイルを指定する時は、拡張子を付けません!
つまり正解は「practicemymod:item/coal_diamond_icon」ということです!

これを踏まえて、「coal_diamond.json」の中身を、下のように変えればOKです!
(コピペしたら、ちゃんとpracticemymodの部分は自分のModのIDに変更しましょう)

{
  "parent": "minecraft:item/generated",
  "textures": {
    "layer0": "practicemymod:item/coal_diamond_icon"
  }
}

それではこれを保存しておきましょう。

確認

それではテスト起動してみましょう。

GradleからrunClientを起動し、NeoForgeを起動させてください。
そうしたら、前回すでに作っているワールドでいいので入りましょう。

ワールドに入ると、もしすでにcoal_diamondを持っていた場合には、見た目が変わっているでしょう。

もし持っていない場合には、チャットで以下のコマンドを打ってアイテムを取得してみましょう。

/give @s <modid>:coal_diamond

これで見た目を変えることができました!
同じように「steel」の方も見た目を変えてみましょう!

変更はJSONファイルだけですね。
「steel.json」の中身を、下のように変えて、保存したらまたテスト起動してみましょう!
(コピペしたら、ちゃんとpracticemymodの部分は自分のModのIDに変更しましょう)

{
  "parent": "minecraft:item/generated",
  "textures": {
    "layer0": "practicemymod:item/steel_icon"
  }
}

(ちょっとSteelの方は見た目がマイクラの鉄インゴットと似ていてわかりづらいですね・・・)

でも変わっていればOKです!
これで見た目をオリジナルに変えることができました!
お疲れ様です。

アイテムの名前を変えよう

さて次はこれですね。

名前。

今はアイテムのIDのようなものがそのまま表示されている状態です。
これでは何のアイテムかわかりづらいし、そもそもアイテムの名前としてはおかしいですね。

これを変えていきますが、果たして変更するのは「java」か「resources」か・・・。

答えは「resources」です!
この「表示される名前」も、表示される、と付いているように、プレイヤーに見える画面の情報です。
つまり根幹を動かす頭脳ではなく、装飾箱(assets)の方なのです。

フォルダ階層を見てみましょう。

assets/
 └─ <modid>/
      ├─ blockstates/
      ├─ font/
      ├─ lang/
      ├─ models/
      ├─ sounds/
      └─ textures/

この中で「アイテムやブロックの「多言語対応の表示名(日本語・英語など)」をまとめる場所」は、「lang」です。
(これは「Language」の略ですね)

言語ファイルを見てみよう

さて、では実際の「lang」を見てみましょう。

すでにフォルダ「lang」はあります。
その中に「en_us.json」ファイルがありますね。これが言語ファイルです。

※補足※
このファイル名にも一応法則があります。
「_」で繋がっている最初の方「en」、これが言語名の略称です。(これはEnglishですね)
そして繋がっている後ろの方「us」、これは国名の略称になります。

まずはこのファイルを開いてみましょう!

いろいろ書いてありますね。
一応1つずつ確認していきましょう。

"itemGroup.practicemymod": "Example Mod Tab",

これはクリエイティブタブの名前です。
クリエイティブタブというのは、クリエイティブモードでインベントリを開いた時に周りにタブがたくさん並んでいると思いますがそれの事です。
なのでその上にカーソルを乗せた時などに表示される名前になります。

"block.practicemymod.example_block": "Example Block",

これはブロックの名前です。
ゲーム内でブロックを手に持ったり、インベントリでカーソルを合わせた時に表示される名前です。

"item.practicemymod.example_item": "Example Item",

これはアイテムの名前です。
ゲーム内でアイテムにカーソルを合わせた時に表示される名前です。

実はここまでがゲーム内で頻繁に目にする項目です。
これ以降の設定はMOD設定画面(Config画面)のテキストになります。

"practicemymod.configuration.title": "Practice_My_Mod Configs",

これは設定画面のメインタイトルです。
MOD一覧画面などからこのMODの設定を開いた時の一番頭に表示されるタイトルです。

"practicemymod.configuration.section.practicemymod.common.toml": "Practice_My_Mod Configs",

これは設定ファイル(toml)のセクション名の設定項目がファイルごとに分かれている場合の、タブや見出しに使われる名前です。
タブが無い場合には無視されるようです。

"practicemymod.configuration.section.practicemymod.common.toml.title": "Practice_My_Mod Configs",

これは設定ファイルセクションのタイトル上記セクションを開いた画面の上部に表示される見出しです。
こちらもセクションが分かれていたりしない場合には、書かれていても無視されるようです。

"practicemymod.configuration.items": "Item List",

これは設定内の「アイテム関連」グループ名の設定項目の中で、アイテムに関する設定をまとめた見出しの名前になります。
(なんか最後に「…」が自動で付与されるみたいですね)

"practicemymod.configuration.logDirtBlock": "Log Dirt Block",

これは「土ブロックログ出力」設定の項目名です。
テンプレートに最初から入っているサンプル設定(土ブロックをログに出すか)の項目名です。
(正直この項目自体の使いどころが分からないのです・・・)

"practicemymod.configuration.magicNumberIntroduction": "Magic Number Text",

「マジックナンバー説明」のテキスト設定項目に関する補足説明文です。

"practicemymod.configuration.magicNumber": "Magic Number"

これが「マジックナンバー」設定の項目名です。
テンプレートのサンプル設定(数値設定)の項目名です。

・・・・・・。

さて、ざっと一通り見てきましたが、正直今は分からない項目も多いですね・・・。
なのでとりあえず使う項目をまとめてみました!

"block.practicemymod.example_block": "Example Block",
"item.practicemymod.example_item": "Example Item",

この2つです!
さらに言ってしまうのであれば、今回はアイテムの名前の設定だけなので、下の1つだけです!

じゃぁこれについて詳しく見てみましょう。

現在マイクラを起動してクリエイティブタブで「Example Mod Tab」を開くとこんな感じ。

なぜか存在しないはずのアイテムが勝手に表示されていて、しかも名前が「Example Item」になっています。
これがどうしてなのかというと・・・。

答えは「PracticeMyMod.java」の中にあります!
ちょっと開いてみて、以下のような場所を探してください。

注目はこの部分。

// Creates a new food item with the id "practicemymod:example_id", nutrition 1 and saturation 2
public static final DeferredItem<Item> EXAMPLE_ITEM = ITEMS.registerSimpleItem("example_item", new Item.Properties().food(new FoodProperties.Builder()
            .alwaysEdible().nutrition(1).saturationModifier(2f).build()));

この書き方、設定はモリモリになっていますが、単純にしてみると見たことありませんか・・・?

public static final DeferredItem<Item> EXAMPLE_ITEM = ITEMS.registerSimpleItem("example_item", new Item.Properties());

これです。
もうお分かりですね。

NeoForgeが導入時に、Example(例)として、アイテムを追加してくれているんです!
とっても親切!(英語が読めれば・・・!!)

なので、自分では設定していないはずの「Example Item」が存在したのです!

※補足※
前アイテムを追加した時はITEMS.registerだったけど、これはITEMS.registerSimpleItemで、命令がちょっと違くない?と思う人はとても目がいいですね。
実はこの2つの違いは、「コードをシンプルに省略できるかどうか」であり、元々の処理は同じなので、ほぼ同じ処理です。
ただ、ITEMS.registerSimpleItemの場合は「ITEMS.register(“名前”, () -> new Item(new Item.Properties()))」と書くところを「ITEMS.registerSimpleItem(“名前”)」だけで済ませられるので、特殊な効果やスタック制限がない「普通の素材アイテム」なら楽に書けるよ!っていうものです。
その分汎用性はあまりないので、最初に覚えるのはITEMS.registerで良いでしょう。

さて、余分なアイテムですが、なんだか設定がいっぱいくっついていますね。
これ、いい材料になると思うので、そのまま流用できるように取っておきましょう。
(本当に気になってどうしようもない人は消しても問題ありません)
(逆に言えばあっても問題ないのです)

なのでまずは本題に戻りましょう。

アイテムの名前を変えるためには、

"item.practicemymod.example_item": "Example Item",

これでしたね。
正確には、

"item.<ここにご自身のModID>.<ここにアイテムの名前>": "<ここに表示させたい名前>",

です。

そこで今回は「coal_diamond」は「Coal Diamond」、「steel」は「Steel」にしたいと思います。
以下のコードを、「en_us.json」の中に追記しましょう。
(ここもコピペする場合には、practicemymodの部分をご自身のModのIDに変更するのを忘れずに)
場所はどこでも大丈夫ですが、アイテムの名前はアイテムの名前でまとめておいた方が分かりやすいです。

"item.practicemymod.coal_diamond": "Coal Diamond",
"item.practicemymod.steel": "Steel",

変更できたら、保存をして、テスト起動してみましょう。

どうでしょうか?名前が変わっていたでしょうか?
こうすることでアイテムらしい名前になりましたね!

アイテムの名前を日本語にしてみよう

ということでアイテムの名前を変えられましたが、せっかくマイクラは日本語にしているのに、アイテム名は英語のまま・・・。

そこで!アイテム名も日本語にしちゃいましょう!

assets/
 └─ <modid>/
      ├─ lang/
      |   └─ en_us.json
      ├─ models/
      └─ textures/

現在はこのようなフォルダ階層ですが、そもそも「lang」は多言語化するときのデータを入れておく場所です。
ということは日本語化のデータもここに入れればいいのです!

ファイル名は「ja_jp.json」になります。

assets/
 └─ <modid>/
      ├─ lang/
      |   ├─ en_us.json
      |   └─ ja_jp.json ← これを新しく作る!
      ├─ models/
      └─ textures/

「ja_jp.json」ファイルが出来上がったら、この中に以下を記載しましょう!
(ここでも、コピペする場合には、practicemymodの部分をご自身のModのIDに変更するのを忘れないようにしてください)

{
    "item.practicemymod.coal_diamond": "炭製ダイヤモンド",
    "item.practicemymod.steel": "鋼鉄"
}

これができたら、保存をして、再度テスト起動して確かめてみましょう!

名前が日本語になっていれば完璧です!

というわけでアイテムの表示名を無事変えることができました。
お疲れ様でした。

おわりに&次回予告

今回は以上になります。

これでアイテムが登録できて、名前も見た目も自由に変更できます!
これだけでも自作Mod感が出てきましたね!
あとは好きなだけアイテムを追加していきたいですね!

しかしところで。
今、その自作アイテム、どうやって取得していますか?

というところが次回の話題。
オリジナルのクリエイティブタブからちゃんとアイテムを取得できるようにしよう!という感じです。

ということで今回はこの辺で。
ありがとうございました。
次回もお楽しみに!

コメント