【マインクラフト（統合版）】ダミーブロックの作り方まとめ

# はじめに

ここではダミーブロックの作り方を通して、カスタムブロックを作る上で最低限必要な基本部分の実装をまとめています。

以下の環境ではこの作り方を基本としていますので、この環境に倣ってご紹介します。

https://qiita.com/glasses_seven/items/433ac9d9fcbdb72c6d18/


# 定義ファイルの内訳

カスタムブロックを作るためにはビヘイビアパックとリソースパックの両方が必要になりますが、最低限以下のテクスチャを含めて５ファイルを追加すれば実装は完了します。

:::note info
ここでは`customize:dummy_block`というブロックIDを使う想定でファイル名を記載しています。
:::

```text:ビヘイビアパック内で必要になるファイル
/<ビヘイビアパックのルート>
    /blocks
        dummy_block.json
```

```text:リソースパック内で必要になるファイル
/<リソースパックのルート>
    /texts
        en_US.lang
    /textures
        /blocks
            dummy_block.png
        terrain_texture.json
    blocks.json
```


# 定義ファイルの内容

### ビヘイビアパック

```json:blocks/dummy_block.json
{ 
    "format_version": "1.20.80", 
    "minecraft:block": { 
        "description": { 
            "identifier": "customize:dummy_block"
        },
        "components": { 
        }
    } 
}
```

上記の`format_version`と`minecraft:block`定義ブロックの部分は固定だとお考えください。

<dl>
    <dt>・description</dt>
    <dd>
        <dl>
            <dt>identifier</dt>
            <dd>ブロックIDを設定します。カスタムブロックを作る場合はネームスペース（今回の場合は"customize"）も入れましょう。<br /></dd>
            <dt>menu_category</dt>
            <dd>
                <a href="https://qiita.com/glasses_seven/items/b41797e3df3325c3fab5/">&gt;&gt; ダミーアイテム</a>でご紹介したものがそのまま使えます。<br />
                このブロック自体が未定義の場合はどのメニューにも表示されません。
            </dd>
        </dl>
    </dd>
    <dt>・components</dt>
    <dd>
        この部分でブロックが持つさまざまな性質や機能を定義する事ができるので、見た目も含めたオリジナルコンテンツを作る時はこの部分の定義がメインになるでしょう。<br />
        ダミーブロックを作るだけなら空のままで問題ありません。<br />
        定義内容についての詳細は以下の<a href="#コンポーネント定義">&gt;&gt; コンポーネント定義</a>の項目をご覧ください。
    </dd>
</dl>

### リソースパック

```text:texts/en_US.lang
tile.customize:dummy_block.name=ダミーブロック
```

ここではブロック名を定義します。
カスタムエンティティを作成する場合と同様にen_US.langファイルが規定の言語ファイルになります。

```json:textures/terrain_texture.json
{
    "resource_pack_name": "family-customize", 
    "texture_name": "atlas.terrain", 
    "padding": 8, 
    "num_mip_levels": 4, 
    "texture_data": { 
        "dummy_block": { 
            "textures": "textures/blocks/dummy_block" 
        }
    } 
}
```

上記の`resource_pack_name`、`texture_name`、`padding`、`num_mip_levels`の定義ブロックは固定だとお考えください。
ここではテクスチャファイルの所在をキー名（命名は自由ですが、今回は"dummy_block"としています）と共に定義します。

<dl>
    <dt>・texture_data</dt>
    <dd>
        この部分は他のカスタムブロック定義でも使うので、分かり易いように実装するブロック名をキーにするのがいいでしょう。<br />
        <code>textures</code>の項目にテクスチャのパスを設定します。<br />
        <code>textures/blocks</code>に格納するので、今回の場合はネームスペースを省いて<code>textures/blocks/dummy_entity</code>としています。<br />
    </dd>
</dl>

```json:blocks.json
{ 
    "format_version": "1.19.30", 
    "customize:dummy_block": { 
        "textures": { 
            "up": "dummy_block", 
            "down": "dummy_block", 
            "north": "dummy_block", 
            "south": "dummy_block", 
            "east": "dummy_block", 
            "west": "dummy_block" 
        }, 
        "carried_textures": "dummy_block", 
        "sound": "stone" 
    }
}
```

上記の`format_version`の部分は固定だとお考えください。
ここでは`textures/terrain_texture.json`で定義したテクスチャ名を使って、六面のテクスチャを割り当てます。
また、`textures/terrain_texture.json`の定義内容と同様に、他のカスタムブロックの定義も入るので、ネームスペースを含めたブロック名、またはIDをキーとして使用します。

