カテゴリー: Minecraftプラグイン

AIチームでマイクラサーバーを作る#4ChatGPTが描いてClaudeが検品するリソースパック・パイプライン! 🎨

この記事は韓国語の原文から翻訳したものです。

ひと目でわかる要点

絵はChatGPT、規格と検品はClaudeと役割を分けました。プロンプトにピクセル座標まで書いてPythonでグリッドから描かせる方法、1.21.11で弓の引き絞り3段階を付けるitem定義JSON、そして検品がなければそのままゲームに入っていた事故5つを紹介します。

  • Minecraft Java 1.21.11 リソースパック(pack_format 75) · 2026-09-30 実際に統合・ゲーム内で確認
  • アイテムの絵は textures/item/ の下に置きます — textures/gui/ に置くと紫と黒のチェック柄が出ます
  • フォントグリフで描くGUI背景はウィンドウサイズそのまま(等倍)だけ — 2倍(352px)はゲームで描画されませんでした
  • 弓の引き絞りは1.21.4から overrides ではなく items/ 定義の condition + range_dispatch で作ります
目次8項目

こんにちは!Mojangcamです 😎

前回の#3では数値のバランスを扱いました。今回は絵の話です。このサーバーにはカスタムGUI(ヘルパー「オルベル」のメニュー、クエスト日誌)、数十個のアイコン、クラス武器の絵が入ります。これを全部自分で描くことはできないので、役割を分けました。

誰が やること
ChatGPT 絵を描く + ファイルをまとめてzipで渡す
Claude(チームリーダー) プロンプトを書く、zipの検品、リソースパックへの統合、バージョンを上げる
自分 プロンプトをコピーしてChatGPTに貼る、zipをClaudeに渡す、ゲームで確認

今回はこのパイプラインと、検品で見つけた事故5つをまとめます。

羊皮紙と金箔スタイルのオルベルメニューGUIのプレビュー。丸い窓の中のオルベルの肖像、灯籠のアイコン、ステータス・スキル・クエストのボタン


📌 ステップ1 - プロンプト:「上手に描いて」ではなく座標を書く

マイクラのGUIはスロットの位置が1ピクセルずれるだけでも目立ちます。そこでプロンプトには雰囲気ではなく規格を書きました。

  • ウィンドウサイズの式:幅176、高さ 114 + 18 × 行数、スロットは (7 + 18c, 17 + 18r) から18×18
  • ボタンごとのスロット番号と矩形座標 (x, y, w, h) の表
  • 「Python(PIL)でまずグリッドを正確に描き、その上に質感と装飾だけを重ねること」
  • ウィンドウの内側は完全に不透明(バニラの灰色ウィンドウが透けないように)
  • 画像に文字を入れない — ボタン名はゲーム内のツールチップで
  • マントに見えるものは禁止、実在のゲーム・ブランドのスタイルの模倣も禁止
  • 成果物はzip1つ:リソースパックの断片 + プレビュー + validation.json + 韓国語のREADME

画像生成AIがグリッドを「適当に」描いたら終わりです。グリッドはコードで、絵はAIでと分けさせたのが一番効果的でした。

クエスト詳細ウィンドウのプレビュー。左に大きなクエスト文、右に目標3行と進行度の玉、下に報酬スロットと受注・追跡・放棄ボタン


📌 ステップ2 - 検品:zipを受け取ったらClaudeがやること

  1. プレビュー画像を自分で開いて見る(AIが書いたvalidation.jsonだけを信じない)
  2. 画像サイズ・透明度・スロット位置を測る
  3. すべてのモデルJSONが指しているテクスチャファイルが実際にあるか確認
  4. 既存のリソースパックと重なるファイルはバックアップしてから上書き
  5. リソースパックのバージョンを上げてzipにまとめ、Discordのリソースパックチャンネルに投稿

この過程で見つかった事故が5つありました。


