皆様いかがお過ごしでしょうか。歌乃です。
マイクラやってますか?
今回ちょっとしたきっかけで、マイクラの addon (mod とか リソースパックともいう) を作る機会がありましたので作成の流れてきなものを書きたいと思います。
※いつものごとく大半は戯言です。
最近 AI にはまってましたが、AI 界隈の技術革新の早さについていけず戦線離脱してマイクラで遊んでました。
最新バージョンの 1.21.51 がリリースされたのも要因ですが、以前よりうちのおこちゃまが「強い Mob と戦いたい」と狂戦士のようなセリフを宣わってまして、それを叶えてやるかーという軽いノリで始めてみたわけです。
マイクラの遊び方や攻略法に関しては日本語の情報がたくさんありますが、アドオン関係になるとめっきりと少なくなります。
基本的に情報ソースは海外 (英語圏) を頼ることになります。
ありがたいことにマイクロソフト (公式と言っていいのかな?) が情報を公開してくれているので基本そちらのドキュメントで情報を漁りましょう。
アドオンの作り方も詳しく載っています。じゃあなんでこんな記事書いてんだ?ってなりますが、しょうがない、書きたくなったんだもの( ゚Д゚)
ちなみにオリジナルキャラクター (エンティティ) の公式追加チュートリアルはこちら。
マインクラフトには動作環境が二種類存在します。JAVA Edition (JAVA版)と Bedrock Edition (統合版) です。
二つの違いは文字通り JAVA 上で動くか否か、です。
JAVA はある程度マシンパワーを要求するので、低スペックマシン、あるいは、負荷を減らしたい場合は統合版が選択肢になります。
また JAVA版は PC でしか動かないので Nintendo Switch などで遊びたい場合も統合版一択となります。
一般的にJAVA版の方が自由度が高い ( MOD が導入できる ) と言われていますが、今回は統合版の Addon を作成しています。
Mod は JAVA版 のみに対応、Addon は統合版のみに対応しています。JAVA版 の Mod = 統合版の Addon という認識で問題ないと思われます。
自前の環境ですが、Windows10 で マイクラは 統合版 ( Microsoft Store からの導入 ) しています。
マイクラ統合版のアドオンは用途によって二種類存在します。
リソースパック (resource pack) と ビヘイビアパック (behavior pack) です。
リソースパックとビヘイビアパックに関する説明は後でしますが、このパックの片方または両方を含んだものの事をアドオンと呼んでいるようです。
クライアントからの導入方法は、設定 > グローバルリソース からで、所有済 (ダウンロード済) のアドオンは「マイパック」の中にリストされています。
リストからパックを選ぶと「有効化」ボタンが表示されるので、有効化をクリックすると有効になったアドオンが「使用中」リストに入ります。
使用中リスト内のパックをクリックすると「無効化」ボタンが表示されるので、無効にしたい場合はクリックすれば、使用中リストから外れます。
各ワールド毎にアドオン (ビヘイビアパックとリソースパック)を管理します。
新規作成時に「リソースパック」と「ビヘイビアパック」のリストからそれぞれ有効化するものを選択することができます。
その他のパックを入手したい場合は、マーケットプレイスから購入 (無料のものもたくさんあります) します。
作成済みのワールドも、同様に「リソースパック」と「ビヘイビアパック」を有効化・無効化ができます。
PC統合版の Minecraft は「C:\Users[PCのユーザー名]\AppData\Local\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang」配下にあります。
システムが管理しているディレクトリで、隠し (非表示) ファイルになっているので、エクスプローラのファイルの表示設定から隠しファイルにチェックを入れて隠しファイルが表示されるようにしてください。
com.mojang の配下には
com.mojang
┣ behavior_packs
┣ custom_skins
┣ development_behavior_packs
┣ development_resource_packs
┣ development_skin_packs
┣ minecraftpe
┣ minecraftWorlds
┣ resource_packs
┣ skin_packs
┗ world_templates
といったディレクトリがあります。
アドオンの中身である、ビヘイビアパックは behavior_packs の中に、リソースパックは resource_packs の中に入っています。
同じように機能するディレクトリとして「development_behavior_packs」と「development_resource_packs」があり、開発中 (自作) のアドオンはこちらに置くほうが判りやすくて良いと思われます。
リソースパックは、ゲーム内のキャラクターモデル ( 3D model ) やブロックの見た目 ( texture、レンダリング設定 )、キャラクターの動き ( animation )、サウンドなど、ビジュアルに関するデータを追加することができます。
ビヘイビアパックはリソースパックを拡張したもので、キャラクターやブロックのゲーム内での動作や属性といったシステムに関するデータを追加することができます。
さて今回の目的であるオリジナルモンスターの追加を試してみます。
追加するモンスターは「サソリ」です。チョイスに深い意味はありません。個人的な趣味です。
まずは、見た目を作ります。現実と同じで見た目から入る派です。
マイクラの 3Dモデルデータは json 形式で記載されているので、どんなツールでも (メモ帳でも) 製作可能ですが、ありがたいことに、マイクラ業界標準といっていい「Blockbench」というツールが存在するので、そちらを使います。
Blocbench に関する説明は今回は本筋ではないので省きます (時間ができたら別記事で書きます 書きました(`・ω・´)。
Blockbench を使って作った「サソリ」のモデルがこちら。
見たまんまですね。マイクラモンスターの二大巨頭「クモ」を参考に作りました。
このモデルをリソースパックとして追加していきます。
まずは、オリジナルのリソースパックのルートディレクトリを「development_resource_packs」の配下に作成します。
今回は「utano_mobs_pack_ressources」と言う名前にしました。
他のリソースパックと被らないようなユニークな名前がおすすめです。
今回作るリソースパック (ルートディレクトリ) の中身は以下のような感じになります。
utano_mobs_pack_ressources (ルートディレクトリ)
┣ animation_controllers (アニメーション操作)
┃ black_scorpion.animation_controllers.json
┣ animations (アニメーション)
┃ black_scorpion.animation.json
┣ entity (キャラクタやブロックの設定)
┃ black_scorpion.entity.json
┣ models (3Dモデル)
┃┗ entity
┃ black_scorpion.geo.json
┣ render_controllers (レンダラ設定)
┣ texts (テキストデータ)
┃ en_US.lang
┃ ja_JP.lang
┗ textures (テクスチャ)
┗ entity
black_scorpion.tga
manifest.json (リソースパックの設定)
pack_icon.png (リソースパックのアイコン)
sounds.json (サウンド設定)
上記構成は必須ではありません。サウンドを使わなければ sound設定は必要ないでし、オリジナルのアニメーションを使わない (マイクラ既存のものを使う) のであれば animations や animation_controller も無くてもかまいません。
各ディレクトリ名はシステム固定です。綴りを間違うと動きません。
まずは、これです。これがリソースパックの本体です。これが無いとクライアントがリソースパックを認識してくれません。
manifest.json
{
"format_version": 2,
"header": {
"name": "utano mobs pack",
"description": "utano mobs Resource Pack",
"uuid": "取得したUUID",
"version": [1, 0, 49],
"min_engine_version": [1, 16, 0]
},
"metadata": {
"authors": ["UtanoSchell"],
"generated_with": {
"blockbench_entity_wizard": ["1.6.0"]
}
},
"modules": [
{
"description": "utano mobs pack",
"type": "resources",
"uuid": "取得した別のUUID",
"version": [1, 0, 0]
}
]
}
公式サイトのものをそのままコピーして使ってます。
下手に間違うと動かなくなるので、コピペして必要な部分だけ変えるのが得策です。
Blockbench を使って自動生成するのもありです。ちなみに上記は自動生成です。
上記項目が重要かつ編集必須なもので、後の項目は公式サンプルをそのまま使うのが安全です。
header のUUIDがリソースパックのIDです。modules の UUIDは header のUUID とは別のものを使用してください。
同階層の pack_icon.png は 64 x 64px の画像でクライアントの設定画面で表示されます。
ここの配下に作ったキャラクタorモンスターのデータを配置します。
black_scorpion.entity.json
{
"format_version": "1.8.0",
"minecraft:client_entity": {
"description": {
"identifier": "utano:black_scorpion",
"min_engine_version": "1.8.0",
"materials": {
"default": "spider",
"invisible": "spider_invisible"
},
"textures": {
"default": "textures/entity/black_scorpion"
},
"geometry": {
"default": "geometry.black_scorpion"
},
"animations": {
"default_leg_pose": "animation.black_scorpion.default_leg_pose",
"look_at_target": "animation.black_scorpion.look_at_target",
"walk": "animation.black_scorpion.walk",
"attack": "animation.black_scorpion.attack",
"attack_s": "animation.black_scorpion.attack_s"
},
"animation_controllers": [
{
"move": "controller.animation.black_scorpion.move"
}
],
"render_controllers": ["controller.render.spider"],
"spawn_egg": {
"base_color": "#ffffff",
"overlay_color": "#000000"
}
}
}
}
manifest の時と同様に公式のものをそのまま流用します。何度も書きますが項目のスペルミスをすると動かなくなります。※不具合の大半がこれです。
"spawn_egg" モブを呼び出す卵の設定。Blockbenchで召喚可能を選ぶと自動生成されます。
"materials" の指定ですが、元にしたmobのものをそのまま使うのが無難です。例えば暗闇で目を光らせたいなら、クモがそうなので、マテリアルは "default": "spider" とするなどです。
この既存のマテリアルは、大元の親マテリアルから継承されたものなのですが、詳しい内容は、こちらの記事などが参考になります。
配下に「entity」ディレクトリを作成します。このディレクトリ名は自由につけてOKっぽいんですが、動かないと困るので公式と同じにしてます。
black_scorpion.geo.json はBlockbench で作成したものをそのまま配置します。Blockbenchでエクスポートすれば自動で配置して (ディレクトリも作って) くれます。
Blockbench が作成してくれたものをそのまま配置します。
ビヘイビアパックで使うこともありますが、簡単なアニメーションであればリソースパックのコントローラーで十分間に合います。
black_scorpion.animation_controllers.json
{
"format_version": "1.19.0",
"animation_controllers": {
"controller.animation.black_scorpion.move" : {
"initial_state" : "default",
"states" : {
"default" : {
"animations" : [
"default_leg_pose",
{
"walk" : "query.modified_move_speed"
},
"look_at_target"
],
"transitions" : [
{
"attack" : "variable.attack_time > 0.0"
},
{
"attack_s" : "query.facing_target_to_range_attack > 0.0"
}
]
},
"attack" : {
"animations" : [
"attack",
"look_at_target"
],
"transitions" : [
{
"default" : "variable.attack_time <= 0.0"
}
]
},
"attack_s" : {
"animations" : [
"attack_s"
],
"transitions" : [
{
"default" : "query.any_animation_finished > 0.0 && variable.attack_time <= 0.0"
}
]
}
}
}
}
}
アニメーションコントローラーはステート (states) と言う記述で状態推移を表します。
上記のような流れで簡単なアニメーションであれば状態によって再生するアニメーションを指定できます。この一連のステート遷移の設定を "controller.animation.black_scorpion.move" としてまとめます。ここの名称「move」の部分は自由に付けられます。「controller.animation.エンティティ名」はエンティティの名称を使用しなければいけません。
ステート名も自由に付けられます。 "default" ではなく "start" でも "kaishi" でもかまいません。
今回は既存のもの ("controller.render.spider") を流用したので中身は空です。
Blockbench が作成してくれたものをそのまま配置します。ただ、暗闇で目と尻尾を光らせたかったので、その部分は加工 (アルファ値の指定、つまり光らせたい部分を半透明にする)しました。
Blockbench 単体でもテクスチャのアルファ値の指定 (変更) はできます。
キャラクタのテキストデータ (ゲーム内で表示される名称など) を言語ごとに配置します。今回はデフォルトの英語と、日本語ファイルを作りました。
拡張子が .lang になっているだけで単なるテキストファイルです。
en_US.lang
entity.utano:black_scorpion.name=Black Scorpion
item.spawn_egg.entity.utano:black_scorpion.name=Spawn Black Scorpion
ja_JP.lang
entity.utano:black_scorpion.name=黒サソリ
item.spawn_egg.entity.utano:black_scorpion.name=黒サソリの卵
音関係の設定。スパイダーのものをそのまま流用。
sounds.json
{
"entity_sounds": {
"entities": {
"utano:black_scorpion": {
"events": {
"ambient": "mob.spider.say",
"death": "mob.spider.death",
"hurt": "mob.spider.say",
"step": {
"pitch": [0.9, 1.1],
"sound": "mob.spider.step",
"volume": 0.35
}
},
"pitch": [0.8, 1.2],
"volume": 1
}
}
}
}
リソースパックは以上です。
ただリソースパックだけではゲーム内で呼び出すことはできません。呼び出しに対応する設定のスクリプトが無いためです。
オリジナルのビヘイビアパックのルートディレクトリを「development_behavior_packs」の配下に作成します。
今回は「utano_mobs_pack_behavior」と言う名前にしました。リソースパックに合わせた名前です。
パック (ルートディレクトリ) の中身は以下のような感じになります。
utano_mobs_pack_behavior (ルートディレクトリ)
┣ entities (キャラクタやブロックの設定)
┃ black_scorpion.behavior.json
┣ loot_tables (ドロップ品や装備品の設定)
┃┗ entities
┃ black_scorpion.json
┃ empty.json (からっぽの状態の設定)
┗ spawn_rules (スポーン、つまり湧き設定)
black_scorpion.json
manifest.json (ビヘイビアパックの設定)
pack_icon.png (ビヘイビアパックのアイコン)
各ファイルはキャラ名 (ID) になります。
ビヘイビアパックの本体です。これが無いとクライアントが認識してくれません。
manifest.json
{
"format_version": 2,
"header": {
"name": "utano mobs pack",
"description": "utano mobs Behavior Pack",
"uuid": "取得したUUID",
"version": [1, 0, 32],
"min_engine_version": [1, 16, 0]
},
"metadata": {
"authors": ["UtanoSchell"],
"generated_with": {
"blockbench_entity_wizard": ["1.6.0"]
}
},
"modules": [
{
"description": "Behavior",
"version": [1, 0, 0],
"uuid": "取得した別のUUID",
"type": "data"
}
],
"dependencies": [
{
"uuid": "リソースパックのUUID",
"version": [1, 0, 49]
}
]
}
Blockbench を使って自動生成されたものをそのまま使用してます。
"modules" のUUID は "header" とは別のものを指定してください。
"dependencies" のUUID と "version" はリソースパックのものを指定します。
pack_icon.png はリソースパックと同じものでOKです。
キャラクタの設定をここに配置します。ファイル名は キャラ名.behavior.json 。
かなり長いので途中を省略してあります。
black_scorpion.behavior.json
{
"format_version": "1.16.0",
"minecraft:entity": {
"description": {
"identifier": "utano:black_scorpion",
"spawn_category": "monster",
"is_spawnable": true,
"is_summonable": true
},
"component_groups": {
~~~省略~~~
},
"components": {
~~~省略~~~
},
"events": {
~~~省略~~~
}
}
}
コンポーネントの中身ですが
conponents
~~~省略~~~
"minecraft:loot": {
"table": "loot_tables/entities/black_scorpion.json"
},
"minecraft:health": {
"value": 90,
"max": 90
},
"minecraft:movement": {
"value": 0.25
},
~~~省略~~~
上記のようにすでに用意されている (ネームスペース maincraft: はシステムで予約されているものです) コンポーネントを列挙して、中身の値のみを指定する感じです。health であればモブの体力であったり、movement であれば 移動速度、loot はドロップ品で、後述するリストにドロップ内容を列挙したものを指定します。
イベントの中身は
events
~~~省略~~~
"minecraft:melee_mode": {
"remove": { "component_groups": [ "minecraft:ranged_attack" ] },
"add": { "component_groups": [ "minecraft:melee_attack" ] }
},
"minecraft:ranged_mode": {
"remove": { "component_groups": [ "minecraft:melee_attack" ] },
"add": { "component_groups": [ "minecraft:ranged_attack" ] }
}
~~~省略~~~
アニメーションコントロールの状態遷移と似た内容で、何らかの条件でイベントを指定し、指定されたイベント内で、コンポーネントグループを操作することで、キャラクタの挙動を変更します。
例えば "minecraft:melee_mode" イベントが呼ばれた場合、コンポーネントグループ"minecraft:ranged_attack"を無効にして、コンポーネントグループ"minecraft:melee_attack" を有効にすることで、近接攻撃の挙動をおこなわせる、と言った感じです。
たぶん一番手間のかかるコンポーネントグループの中身ですが
component_groups
~~~省略~~~
"minecraft:melee_attack": {
"minecraft:behavior.melee_box_attack": {
"priority": 4,
"track_target": true,
"speed_multiplier": 1.1
},
"minecraft:attack": {
"damage": [10, 20],
"effect_name": "slowness",
"effect_duration": 10
},
"minecraft:target_nearby_sensor": {
"inside_range": 4.0,
"outside_range": 6.0,
"must_see": true,
"on_inside_range": {
},
"on_outside_range": {
"event": "minecraft:ranged_mode",
"target": "self"
},
"on_vision_lost_inside_range": {
"event": "minecraft:ranged_mode",
"target": "self"
}
}
}
~~~省略~~~
見ての通り、コンポーネントの組み合わせで動作を指定するというものです。
コンポーネントのリストはここにあります。
コンポーネントの動作 (センサーの動作) によって先ほどの event を呼び出しています。
ドロップ品の設定を配置します。
entities/black_scorpion.json
~~~省略~~~
{
"rolls": 1,
"entries": [
{
"type": "item",
"name": "minecraft:shears",
"weight": 4,
"functions": [
{
"function": "set_count",
"count": {
"min": 0,
"max": 1
}
},
{
"function": "looting_enchant",
"count": {
"min": 0,
"max": 1
}
}
]
}
],
"conditions": [
{
"condition": "killed_by_player"
}
]
}
]
}
スポーン (湧き) 設定を配置します。
こちらも内容は公式資料の中から必要なものを繋げていくだけです。
詳細なルールはこちら。
spawn_rules/black_scorpion.json
{
"format_version": "1.8.0",
"minecraft:spawn_rules": {
"description": {
"identifier": "utano:black_scorpion",
"population_control": "monster"
},
"conditions": [
{
"minecraft:spawns_on_surface": {},
"minecraft:spawns_underground": {},
"minecraft:brightness_filter": {
"min": 0,
"max": 7,
"adjust_for_weather": true
},
"minecraft:difficulty_filter": {
"min": "easy",
"max": "hard"
},
"minecraft:weight": {
"default": 10
},
"minecraft:biome_filter": {
"test": "has_biome_tag", "operator":"==", "value": "monster"
}
}
]
}
}
リソースパックおよびビヘイビアパックが出来たら、クライアントから両パックを有効にしてワールドにログインして確認します。
ビヘイビアパックでリソースパックを指定している場合は、ビヘイビアパックを有効にすれば自動的にリソースパックも有効になります。
ワールド内で「/summon 追加キャラクタのID」を使ってキャラクタを召喚します。
ビヘイビアパックのディレクトリ配下 entities ディレクトリの キャラクタ設定で、"minecraft:entity.description.is_summonable" 項目が true になっていないと /summon による召喚はできません。
表示されない、上手く動かない、と言った場合は各ファイルを見直して原因を取り除く必要があります。
大抵はスペルミスや記述ミスが原因ですが、どうしてもうまくいかない場合は、一度スケルトン状態 (最低限の設定のみ) にして召喚できるかどうか試してみるのがおすすめです。
そして重要なことは、ファイルを変更したら各パックのバージョン情報を更新 (バージョンナンバーを増やす) すること。そうしないと変更が反映されません。
かなり大雑把な内容だけど、まあいっか( ゚Д゚)
気が向いたら各項目で手間取った部分などを記事にするかも。しないかも。