<dl>
    <dt>・customize:dummy_block（カスタムブロック名、またはID）</dt>
    <dd>
        <dl>
            <dt>textures</dt>
            <dd>
                ここには六面体の各面に貼り付けるテクスチャ名を指定します。<br />
                今回は<code>textures/terrain_texture.json</code>内の<code>texture_data</code>定義ブロック内で設定した<code>dummy_block</code>を指定しています。<br />
                <dl>
                    <dt>up</dt>
                    <dd>上面のテクスチャ名を指定します。</dd>
                    <dt>down</dt>
                    <dd>下面のテクスチャ名を指定します。</dd>
                    <dt>north</dt>
                    <dd>北面のテクスチャ名を指定します。</dd>
                    <dt>south</dt>
                    <dd>南面のテクスチャ名を指定します。</dd>
                    <dt>east</dt>
                    <dd>東面のテクスチャ名を指定します。</dd>
                    <dt>west</dt>
                    <dd>西面のテクスチャ名を指定します。</dd>
                </dl>
            </dd>
            <dt>carried_textures</dt>
            <dd>
                アイテムスロットに表示するテクスチャ名を指定します。<br />
                ここで指定したテクスチャを１面分のテクスチャとして六面に配置した図形を自動で作成してくれます。<br /><br />
            </dd>
            <dt>sound</dt>
            <dd>
                このブロックを置いたり、上を歩いたりした時のサウンドの種類を指定します。<br />
                指定できるサウンドについては以下を参照。<br />
            </dd>
        </dl>
    </dd>
</dl>

:::note info
`textures`の項目はなくても`carried_textures`で指定したテクスチャで六面を補ってくれますが、各面に別々のテクスチャを使用する場合は必須になります。また、先を見据えて敢えて同じ内容を定義した上で後から入れ替えるようにする方法もアリだと思います。
:::

```text:サウンドの種類
amethyst_block
amethyst_cluster
ancient_debris
anvil
azalea
azalea_leaves
bamboo
bamboo_sapling
bamboo_wood
bamboo_wood_hanging_sign
basalt
big_dripleaf
bone_block
calcite
candle
cave_vines
chain
cherry_leaves
cherry_wood
cherry_wood_hanging_sign
chiseled_bookshelf
cloth
comparator
copper
copper_bulb
copper_grate
coral
creaking_heart
decorated_pot
deepslate
deepslate_bricks
dirt_with_roots
dripstone_block
eyeblossom
frog_spawn
froglight
fungus
glass
glow_lichen
grass
gravel
hanging_roots
hanging_sign
heavy_core
honey_block
itemframe
ladder
lantern
large_amethyst_bud
lever
lodestone
mangrove_roots
medium_amethyst_bud
metal
mob_spawner
moss_block
moss_carpet
mud
mud_bricks
muddy_mangrove_roots
nether_brick
nether_gold_ore
nether_sprouts
nether_wart
nether_wood
nether_wood_hanging_sign
netherite
netherrack
nylium
packed_mud
pale_hanging_moss
pink_petals
pointed_dripstone
polished_tuff
powder_snow
resin
resin_brick
roots
sand
scaffolding
sculk
sculk_catalyst
sculk_sensor
sculk_shrieker
sculk_vein
shroomlight
slime
small_amethyst_bud
snow
soul_sand
soul_soil
sponge
spore_blossom
stem
ston
stone
suspicious_gravel
suspicious_sand
sweet_berry_bush
trial_spawner
tuff
tuff_bricks
turtle_egg
vault
vines
web
wet_sponge
wood
```


# テストしてみる

ここまで定義できればダミーブロックとしての最低限の実装は完了です。
この時点で正しく使えるのかテストしておいた方がいいでしょう。

但し今のままでは、コマンドで取得したり設置もできますが、テクスチャがないので見た目がバグります。

そこで以下の手順に従ってテストを進めてください。

### ①ダミー画像を設置

リソースパック内の`textures/blocks`の場所にダミー画像を格納してください。

基本的にデザインやサイズ（１６×１６が一般的なようです）は何でも構いませんが、正方形の画像を用意して下さい（今回は青一色のテクスチャを適用しています）。

`textures/terrain_texture.json`内の`texture_data`定義内で指定した`dummy_block`という名前がファイル名になるので`dummy_block.png`という名前にしておきます。

### ②コマンドで取得する

コマンド行で`give @s customize`というところまで入力すると、入力補助の機能が働いて以下の赤枠部分のように選択できるブロックIDが表示されるはずです。

<img src="https://socket-manager.github.io/document/minecraft-contents/img/custom-block-dummy/give-input.png" height="333px" width="500px" />

これが表示されればJSONファイルが正しく認識されています。
後は実際に`give`コマンドを使って取得すると以下のように表示されます。

<img src="https://socket-manager.github.io/document/minecraft-contents/img/custom-block-dummy/item-slot.png" height="333px" width="500px" />

そしてそのダミーブロックを実際に設置してみて六面体が表示できていれば完成です。

<img src="https://socket-manager.github.io/document/minecraft-contents/img/custom-block-dummy/block-put.png" height="333px" width="500px" />


# コンポーネント定義

これまでの設定でベースの部分は出来上がりました。
あとは用途に応じてビヘイビアパック内にある`blocks/dummy_entity.json`ファイルの`components`定義ブロックに都度必要な定義を追加していく事になります。

