はじめに
本記事は、以下の記事の続編であり、この記事の内容を前提とします。まだご覧になっていない方は先にこちらをご覧ください:
本記事では、アドオン制作の要となる、立体ブロックの制作方法について説明していきます。例えば、下のような駅名標のようなブロックや、改札機、入場用の簡易改札機といったカスタムブロックを自由自在に作ることができ、だいぶアドオンの世界観が広がります。

Blockbenchで立体モデル作成
立体ブロックの作成に当たっては、まずはそれに特化したモデリングソフトが必要です。実は、マインクラフトにはそれに特化したソフトが存在します。一度は耳にしたことがあるでしょうか、BlockBenchです。以下のリンクから無料でダウンロードできます:
ダウンロード方法
以下では、詳細にダウンロード方法について示します。まずは、上記のリンクをクリックしてください。別タブでリンクが開きます。

中央部にある、青い「DOWNLOAD」ボタンを押します。
すると、以下のページに遷移します。自分の環境にあったOSのインストーラーを選択しましょう:

青いボタンを押して、適当な場所に実行ファイルを保存します。

これをダブルクリックして実行し、以下に表示される「同意する」をクリックします:

しばらく待つと準備が完了します。以下のページが表示されたら成功です:

ジオメトリ(立体モデル)の作成
BlockBenchのクイックセットアップのメニューより「Bedrock Block」を選択します。
File NameとModel Identifierを入力する欄が出現するので、これらを入力します。特にModel Identifierは後で使うので必ず入力しておきましょう。ここが空欄だと後でひと手間増えます。

ようやく3Dモデルを作る用意が整いました。まず、右側の「Add Cube」を選択して立方体を配置してみましょう:

すると、小さな立方体が表示されると思います。これを自由に拡大・縮小あるいは位置を変えるなどして任意の3Dジオメトリを作っていくことになります。

これができたら、次にテクスチャーを付けていきましょう。右上のPaintを選択します。

左側のメニューより「Create Texture」を選択します。

適当に色を塗っていきましょう:

色が塗れたら、右側のファイルマークを選択し、このpngファイルを保存します。

保存先は、リソースパックのtextures/blocksフォルダ内と決まっています。ここに保存しないと正常に動作しないので、必ずこのフォルダ内に保存するようにしましょう。名前は(このブロックのid).pngなどとすると分かりやすいでしょう。
続いて、FileメニューよりExport、Export Bedrock Geometryを選択し、この3Dモデルのエクスポートを行います。出力先はリソースパックのmodels/blocksとなっているので気を付けましょう。

ジオメトリの紐づけ
次に、この3Dモデルとブロックを紐づけます。ビヘイビアパックのblocks内の、ブロックを定義しているjsonファイルを開きましょう。その後、以下の”minecraft:geometry”をいうコンポーネントを追加します:
"minecraft:geometry": "geometry.(ジオメトリーのid)",
例えばあなたが先ほど「test_block」というModel Identifierを付けたならば、
"minecraft:geometry": "geometry.test_block"
となります。
テクスチャーの割り当て
続いて、“material_instances”というコンポーネントを追加し、このブロックのテクスチャーを割り当てます。テクスチャーの画像がtest_blockならば、以下のように定義します:
"minecraft:material_instances": {
"*": {
"texture": "test_block"
}
なお、スクリプト中の「*」(アスタリスク)は全ての面に指定のテクスチャーを割り当てることを示します。一般的にはこれが使われることが多いでしょう。一応、”up”,”down”,”west”,”east”,”south”,”north”などを用いることで面ごとにテクスチャーを分けることは可能です(これは画像がbook_table及びbook_table_sideの場合の例です):
"minecraft:material_instances":{
"up":{"texture":"book_table","render_method":"blend"},
"down":{"texture":"book_table","render_method":"blend"},
"south":{"texture":"book_table_side","render_method":"blend"},
"north":{"texture":"book_table_side","render_method":"blend"},
"east":{"texture":"book_table_side","render_method":"blend"},
"west":{"texture":"book_table_side","render_method":"blend"}
},
当たり判定の設定
当たり判定を設定するには、“minecraft:collision_box”と”minecraft:selection_box”という2つのコンポーネントを用います。前者は衝突判定を、後者はブロックとして選択できる範囲をそれぞれ定義しますが、一般的にはこれらは一体的に設定されることが殆どでしょう。以下は使用例です:
"minecraft:collision_box": {
"origin": [-2, 0, -2],
"size": [4, 4, 4]
},
"minecraft:selection_box": {
"origin": [-2, 0, -2],
"size": [4, 4, 4]
}
originは起点で、x,y,zの順で配列形式で指定します。sizeも同様で、x,y,zの順で0以上16以下の整数値を持つ配列形式となります。起点のx,z座標は-8以上8以下であり、y座標は0以上16以下である必要があります。
Jsonファイル全文
以下に、立体ブロックtest_blockを定義するJSONファイルの全文を示します。あくまでこれは最小構成ですので、この通りに定義する必要はありませんが、これらの要素の1つでも足りないとうまく動きません:
{
"format_version": "1.20.0",
"minecraft:block": {
"description": {
"identifier": "lemon_q0v0p:test_block",
"menu_category": {
"category": "construction"
}
},
"components": {
"minecraft:geometry": "geometry.test_block",
"minecraft:material_instances": {
"*": {
"texture": "test_block"
}
},
"minecraft:collision_box": {
"origin": [-2, 0, -2],
"size": [4, 4, 4]
},
"minecraft:selection_box": {
"origin": [-2, 0, -2],
"size": [4, 4, 4]
}
}
}
}
テクスチャーの紐づけ
これは前回と同様です。リソースパックのtextures/terrain_texture.json内で、以下のようにブロックのidとテクスチャーを紐づけます。
{
"num_mip_levels" : 4,
"padding" : 8,
"resource_pack_name" : "lemon_pack",
"texture_data" : {
"test_block" : {
"textures" : "textures/blocks/test_block"
}
}
}
スクリプト中に2つ出てくる「test_block」ですが、一つ目のtest_blockはブロックのidと、2つ目のそれはテクスチャーの名前(pngファイルで、拡張子を除いたもの)とそれぞれ一致している必要があります。全て同じ名前に統一しておくと間違いがなくて楽だと思います。
確認
以上を保存し、実際にこのアドオンを有効化して挙動を確認してみましょう:

実際にオリジナルのジオメトリーを持ったブロックが定義できていることが確認できると思います。