📌 事故1 - テクスチャのパス:紫と黒のチェック柄の一歩手前

最初のプロンプトでは、アイコンのパスを textures/gui/quest/<id>.png と書いていました。するとChatGPTが「このパスだとアイテムモデルが読み込めない」と聞き返してくれたんです。

マインクラフトはアイテムモデルに使う絵をブロック・アイテムのアトラスにまとめますが、デフォルトでは textures/block/、textures/item/ フォルダしか入れません。textures/gui/ に置くとアトラスに入らず、紫と黒のチェック柄が表示されます。

JSON
{
  "parent": "minecraft:item/generated",
  "textures": { "layer0": "myserver:item/gui/quest/crest_main" }
}

→ 絵は assets/myserver/textures/item/gui/quest/crest_main.png に置きます。(アトラスの設定を変える方法もありますが、minecraft 名前空間に手を入れることになるので避けました。)


📌 事故2 - 2本の弓の名前が入れ替わっていた

弓の引き絞りの絵を6枚(弓2種 × 3段階)受け取りました。プレビューだけ見ると問題なさそうでした。ところが元の絵とピクセル単位で比較してみると、おかしな点がありました。

  • t0(冒険者の弓)という名前で届いた絵が全部 t1(誓約の弓)で、逆も同じ
  • 持ち手の位置が元の絵より最大9ピクセルずれている → 引いた瞬間に弓が手から跳ねたように見える
  • 弓のまわりにホコリのような点が散らばっている

ChatGPTが送ってきた引き絞りの絵。1行目は誓約の弓の原画の横に冒険者の弓の引き絞りの絵が並ぶなど、互いに入れ替わった状態

そこでClaudeが自分で直しました。

  1. 元の絵と比較して名前を正す
  2. 持ち手の青緑色の巻き部分の中心を見つけて元の位置に揃える
  3. 数ピクセルしかない離れた塊は消す

修正後。各行の原画の横に、同じ弓の引き絞り3段階が持ち手の位置を揃えて並んでいる

1.21.4からは、弓の引き絞りを古い overrides ではなくアイテム定義ファイルで作ります。1.21.11で実際に使ったファイルです。

JSON
{
  "model": {
    "type": "minecraft:condition",
    "property": "minecraft:using_item",
    "on_false": { "type": "minecraft:model", "model": "myserver:item/t0_sylvanor_bow_a" },
    "on_true": {
      "type": "minecraft:range_dispatch",
      "property": "minecraft:use_duration",
      "scale": 0.05,
      "fallback": { "type": "minecraft:model", "model": "myserver:item/t0_sylvanor_bow_a_pulling_0" },
      "entries": [
        { "threshold": 0.65, "model": { "type": "minecraft:model", "model": "myserver:item/t0_sylvanor_bow_a_pulling_1" } },
        { "threshold": 0.9,  "model": { "type": "minecraft:model", "model": "myserver:item/t0_sylvanor_bow_a_pulling_2" } }
      ]
    }
  }
}

1つずつ分解してみます 💡

  • assets/myserver/items/<id>.json:このファイルの場所が1.21.4以降の「アイテム定義」です。サーバーはアイテムに item_model = myserver:<id> を付けるだけです。
  • using_item:弓を引いている最中かどうか
  • use_duration + scale: 0.05:引いた時間(tick)× 0.05 → 20tick(1秒)で1.0。バニラの弓と同じ値です。

📌 事故3 - GUIの背景が表示されない

オルベルメニューとクエストウィンドウの背景を入れたのに、ゲームで開いてみると背景のないバニラの灰色ウィンドウが表示され、タイトルはウィンドウの外の左側に押し出されていました。

背景がなく灰色のスロットだけが見えるヘルパーメニュー。アイコンは正しい位置にあるが、タイトルの文字がウィンドウの外の左側に浮いている