ここでは`components`定義ブロックのうち本環境で主に使っているものを中心にピックアップしておきます。

<dl>
    <dt>・minecraft:light_emission（デフォルト：0）</dt>
    <dd>
        光源レベルを0～15の範囲で設定します。<br />
        数字が大きいほど明るくなります。<br /><br />
    </dd>
    <dt>・minecraft:collision_box（デフォルト：true）</dt>
    <dd>
        エンティティと衝突するブロック領域をブール値、またはJSONオブジェクトで設定します。<br />
        trueに設定すると以下のデフォルト値で衝突判定が発生し、falseに設定すると衝突しなくなります。
        <dl>
            <dt>origin（デフォルト：[-8.0, 0.0, -8.0]）</dt>
            <dd>
                衝突ボックス境界の最小値を(-8, 0, -8)～(8, 16, 8)の範囲で設定します。
            </dd>
            <dt>size（デフォルト：[16.0, 16.0, 16.0]）</dt>
            <dd>
                衝突ボックスの各辺のサイズを設定します。<br />
            </dd>
        </dl>
    </dd>
    <dt>・minecraft:loot</dt>
    <dd>
        ブロックが破壊された時のドロップテーブルへのパスを設定します。<br />
        指定がない場合はブロックが必ずドロップします。<br />
        空のJSON、あるいは存在しないファイルを指定すると、シルクタッチを使わない限りドロップしません。<br /><br />
    </dd>
    <dt>・minecraft:destructible_by_mining（デフォルト：true）</dt>
    <dd>
        ブロックを破壊するのにかかる時間を設定します。<br />
        trueに設定すると以下のデフォルト値で時間が設定されます。falseに設定すると破壊できなくなります。
        <dl>
            <dt>seconds_to_destroy（デフォルト：0.0）</dt>
            <dd>
                ブロックの破壊にかかる秒数を設定します。
            </dd>
        </dl>
    </dd>
    <dt>・minecraft:destructible_by_explosion（デフォルト：true）</dt>
    <dd>
        ブロックの爆発による破壊耐性を設定します。<br />
        trueに設定すると以下のデフォルト値で設定されます。falseに設定すると爆発による破壊はできなくなります。
        <dl>
            <dt>explosion_resistance（デフォルト：0.0）</dt>
            <dd>
                爆発耐性を設定します。<br />
                数値が大きいほど耐性が高くなります。<br />
                0以下の場合はすぐに破壊されます。
            </dd>
        </dl>
    </dd>
    <dt>・minecraft:material_instances</dt>
    <dd>
        以下の六面体のキー項目に対する定義を設定します。<br />
        <dl>
            <dt>up</dt>
            <dd>上面</dd>
            <dt>down</dt>
            <dd>下面</dd>
            <dt>north</dt>
            <dd>北面</dd>
            <dt>south</dt>
            <dd>南面</dd>
            <dt>east</dt>
            <dd>東面</dd>
            <dt>west</dt>
            <dd>西面</dd>
            <dt>*</dt>
            <dd>
                上記の項目に存在しない定義をここで補うためのワイルドカード的な存在です。
            </dd>
        </dl>
        上記の項目をキーとして以下の項目が設定できます。
        <dl>
            <dt>texture</dt>
            <dd>
                <code>&lt;リソースパック&gt;/textures/terrain_texture.json</code>で定義されているテクスチャ名を設定します。<br />
                ジオメトリ定義がないと有効にならないようなので注意が必要です。
            </dd>
            <dt>render_method（デフォルト："opaque"）</dt>
            <dd>
                以下のいずれかのレンダリングメソッドを設定します。
                <dl>
                    <dt>opaque</dt>
                    <dd>透明や半透明を許可しない。</dd>
                    <dt>double_sided</dt>
                    <dd>
                        バックフェイスカリングの完全無効化。<br />
                        見た目は<code>opaque</code>と変わらない。
                    </dd>
                    <dt>blend</dt>
                    <dd>
                        透明や半透明を許可する。<br />
                        バックフェイスカリングは有効になります。
                    </dd>
                    <dt>alpha_test</dt>
                    <dd>
                        完全に不透明、または完全に透明なテクスチャを許可します。<br />
                        バックフェイスカリングは無効化します。
                    </dd>
                    <dt>alpha_test_single_sided</dt>
                    <dd>
                        完全に不透明、または完全に透明なテクスチャを許可します。<br />
                        バックフェイスカリングは有効になります。
                    </dd>
                </dl>
            </dd>
        </dl>
    </dd>
</dl>

:::note info
一部例外はありますが、基本的に定義されていないデータブロック、および値は暗黙的にデフォルト値が適用されます。
:::


# おわりに

ダミーブロックが完成したら、テクスチャを張り替えるなりコンポーネント定義を追加するなりして、自分なりのカスタムブロックを作ってみましょう。

本環境では以下のページでご紹介させて頂いたコンテンツ内で今回の作り方をベースに応用しています。

https://qiita.com/glasses_seven/items/e3cf4ae07ce1c67383e1/