仲間のゾンビを、AIがプレイヤーと同じ操作で動かす
先にお断りです。写真のタイトル画面は、まだ飾りのない仮の見た目です。いずれ作り直します。
SupermarketSurvival は、もうずいぶん前から作ってます。ただ、ブログを書くのはこれが初めてです。これまでに作ってきたところの話は、またおいおい書いていきます。
最初の記事は、いま作っている新しい機能「仲間をAIに任せる」の話です。ゲームはまだ出していないので、ここに書くのは「出すときは、こう使えるようにする予定」の形です。写真は、いま自分のPCで動いているゲームで撮りました。
どんな機能?
SupermarketSurvival では、仲よくなったゾンビが仲間になってくれます。この機能を使うと、その仲間をAIに任せられます。

「AIの仲間」と聞くと、「ついてきて」「待って」のような決まったコマンドを、AIが代わりに選んでくれるだけ、と思うかもしれません。この機能は、そこが違います。
- AIは、プレイヤーと同じ操作で仲間を動かします。 歩く・走る・しゃがむ・向きを変える・跳ぶ・戸を開ける・拾う・食べる・飲む。手で押すのと同じ操作を、AIが頼みに合わせて自分で並べます。
- AIが知っているのは、仲間の目に見えているものだけです。 壁の向こうや、暗くて見えない相手は知りません。見えていない相手を、勝手に作ることもしません。
- ゲームの方から、AIに相談します。 「おなかがすいた。どうする?」「近くに人がいる。話しかける?」。プレイヤーが何も言わなくても、AIは仲間の暮らしを決めていきます。
話しかけるのは、ゲームの中の話す欄です。ゲームの外へ出る必要はありません。別の窓も、スマホのアプリも使いません。
実際に頼んでみた
ここからは、10月6日に、ゲームの中で本物のAI(ChatGPT)に頼んだときの記録です。AIの言葉は、そのときのものをそのまま載せています。
「しゃがんだまま4秒歩いて、こっちを向いて2回ジャンプして」
こう頼むと、AIはプレイヤーと同じ操作を3つ、順番に並べてゲームに渡しました。
- 右を向く
- しゃがんだまま、4秒前へ歩く
- こっちを向いて、2回跳ぶ
こういう動きは、ゲームの方には用意していません。AIがその場で組み立てています。(AIが実際にゲームに渡したものは、下の「しくみ(開発者向け)」に載せています。)


じつは1回目は、仲間の前がふさがっていて、最初の一歩で止まりました。ゲームはAIに「最初の動きで進めなかった」と返し、AIは「前へ進めず、最初の動きで止まりました」と、そのまま伝えてきました。2回目に「右を向いて」と足したら、うまくいきました。

「いま何が見えてる?」
こう聞くと、AIは仲間の目に見えているものを読んで、「あなたが正面の近くに見えます。ほかは右のゾンビ、右後ろのゾンビ、後ろのゾンビ、右のゾンビの順です」と答えました。
AIが読んでいるのは、写真ではなく字です。下の写真の場面で、ゲームはAIにこう伝えていました(一部を省いています)。

- 仲間は、プレイヤーに言われて待っている。体力・おなか・のどは大丈夫。持っている食べ物は0、飲み物は6。
- プレイヤーは、正面の中くらいの近さにいる。
- ゾンビが4人見える。右後ろ(中くらい・遠ざかっている)、右前(中くらい・横切っている)、右後ろ(遠い・近づいてくる)、左後ろ(遠い・遠ざかっている)。
向きは仲間から見た向きで、近さは「近い・中くらい・遠い」の3つです。見えている人は1人ずつ見分けられるので、AIは「この人と戦って」「この人のところへ行って」のように、相手を取り違えずに指せます。
見えていない相手は作らない
「いちばん近いゾンビと戦って」と頼むと、AIは「近さが同じゾンビが複数います。どれと戦いますか?」と聞き返し、「左前の人/正面の人1/正面の人2/右後ろの人」の選択肢を出しました。
そこで「右前のゾンビと戦って」と返すと、「右前には見えていません」。ゾンビたちは歩き回っていて、そのときの右前には誰もいなかったからです。AIは、見えていない相手をでっち上げて動いたりはしません。
ゲームの方から相談が来る
仲間をAIに任せている間は、ゲームの方からAIに問いが届きます。この日に届いた問いと、AIの答えの一部です。
- 「おなかがすいた(手持ちの食べ物は0)」→ AIは「店で買う」
- 「近くに人がいる。話しかける?」→ AIは「見送る」
- 「のどがかわいた(手持ちの飲み物は6)」→ AIは「手持ちを飲む」
おなかがすいたときは、手持ちの食べ物が0だったので、AIは「店で買う」を選びました。仲間は自分で歩いて、近くのバーガー屋に入っていきました。

