AIゲーム開発研究室
基本ゲームループ完成 ― Unity AI Agent、残り25クレジットでゲームを閉じる
AIゲーム開発研究室
「森のどんぐり大作戦」開発ドキュメント
基本ゲームループ完成 ― Unity AI Agent、残り25クレジットでゲームを閉じる
前回までの実装によって、
パンタ開始 → どんぐりをキャッチ → 大喜び → 退場 → ポン登場 → どんぐりをキャッチ → 大喜び
までが完成しました。
ゲームとして残されていたのは、その先です。
ポンが大喜びしたあと、どうなるのか。
ここまでどれだけ正常に動作しても、最後がなければゲームは終わりません。
そこで今回は、
「ポン大喜び → 退場 → ゲーム終了」
を実装し、「森のどんぐり大作戦」の基本ゲーム構造を最後までつなげることにしました。
ただし、一つ問題があります。
Unity AI Agentの残りクレジットは、
114 / 1,000
です。
かなり心細い数字になってきました。
今回は余計な実験をせず、既存システムをできるだけ利用して、ゲームを最後まで完成させることを優先します。
1.今回の目的
今回実装するゲーム終了までの流れは単純です。
ポンがどんぐりを3個キャッチする。
↓
ポンが大喜びする。
↓
しばらく大喜びを続ける。
↓
大喜びアニメーションを続けたまま、真下へ下降する。
↓
ポンが完全に画面外へ退場する。
↓
どんぐりの新規生成を停止する。
↓
「ゲームクリア!」
を表示する。
今回はゲーム終了後のメニュー画面、リスタート、結果画面などは作りません。
目的は、
ゲーム開始からゲーム終了までの基本構造を成立させること
です。
2.新しい仕組みを作らせない
Unity AI Agentへの指示では、今回も実装範囲を明確にしました。
特に重要視したのが、
既存のパンタ退場処理を調査し、その設計を参考にする
ことです。
パンタではすでに、
大喜び → 一定時間待機 → 大喜びしながら下降 → 完全に画面外へ退場
という処理が正常に動いています。
したがって、ポンのために別の複雑なシステムを新しく作る必要はありません。
また、前回修正したポンのアニメーション素材についても、
共通キャンバス
共通Sprite Rect
共通Pivot
を変更しないよう明示しました。
ポンの大喜びには、人間が生成画像を選別し、同一サイズの透明キャンバス内でキャラクター位置を調整することによって制作した上下動が、すでに含まれています。
したがって、Unity側で新たな上下ジャンプを加える必要はありません。
退場時に必要なのは、
GameObject全体をTransform Yで真下へ移動させること
だけです。
ここでも、
Sprite画像内で制作された動き
と、
Unityが担当するゲーム空間上の移動
を分離します。
3.ゲーム終了時の仕様
ポンが大喜びを開始すると、すでにBasketCatchAreaのColliderは無効になるよう実装されています。
そのため、退場中にどんぐりをキャッチすることはありません。
スコアは、
どんぐり:3 / 3
合計:6
の状態で止まります。
ポンが完全に画面外へ出たら、AcornSpawnerによる新しいどんぐりの生成を停止します。
その時点をゲーム終了としました。
そして既存のUIを利用して、画面中央付近へ、
「ゲームクリア!」
を表示します。
これだけです。
豪華なResult画面はありません。
しかし、今回必要なのは完成したゲーム画面ではなく、
ゲームというシステムが最後まで動作すること
です。
4.Unity AI Agentへ実装を依頼する
以上の条件をまとめ、Unity AI Agentへ実装を依頼しました。
今回の指示では、
- 既存実装を最初に確認する
- PantaMovementの退場処理を参考にする
- PonMovementへ必要最小限の処理を追加する
- ポンの既存アニメーションを変更しない
- Sprite Import設定を変更しない
- BasketCatchAreaの既存処理を維持する
- ポン退場後にAcornSpawnerを停止する
- 既存Canvasを利用して「ゲームクリア!」を表示する
- Scene遷移やリスタートなどは実装しない
- 不要なリファクタリングを行わない
ことを指定しました。
残りクレジットが少ないため、今回は特に、
必要のない仕事をAIにさせない
ことを重視しました。
5.突然のクレジット切れ
Unity AI Agentが作業を開始しました。
既存SceneやGameObject、Scriptを調査しながら、次々と処理を進めていきます。
そして画面には、
Completed actions (46)
と表示されました。
かなり多くの処理が行われています。
ところが、その直後です。
Unity Assistantの画面に赤い警告が表示されました。
Not enough credits remaining.
クレジットが足りません。
作業開始前には114あったクレジットが、実装途中でほぼ尽きてしまったのです。
しかもUnity AI Agentから、
「実装が完了しました」
という最終報告を受け取る前です。
これは困りました。
実装途中で止まったのであれば、ゲーム終了処理のどこまで完成しているのか分かりません。
しかし、画面を見るとUnity AI Agentは46個もの処理をすでに完了しています。
さらに作業内容には、
gameClearVisible
gameClearText
ponCurrentScore
totalScore
など、ゲーム終了状態を確認していたと思われる項目も見えます。
もしかすると、
実装そのものは終わっていて、最後の報告を行う前にクレジットが尽きただけなのではないか。
そこで追加の質問は行いませんでした。
残り少ないクレジットを使ってUnity AI Agentに状況確認をさせるのではなく、
人間がPlayして確認します。
6.Playボタンを押す
ゲームを最初から実行します。
パンタが登場します。
どんぐりを3個キャッチ。
どんぐり:3 / 3
パンタが大喜びします。
そのまま画面下へ退場。
同時にポンが画面下から登場します。
ポンが通常位置へ到着するとCurrent Scoreがリセットされます。
どんぐり:0 / 3
合計:3
ここまでは前回までに完成していた部分です。
続いてポンを操作します。
1個。
2個。
3個。
どんぐり:3 / 3
合計:6
ポンが大喜びを始めます。
そして――
そのまま大喜びしながら、画面下へ下降を始めました。
ポンは完全に画面外へ退場します。
新しいどんぐりも出現しなくなりました。
そして画面中央に、
ゲームクリア!
と表示されました。
全部できています。
7.Unity AI Agentは仕事を終えていた
結果として、
ポン大喜び
↓
下降開始
↓
完全退場
↓
どんぐり生成停止
↓
ゲームクリア表示
のすべてが正常に動作しました。
Unity AI Agentは、
「クレジット不足」
というエラーを表示して停止しました。
しかし、Unityプロジェクト側では要求した機能がすでに完成していました。
つまり今回、
AIとの対話上ではタスク完了報告まで到達していない
一方で、
実際のゲーム実装は完成している
という状態が発生しました。
ここにも一つ興味深い点があります。
AIの画面上に、
「完了しました」
と表示されたかどうかと、
実際の制作物が完成しているかどうか
は同じではありません。
最終的な判断対象は、AIの返答ではなく、
実際に動いているゲームそのもの
です。
8.残り25クレジット
実装後、Unity Cloudのクレジット管理画面を確認しました。
残っていたのは、
25 / 1,000クレジット
でした。
今回の実装開始時には114クレジットでした。
したがって今回使用したのは、
89クレジット
です。
Unity AI Agentは残りわずかなクレジットを使いながら、ゲーム終了までの処理を完成させてくれました。
最後の報告をする余力は残っていませんでしたが、ゲームそのものは完成していました。
そこでプロジェクトをしっかり保存し、
Unity AI Agentにはしばらく休暇を出すことにしました。
9.ゲームの基本構造が閉じた
今回の実装によって、「森のどんぐり大作戦」は次のようになりました。
ゲーム開始
↓
パンタ登場
↓
パンタを操作
↓
どんぐりを3個キャッチ
↓
パンタ大喜び
↓
パンタ退場
↓
ポン登場
↓
Current Scoreリセット
↓
ポンを操作
↓
どんぐりを3個キャッチ
↓
ポン大喜び
↓
ポン退場
↓
どんぐり生成停止
↓
ゲームクリア
これで、
開始から終了までゲームが一本につながりました。
もちろん、まだ完成版のゲームではありません。
キャラクターはパンタとポンしか実装されていません。
本来はコンタ、リン、ミミも登場します。
パンタのアクション素材も、今後5カット構成へ作り直す予定です。
UI、ゲームバランス、演出、Result画面なども、これから改良していくことになります。
しかし、それらは今後、
すでに成立したゲーム構造へ追加していく要素
になります。
これは大きな違いです。
10.人間とAIは何をしてゲームを作ったのか
ここまでの実制作を振り返ると、ゲームは一つのAIが自動的に作ったものではありません。
人間がゲームの方向を決めました。
ChatGPTとの対話によって仕様や実装方法を検討しました。
画像生成AIがキャラクターやアクション候補を生成しました。
人間が画像を選別し、必要に応じて同一キャンバス内で配置を調整し、ゲーム用アニメーション素材を制作しました。
Unity AI AgentがUnityプロジェクトを調査し、Script、Animator、Collider、UIなどを実装しました。
そして人間がPlayボタンを押しました。
動かなければ原因を探します。
違和感があれば、その理由を考えます。
AIへ調査を依頼します。
修正後、再びPlayします。
その繰り返しによって、ゲームが少しずつ成立していきました。
ここで起きていることは、
人間 → AI → 完成
という単純な工程ではありません。
設計 → 制作 → 実装 → 検証 → 発見 → 修正 → 再検証
という循環です。
そして、その各段階で人間と複数のAIが異なる役割を担っています。
11.「ゲームを作る」から「ゲームを育てる」へ
今回、最も重要なのは「ゲームクリア!」という文字が表示されたことではありません。
ゲームの基本構造が、
閉じた
ことです。
これまでは、常にゲームの先に未実装部分がありました。
パンタを動かせても、その先がない。
どんぐりをキャッチできても、交代できない。
交代できても、ポンが遊べない。
ポンが遊べても、ゲームが終わらない。
その一つ一つを実制作によって解決してきました。
そして今回、初めて最後まで到達しました。
ここから先は、
ゲームを成立させるための開発
から、
成立したゲームを育てていく開発
へ移ることができます。
キャラクターを増やす。
キャラクターごとの動きを作る。
難易度を調整する。
演出を加える。
UIを整える。
ゲーム世界を広げる。
さらに次のゲームへつなげる。
基本構造が存在することで、これらの作業はすべて同じ土台の上で行えるようになります。
今回の到達点
「森のどんぐり大作戦」の実制作を始めてから、画像生成AIによる素材制作、Unityへの配置、キャラクター移動、どんぐり落下、キャッチ判定、スコア、キャラクター交代、大喜び、退場など、一つずつ実装を積み重ねてきました。
そして今回、
ゲーム開始からゲーム終了までの基本ゲームループが完成しました。
Unity AI Agentの画面には、
Not enough credits remaining.
そしてUnity Cloudには、
残り25クレジット。
一方、UnityのGameビューには、
「ゲームクリア!」
と表示されています。
AIは最後の報告をする前に力尽きました。
しかし、ゲームは最後まで動いていました。
今回はここでUnityプロジェクトを保存します。
Unity AI Agentには休暇を取ってもらいます。
そして私たちは、ここまでの実制作によって何が分かったのかを整理し、再び研究へ戻ります。
論文からゲームを作るだけではありません。
ゲームを作ることで、論文もまた作られていきます。
「森のどんぐり大作戦」の基本構造は、これで完成です。
