TOP > チュートリアル一覧 > Minecraft MOD ブロックリソースの追加方法 [1.10.2/1.12.2]
投稿:2018年5月9日

今回は、Minecraft JE版 でブロックリソースを追加するためのチュートリアルです。
鎮守府MODのソースは GitHub で公開していますので、気になる方はそちらをご覧ください。
1.リソースパッケージのツリー構造
ブロックのリソースでは、主に以下の3つのファイルが関わっています。
・ワールドにおけるブロックの状態を決める.jsonファイル
・ブロックとしての描画に使う.jsonファイル
・ブロックとしての描画に使う.pngファイル
鎮守府MODの閃緑岩レンガ(block_bricks_dio_c) を例に挙げると、3つのファイルは画像のような相関関係を作ります。
リソースとブロックの設計図であるクラスとは、RegistryName または UnlocalizedName を使って紐付けをします。そして、紐付けによって呼び出すのは blockstatesパッケージ 内の .jsonファイルとなります。
ブロックを実装する際は ItemBlock までを含んでリソースを追加するため、画像では ItemBlock の表示に使う jsonファイルも併記しています。
2.ブロックの状態を決めるblockstateの.jsonファイル
ブロックはワールドに置かれた際、次のような状態情報(メタデータ値)を持てるようになっています。
・プレイヤーがブロックを置いた時に向いていた方角
・作物の成長段階
・ほかのブロックとの接触
・ブロックが右クリックされた回数 など
blockstate の .jsonファイルを使って、メタデータ値に応じたモデルの呼び出しを行うことで、差分のあるブロックを作ることが可能となります。
ただし、メタデータ値を利用する場合は、別途、ブロックの設計図であるクラスの方で、どのようなメタデータ値を使うかを定めておく必要があります。
2-1.差分を持たないブロックのblockstate
バニラの土ブロックや石ブロックのほか、鎮守府MODの閃緑岩レンガ(block_bricks_dio_c) のように、特に差分を持たないブロックは次のようなソースになります。
blockstates/block_brick_dio_c.json
|
差分があるかどうかを尋ねる “variants” に対して、差分は無いため “normal” と返しています。その上で、”model” として “chinjufumod:block_brick_dio_c” を呼び出しています。
2-2.状態情報(メタデータ値)のあるblockstate
次に、メタデータ値を利用する場合のチュートリアルです。
2-2-1.方角による差分のあるブロック
バニラのかまどや松明のほか、鎮守府MODの食卓椅子(シラカバ) block_diningchair_b のように、方角による差分があるブロックは次のようなソースになります。
blockstates/block_diningchair_b.json
|
差分があるかどうかを尋ねる “variants” に対して、”facing=north” を含む4つの差分があると返しています。その上で、”model” として “chinjufumod:block_dchair_b” を呼び出しており、”y”: 180 などを使って同モデルを方角に応じて回転させています。
2-2-2.変化する段階のあるブロック
バニラの小麦やレッドストーンリピーターのほか、鎮守府MODのキャベツ(block_vege_cabbage) のように、変化する段階のあるブロックは次のようなソースになります。
blockstates/block_vege_cabbage.json
|
差分があるかどうかを尋ねる “variants” に対して、”age=0″ を含む8つの差分があると返しています。その上で、それぞれの差分に応じた “model” として “chinjufumod:block_vege_cabbage_0” などを呼び出しています。
2-2-3.ほかのブロックとの接触
バニラの階段ブロックやフェンスのほか、鎮守府MODのカフェテーブル(シラカバ) block_cafetable_b のように、ブロックとの接触で差分を持つ場合は次のようなソースになります。
blockstates/block_cafetable_b.json
|
差分があるかどうかを尋ねる “variants” に対して、”back=false,forward=true,left=false,right=true” を含む16の差分があると返しています。その上で、それぞれの差分に応じた “model” を呼び出しています。
block_cafetable_b の記述では、前後左右のブロックに対して判定を持っており、判定に応じて差分ブロックを返します。
なお、メタデータ値の並び順は back,forward,left,right とあるようにアルファベット順となります。
2-2-4.複数のメタデータ値を組み合わせたブロック
バニラのレッドストーンリピーターや、鎮守府MODのパネル(オーク原木) block_wp_log_oak のように、複数のメタデータ値を組み合わせる場合は次のようなソースになります。
blockstates/block_wp_log_oak.json
|
差分があるかどうかを尋ねる “variants” に対して、”facing=north,log=1″ を含む12の差分があると返しています。その上で、それぞれの差分に応じた “model” を呼び出しています。
なお、メタデータ値の並び順は facing,log とあるようにアルファベット順となります。
3.ブロックの形状を決めるblockの.jsonファイル
Minecraftにおけるブロックは、小数点以下も指定できる座標を使って、1個または複数個の直方体の組み合わによって形状を作っていきます。
基本的には [0.0, 0.0, 0.0] から [16.0, 16.0, 16.0] の範囲内で、描画に必要な直方体を配置していきます。この範囲内であれば、貼り付けるテクスチャの指定も簡易に済ませることが可能です。
しかし、貼り付けるテクスチャに関してどの範囲を使うかの座標指定をすると、より大きなブロックを描画することもできます。具体的には、[-16.0, -16.0, -16.0] から [32.0, 32.0, 32.0] まで使えるようになります。
3-1.すべての面に同じテクスチャを貼る立方体
バニラの土ブロックや石ブロックのほか、鎮守府MODの閃緑岩レンガ(block_bricks_dio_c)のように、すべての面に同じテクスチャを貼る立方体は次のようなソースになります。
chinjufumod:block/block_brick_dio_c.json
|
“parent”: “block/cube_all” で、バニラの中にあるすべての面に同じテクスチャを貼る立方体のモデルを呼び出します。さらに、”all”: “chinjufumod:blocks/stonebrick_dio”で、すべての面にchinjufumodの中にある stonebrick_dio.png を貼るように指示をしています。
3-2.面によってテクスチャを変えたブロック
バニラの原木ブロックや作業台のほか、鎮守府MODの柱(花崗岩) block_brick_gra_pil_c のように、面によって貼るテクスチャを変えるブロックは次のようなソースになります。
chinjufumod:block/block_brick_gra_pil_c.json
chinjufumod:block/base_stone_pillar.json |
block_brick_gra_pil_c.json では、”parent”: “chinjufumod:block/base_stone_pillar” で、鎮守府MODの中にある base_stone_pillar.json を呼び出しています。さらに、”top” という名前のテクスチャとして stonepillar_top_gra.png を、”side” という名前のテクスチャとして stonepillar_gra.png を呼び出しています。
一方のbase_stone_pillar.json では、”parent”: “block/block”を呼び出した上で、[0,0,0]と[16,16,16]を結ぶ立方体というブロックの形状を決めています。さらに、上面と下面には”#top”に対応したテクスチャを、側面には”#side”に対応したテクスチャを貼るように指示をしています。
ちなみに、”cullface” は、他のブロックとの隣接で見えなくなる面において、テクスチャを省略するためのソースです。
3-3.特殊な形状のブロック
バニラのフェンスやホッパーのほか、鎮守府MODの提督の椅子(block_admiralchair)などのように、特殊な形状のブロックは次のようなソースになります。
chinjufumod:block/block_admiralchair.json
|
提督の椅子では、その形状を他のブロックに応用しないため、形状の記述とテクスチャの指定を1つの.jsonファイルにまとめています。
“parent”: “block/block”を呼び出した上で、[0,0,0] と [2,6,2] を結ぶ椅子の脚や、[0,6,14] と [16,16,16]を結ぶ背もたれなどを組み合わせて、椅子の形状を作っています。
また、提督の椅子には、”back_top”などの高さが16を超える箇所があります。これらの箇所では、”north”: { “uv”: [ 0.0, 3.0, 16.0, 16.0 ], “texture”: “#top” }など、使用するテクスチャに座標指定を加えることで、テクスチャエラーを回避しています。
まとめ
今回は長くなりましたが、個人的には、この辺りまでがブロックのリソースに関する基本編と考えています。さらに細かい話については、クラス側のチュートリアルで解説を加えるかもしれません。
ブロックの形状を記述する .jsonファイルを考えるときは、Blockbench などのモデルエディターを使うとよいかもしれません。直方体を組み合わせながらモデルを作ることが可能で、モデルデータを.jsonファイルで出力することもできます。
「かもしれない」というのは、私はモデルエディターの操作性が苦手であまり使っていないからです。複雑な形状を考える場合、だいたいは方眼画像を開いて平面で考えています。
・円形のちゃぶ台を考えた際の形跡
・ティースタンドを考えた際の形跡
このチュートリアルは参考になりましたか? シェアはこちらをご利用ください。
Was this tutorial helpful? Please use here for market share.
当サイトは年間6,480円のサーバー代がかかるため、投げ銭をしてもらえると助かります。
This site costs 6,480 yen per year for server fee. It will be helpful if you make a donation.
Bitcoinで投げ銭をする Bitcoin donations
MONAで投げ銭をする MONA donations

yumo
このチュートリアルに沿って試しに一つブロックを作ってみたのですが、ブロックにテクスチャや名前が反映されずに困っております。鎮守府modのソースと照らし合わせながらコードの誤りをしばらく探していますが、発見できず、かといってエラーが出るわけでもなく、お手上げです。どこを見直したらよさそうでしょうか。対処法をご指南ください。
kakkee
この記事の見出し2の冒頭、「ただし、メタデータ値を利用する場合は、別途、ブロックの設計図であるクラスの方で、どのようなメタデータ値を使うかを定めておく必要があります。」とのことですが、これについて詳しく教えてください。
現在、eclipseをつかってmodを作っているのですが、facingをつかってblockstatesを書くとテクスチャが飛んでしまいます。手に持った状態やインベントリにある状態では正しくテクスチャが描画されているのですが…。また、普通にnormalで書き直すと、ちゃんとテクスチャのあるブロックを置くことができました。
どのようにしたらfacingブロックを置けるようになりそうでしょうか、ご回答お待ちしております。
鮎滝渉(Ayutaki Shou) 投稿者
まだ手を回せていないチュートリアルの項目を含んでいる状態なので、混乱させてしまっています。申し訳ありません。
facingブロックを実装するには、javaで書いている class の方へ「facingのプロパティを使うためのコード」を書き加える必要があります。
具体的には、現行の鎮守府MOD3.xにおいて BlockFacingSapo.java を使って追加しているコード群です。
http://urx.blue/M7HM (1.12.2用)
1.12.2に合わせてコードの整理をしたために現行での良い例がないのですが、少し前の 1.10.2用では、このようなコードを書いていました。
http://urx.blue/M7Ib (1.10.2用)
チェストやかまどなど、向きのあるブロックのコードも参考になると思います。