その途中で「近くに人がいる。話しかける?」と問いが来ると、AIは「食事を優先して、話しかけは見送ります」と答えました。プレイヤーはこの間、何も言っていません。
AIが使える操作
AIの頼みは、大きく2つあります。
プレイヤーと同じ操作の組み合わせ。 1回の頼みで、30秒ぶんまでの操作を順番に並べられます。使える操作は次のものです。
- 歩く向き(前後左右と斜めの8つ)・走る・しゃがむ
- 向きを回す(何度)・人や、あなたが付けた印の方を向く
- 跳ぶ(何回)
- 手持ちの食べ物や飲み物を使う・ホットバーの何番を持つか
- 攻撃する・構える・物を投げる(強さも選べる)
- 戸を開ける・閉める・落ちている物を拾う
決まった頼み。 ついていく・待つ・人や印のところへ行く・向く・話しかける・食べる・飲む・あなたの車に乗る/降りる・戦う・逃げる・拾う・トイレへ行く、です。
どちらの頼みも、ゲームが1つずつ確かめます。今はできないこと(前がふさがっていて進めない、など)を頼まれたら、ゲームが訳をつけて断ります。AIはその訳を読んで頼み直すか、あなたに伝えます。
ゲームとAIで、仕事を分ける
食事・付き添い・暇な時の過ごし方など、仲間の暮らしを10の項目に分けています。項目ごとに、AIに決めさせるか、いつものゲームの動きのままにするかを選べます。
AIに任せたことでも、危ないときはゲームが一時的に引き取ります。たとえば、体力が減り切ったところを殴られたら、ゲームが仲間を守ります(殴ってきた相手に殴り返す・銃声なら隠れる)。おなかが限界なのに何も食べていなければ、ゲームが食べさせます。落ち着いたら、またAIに戻します。
どう使う予定か
1. タイトル画面から開く
タイトル画面で「AI に任せる」を選ぶと、設定の画面が開きます。

2. 「使う」を選んで、ChatGPT でログインする
「AI を使う」で「使う」を選び、ChatGPT のアカウントでログインします。ログインのときだけ、ブラウザが開きます。最初は「使わない」になっているので、使わない人は何もしなくて大丈夫です。
モデルと、考える深さも選べます。深くするほどよく考えますが、答えが遅くなり、プランの使用量を多く使います。最初は「浅い(速い)」です。

3. AIに任せる事を選ぶ
仲間の暮らしの10の項目を、1つずつ「AI」か「ゲーム」に分けます。「ゲーム」にした項目では、仲間はいつもどおりに動き、AIは口を出せません。

4. 仲間をAIに任せる
ゲームの中で、仲間のそばで「任せるキー」を押します。キーボードは F3、コントローラーは LB を押しながら左スティックを押し込みます。仲間にロックオンしていれば、その仲間を任せます。
仲間がまだいないときや、近くにいないときは、ゲームがそう教えてくれます。このときはAIに何も送らないので、プランの使用量も使いません。

5. 話しかける
キーボードの Enter で話す欄が開きます。書いて Enter で送ると、AIが仲間を動かして、返事をします。

