前回の記事では、ブロックのモデルを書き換えてテクスチャーを変更してみました。この記事では、モデルよりもさらに上位で、ブロックのテクスチャーに影響するブロック状態について見ていきます。ブロックのモデルについては、前回の記事を見てください。なお、この記事の内容は Windows にインストールしたマインクラフト(マイクラ)の Java版での方法です。
石ブロックのテクスチャーを変える
まず、石ブロックのテクスチャーを、モデルを書き換えることで、花崗岩ブロックのテクスチャーに変更してみます。
バージョン.jar を解凍してできたフォルダーから、モデルが保存されているフォルダーに行き、stone.json を見つけます。その内容は次のようになっています。
{ "parent": "minecraft:block/cube_all", "textures": { "all": "minecraft:block/stone" } }
ブロックのモデルとしては最も単純なものになっています。
石ブロックの全面のテクスチャーを花崗岩ブロックのテクスチャーに変えるには、4行目の stone を granite に変えるだけでよいはずです。
前回、前々回の記事と同様、
.minecraft → resourcepacks → MyPack
フォルダーを作り、その中に
assets → minecraft → models → block
というフォルダー階層を作ります。この block フォルダー内に書き換えた stone.json ファイルを置きます。また、MyPack フォルダー内には、前々回の記事で書いたとおり、pack.mcmeta ファイルを置かなければなりません。これで、MyPack はリソースパック(リソパ)として機能します。
マイクラを起動して MyPack を読み込ませ、石ブロックを置いてみると下のようになります。
石ブロックのモデルを書き換えたので、テクスチャーは花崗岩のものに変わるはずなのですが、元の石ブロックのテクスチャーが残っている部分があります。
花崗岩のテクスチャーが現れる部分は、一見ランダムに見えますが、何度ブロックを置き直しても同じパターンが再現されます。つまり、このパターンは乱数で決まるものではなく、ブロックの座標から決定論的なアルゴリズムで決められています。
石ブロックの状態
上で見たのは、石ブロックのテクスチャーが、ブロックがどの座標を占めているのか、という状態によって決まるらしい、ということです。
マイクラのブロックには座標以外にも、例えば、トラップドアが開いているか閉じているか、といったような、ブロックの状態によって見え方が変わるものがあります。そのような、ブロック状態による見え方の変化を記述しているファイル群は、
assets → minecraft → blockstates
に置かれています。
このフォルダーの中から、stone.json を探して内容を見ると、
{ "variants": { "": [ { "model": "minecraft:block/stone" }, { "model": "minecraft:block/stone_mirrored" }, { "model": "minecraft:block/stone", "y": 180 }, { "model": "minecraft:block/stone_mirrored", "y": 180 } ] } }
となっています。
まず2行目を見ると、石ブロックには何種類かの variant = 変化形 がある、ということが分かります。下の方を見ていくと、model が4つ記述されています。つまり、このファイルには4種類の変化形が記述されているのです。
さらに、使われているモデルの種類を見ると、stone と stone_mirrored の2種類があると分かります。石ブロックのテクスチャーを決めるモデルは stone だけではなかった、ということになります。これが、モデルを記述する stone.json を書き換えても、全ての石ブロックのテクスチャーが変わらなかった理由です。
このファイルをもう少し詳しく読んでみます。
3行目にある “” の中には条件が入るのですが、今の場合は、条件なし、となっています。その後の [ は配列を表していて、4つのモデルを囲っています。つまり、明示されない何らかの条件で、配列内のモデルのどれかが選ばれる、ということです。この、何らかの条件、というのが、座標から計算されるパラメータ、ということなのでしょう。
4つのモデルの中には、モデルの名前の後に “y”: 180 という記述の見られるものがあります。これは、y軸の周りに 180度回転させる、という意味です。マイクラの y軸は鉛直方向なので、これはブロックの上面と下面のテクスチャーを 180度回転させることになります。
石ブロックのテクスチャーを完全に変えたければ、stone モデルに加えて stone_mirrored モデルを書き換える必要があります。多分、これまでの知識がある人ならば簡単にできるでしょう。
土ブロックと玄武岩ブロック
ブロック状態の例をもう少し見てみます。
blockstates フォルダーの中から、土ブロックのブロック状態を記述する dirt.json を探して中を見ます。
{ "variants": { "": [ { "model": "minecraft:block/dirt" }, { "model": "minecraft:block/dirt", "y": 90 }, { "model": "minecraft:block/dirt", "y": 180 }, { "model": "minecraft:block/dirt", "y": 270 } ] } }
これは石ブロックの場合よりも簡単で、使われているモデルは dirt の1種類だけです。それを座標によって 90度単位で回転させていることが分かります。
次に、玄武岩ブロックのブロック状態を記述する basalt.json の内容を見てみます。
{ "variants": { "axis=x": { "model": "minecraft:block/basalt", "x": 90, "y": 90 }, "axis=y": { "model": "minecraft:block/basalt" }, "axis=z": { "model": "minecraft:block/basalt", "x": 90 } } }
玄武岩ブロックは原木のように向きのあるブロックです。そのため、モデルを選ぶ条件の部分に “axis=x” のような記述が見られます。しかし、使われているモデルは basalt の1種類のみとなっています。
最も簡単なのは “axis=y” の場合で、回転についての記述がありません。y軸は鉛直方向なので、玄武岩のテクスチャーは回転させない状態では、垂直に立った状態で描かれていることになります。
垂直に立ったものを z軸方向に向けるには、x軸周りに 90度回転させなければなりません。これが条件 “axis=z” の部分に書かれている内容です。
“axis=x” の場合については考えてみてください。
まとめ
前回と今回の記事の内容をまとめておきます。
ブロックのテクスチャーが決まるまでには、まずブロック状態によって使うモデルと回転角を決め、次にモデルが使うテクスチャーを決める、という手順が踏まれます。このため、ブロックの見た目を変えるには、場合によっては、モデルやモデルを選ぶ条件の部分を変更する必要が生じます。
前回と今回の記事では説明のために、テクスチャーは変えずにモデルのほうを変えました。しかし、実際にリソパを作る場合には、なるべく、末端に位置するテクスチャーを変え、必要がない限り上位にあるモデルやブロック状態の部分は変更しないほうがよいでしょう。
例えば前回、安山岩に原木のような向きを与えようとしても動作しない、ということを書きました。モデルを書き換える際に、不適切な親モデルを選んだとしても、マイクラの側でそのような変更は弾いてくれるとは思います。しかし、万一のこともあるかもしれないので、やはり注意が必要になります。
また、ブロック状態の記述については、例えばトラップドアの場合、ドアが立方体空間の上下どちら側にあるか、蝶番の向き、ドアの開閉、の16通りの条件の組み合わせを考えなければなりません。これらを書き換えた場合は、全ての状態について動作を確認するデバッグのような作業が必要になります。普通はブロックの見た目を変えれば十分で、動作まで変える必要はないでしょう。石ブロックや土ブロックのように、テクスチャーの回転のみを変える程度に止めたほうがよいと思います。