カスタムGUIの背景は、ウィンドウのタイトルに大きな文字(フォントグリフ)を1つ描く方式です。くっきり見せようと背景を2倍サイズ(352×444)で入れたのですが、このサイズのグリフはゲームで描画されませんでした。フォントグリフが入るアトラスのサイズ上限(256ピクセルと推定)が原因のようです。背景がないので、タイトルを左に寄せる負の間隔だけが適用され、タイトルが押し出されたわけです。

→ ChatGPTが別に用意してくれていた等倍(176×222)の背景に替えたら、すぐに解決しました。今後フォントの背景は等倍でだけ受け取ると、ルールに書き加えました。


📌 事故4 - ノイズが走る弓

弓の引き絞りを入れたあと、弓の側面に階段状のノイズが出るようになりました。

一人称視点で持った弓。弓本体の側面に横縞の模様が細かく見え、ノイズが走っているように見える

マインクラフトは手に持った2Dアイテムを、ピクセルごとに厚みを付けて立体にします。16ピクセルの絵なら問題ないのですが、うちの弓は128ピクセルなので、細い線とピクセルの側面が数百個でき、それが縞模様になっていました。

  1. まず厚み0の板1枚に変えたら → 縞模様は消えたものの、薄すぎて不自然
  2. そこで弓本体だけを64マスのグリッドでまとめて薄い厚みを付け、弦・矢は板のままにするモデルをスクリプトで作りました(モデル1つに70〜100個ほどの直方体)

改善したモデルのプレビュー。弓本体にだけ薄い厚みがあり、模様は元の絵のまま見える


📌 事故5 - 16ピクセルに縮んだ「3Dの弓」

本物の3Dの弓もChatGPTに任せてみました。届いたモデルは、128ピクセルの絵を16×16に縮めて、1マス1色の直方体で組み立てたものでした。模様・巻き・羽根飾りが全部消え、本体が途切れて点が浮いていました。しかも引き絞りは1.21.4でなくなった overrides 方式だったので、1.21.11では動きませんでした。

上:受け取った3Dモデル(16×16ボクセル)の8つの状態 / 下:今使っているモデル

→ 適用せずに保管しました。3Dはあとで、Blockbenchで本体を区間ごとの曲線として直接作る方式で改めて依頼する予定です。


📌 まとめ

  • グリッドはコードで、絵はAIで — プロンプトには雰囲気ではなく座標を
  • 検品はプレビューを自分の目で見て、元の絵とのピクセル比較まで
  • 1.21.11で覚えておくこと:アイテムの絵は textures/item/、フォント背景は等倍、弓の引き絞りはitems/ 定義ファイル
  • AIが作ったものでも、差し戻すべきものは差し戻す

次回はシリーズ最終回、Discord運営の話です。決定フォーラムのタグとチェックマークのルール、コマンド一覧フォーラム、リソースパックチャンネルのように、ボットが自動で管理するチャンネルを扱います。お楽しみに 🙌

この記事は、私が方向性を決めてClaudeと一緒にまとめました。このサーバーは個人プロジェクトであり、マインクラフトの公式コンテンツではなく、Mojang・Microsoftとは関係ありません。

連載 · 全5回中4回目

AIチームでマイクラサーバーを作る

  1. #1AIリーダー1人 + メンバー15人でMMORPGプラグインを作る仕組み! 🤖
  2. #21つのプラグインにモジュール13個!コア構造と「1000029ダメージ」事件 🧩
  3. #3数値×10、12時間の経験値曲線、クラス6種のシミュレーション! 📊
  4. #4ChatGPTが描いてClaudeが検品するリソースパック・パイプライン! 🎨現在の記事
  5. #5Discordボットで開発チームを運営!決定フォーラム・コマンド一覧・リソースパックチャンネル 🤝

著者

Mojangcam

自分でコードを書き、サーバーを動かし、詰まったエラーを解決しながら学んだことを記録する開発・IT実践ブログ