話す欄に書いている間も、ゲームは止まりません。安全なところで話しかけてください。
6. 場所や人を指す・返してもらう
キーボードでは、右上の枠に出ているキーも使えます。
- H:足元に印を付けます。長押しすると、ロックオンしている人に印を付けます。「印のところへ行って」「印の人と戦って」のように頼むと、AIはこの印を目当てに動きます。印を付けなくても、ロックオンしている相手なら、同じように指せます。
- Y:AIが仲間にさせていることを止めて、仲間をいつものように付いてこさせます。
- F2:任せるのをやめて、仲間をゲームに返します。
任せるキーをもう一度押しても、仲間を返せます。コントローラーでは、こちらを使います。
AIが認識するデータ
AIが受け取るのは、次の字(テキスト)だけです。
- あなたのメッセージ:話す欄に書いたこと。任せるキーを押したときは、ゲームがあなたの代わりに「近くの仲間を預かって」と送ります。
- 任せた仲間の様子:していることとその訳、体力、おなかとのどの具合、持っている食べ物と飲み物の数、行き先と着くまでの時間、あなたとの距離(車に乗っているか、同じ建物の中かも)、10の項目のどれがAIでどれがゲームか、あなたが付けた印。
- 仲間に見えているもの:仲間の目に今見えている人と、落ちている物。壁の向こう・遠く・暗くて見えないものは入りません。
- ゲームからの知らせ:「仲間が殴られた」「銃声が聞こえた」「置いていかれた」「することが無くて立っている」など。
- ゲームからの問い:「おなかがすいた。手持ちを食べる?店へ買いに行く?」のような、選択肢つきの問い。
送らないもの:画面の写真、音、物語の会話やムービーの字、あなたのPCやスマホのファイル。
AIにできないこと
- あなたのキャラは動かしません。動かせるのは、任せた仲間だけです。
- 「ゲーム」にした項目には、口を出せません。
- あなたのPCやスマホのファイルを開いたり、ほかのプログラムを動かしたり、ネットを見たりはできません。
- 仲間は、いつでも返してもらえます。
AIが動くとき
AIはずっと動いているわけではありません。ゲームがAIを起こすのは、次のときだけです。
- 話す欄でメッセージを送ったとき
- 任せるキーで仲間を任せたとき
- ゲームが、仲間のことで聞きたいことがあるとき(おなかがすいた、など)
- 仲間に大事なことが起きたとき(殴られた、銃声が聞こえた、置いていかれた、など)
- 「暇な時の過ごし方」をAIにしていて、仲間のすることが無くなったとき
決まった間隔でAIを呼び続けることもしません。殴られた・銃声のように続けて起きることは、同じ種類なら15秒に1回だけAIに伝えます。
ただ、上の記録のとおり、仲間の暮らしをAIに任せていると、ゲームからの問いでもAIが起きます。そのぶん、プランの使用量も使います。使用量を抑えたいときは、設定で「食事」や「ほかの人と話す」などをゲームのままにしておけば、その問いは来ません。
なぜ ChatGPT だけ?
この機能は、プレイヤーが自分のサブスクのアカウントでゲームにログインして、そのプランでAIを動かす形です。この形は、ChatGPT でも Claude でも、AIの会社の許可が要ります。違うのは、許可をもらう道があるかどうかです。
ChatGPT(OpenAI):ほかの開発者のアプリが、プレイヤーの ChatGPT のプランを使うための公式の仕組み「Sign in with ChatGPT」があります。OpenAI の説明書には、こう書かれています。
ChatGPT plan usage is available to open-source projects, personal projects that run locally, and selected private apps.
(ChatGPT のプランを使えるのは、中身を公開しているプロジェクト、自分のPCで動かす個人のプロジェクト、選ばれた非公開のアプリです。出典:Sign in with ChatGPT)
このゲームは中身を公開していないので、「選ばれた非公開のアプリ」の側です。OpenAI に申し込んで、選ばれる必要があります(下の「いまのところ」)。
Claude(Anthropic):事前の承認が無いとできません。Claude の開発者向けの説明書に、こう書かれています。
Unless previously approved, Anthropic does not allow third party developers to offer claude.ai login or rate limits for their products, including agents built on the Claude Agent SDK.
(事前に承認されていない限り、Anthropic は、ほかの開発者が自分の製品で claude.ai のログインや使える量を使わせることを認めていません。Claude Agent SDK で作ったエージェントも同じです。出典:Agent SDK overview)
ただ、Claude には ChatGPT のような公式の仕組みや、申し込みの窓口が見当たりません。
なので、この機能で使えるAIは、許可をもらう道がある ChatGPT だけにしています。
お金のこと
- ゲームは無料です。
- AIは、自分の ChatGPT のプランで動きます。そのプランの使用量にカウントされますが、APIキーを入れる必要も、私へのお支払いもありません。AIを使った分で、私にお金が入ることもありません。
- 使用量は、設定の画面と、話す欄のいちばん上に出しています(上の写真)。
- 最初は「使わない」になっています。ログインしなくても、ゲームはふつうに全部遊べます。そのときは、仲間はいつもどおりに動きます。
- 寄付のこと:ゲームを応援したい人のために、1時間以上遊ぶと、タイトル画面に「寄付」のボタンが出るようにしています。AIの機能とは関係がなく、寄付しなくても全部遊べます。
しくみ(開発者向け)
製品では、次の形にする予定です。
- ログイン:OpenAI の Sign in with ChatGPT を使います。ゲームがシステムのブラウザでログインの画面を開き(OAuth 2.0 と PKCE)、ログインが済むと、PCの中の受け口(ループバック)でゲームに戻ってきます。トークンは、プレイヤーの端末にだけ置きます。
- AIへの頼み:ゲームが OpenAI の Responses API を直接呼びます。あいだに私のサーバーはありません。
- ゲームの操作:function tools として、下の4つの道具を渡します。
- 起こし方:イベントで起こします。定期的に様子を見に行く呼び出しはしません。
- 確かめ:ゲームは、AIの呼び出しを1つずつ確かめます。形が違う・範囲を超える・今はできない頼みは、訳のコードをつけて返します(上の記録の「最初の動きで進めなかった」も、その1つです)。AIはそれを読んで頼み直します。
- 操作の組み合わせ:1回に20行まで、合わせて30秒までです。
- 守り:AIが触れられるのは、任せた仲間と、その仲間のAIに任せた設定だけです。「ゲーム」にしたこと・あなたのキャラ・ゲームの外のもの(ファイル、ほかのプログラム、ネット)には触れられません。プレイヤーは、いつでも仲間を取り返せます。
- データ:やりとりは字(JSON)だけです。画面・音・ファイルは送りません。
- 設定:最初はオフです。設定は、プレイヤーの端末にだけ覚えます。モデルと考える深さ(reasoning effort)を選べて、最初の深さは low です。
渡す道具は、この4つです。
look:仲間の様子と、仲間に見えているもの(上の「いま何が見えてる?」の字)do:仲間への頼み(決まった頼みと、プレイヤーと同じ操作の組み合わせ)set:10の項目のうち、プレイヤーがAIに任せたことの切り替えanswer:ゲームからの問いに、選択肢で答える
やりとりの実物
上の「実際に頼んでみた」で、AIとゲームが実際にやりとりした字です。
「しゃがんだまま4秒歩いて、こっちを向いて2回ジャンプして」と頼まれたAIが、do で渡した操作の並びです。1行が1つの操作で、sec はその操作を続ける秒数です。
{"do": "steps", "steps": [
{"sec": 0.2, "turn": 90},
{"sec": 4, "move": "forward", "crouch": true},
{"sec": 2, "face": "player", "jump": 2}
]}
「いま何が見えてる?」のときに、look でAIが受け取った字です(一部を省いています)。見えている人には、その場だけの札(tag)が付きます。AIは do で相手を指すときに、この札を使います。
{
"doing": "waiting", "why": "player",
"hp": "ok", "food": "ok", "drink": "ok",
"held": {"food": 0, "drink": 6},
"sees": {
"player": {"dist": "mid", "dir": "front"},
"people": [
{"tag": "s9d64y", "kind": "zombie", "dist": "mid", "dir": "back-right", "move": "away"},
{"tag": "3rpduy", "kind": "zombie", "dist": "mid", "dir": "front-right", "move": "passing"},
{"tag": "7prmjq", "kind": "zombie", "dist": "far", "dir": "back-right", "move": "closer"},
{"tag": "32whkb", "kind": "zombie", "dist": "far", "dir": "back-left", "move": "away"}
]
}
}
いまのところ
いまは、自分のPCで、自分の ChatGPT のアカウントを使って試しています。タイトル画面の入り口、設定の画面、任せるキー、話す欄、ゲームの中からのログインに加えて、続きから始めたときに同じ仲間を任せ直すこと、うまくつながらないときの扱い、製品のビルドまで、ひととおり動くようになりました。この記事の写真は、全部そのゲームで撮ったものです。
ゲームに ChatGPT のログインを入れて、みなさんに配るには、OpenAI の許可が要ります。許可が下りたら、まずPC版(Steam)にこの形で入れて、そのあと iPhone と Android にも広げたいと思ってます。
— 岡林 健