AIゲーム開発研究室
AIに「どんぐり工場」を作らせる
AIゲーム開発研究室
ゲーム開発ドキュメント
Unity AI Agentによるゲームシステム実装
AIに「どんぐり工場」を作らせる
前回の実験では、Unity AI Agentによってパンタのアニメーションとプレイヤー操作を実装した。
パンタは待機時には正面を向いて小さく動き、右へ移動すると右向きのアクションへ切り替わる。
左へ移動するときには右向きアニメーションを反転して使用し、キーを離すと再び正面の待機状態へ戻る。
さらに、
左右矢印キー
A・Dキー
の両方で操作でき、画面外へ出ないようにする制御も実装された。
これによって、パンタはゲーム画面に置かれた一枚の画像から、
プレイヤーが操作できるゲームキャラクター
になった。
次はいよいよ、ゲームそのものを動かしてみる。
「森のどんぐり大作戦」は、空から落ちてくるどんぐりを、キャラクターが籠で受け止めるゲームである。
まず必要なのは、
どんぐりを空から落とすこと
である。
最初のどんぐりを落とす
いきなり大量のどんぐりを出現させるのではなく、最初は1個だけ落としてみることにした。
使用するのは、すでに制作してUnityへ読み込んである、
Acorn_01.png
である。
Unity AI Agentへ、
画面上部にどんぐりを1個出現させ、2D物理を使用して自然に落下させる
よう指示した。
さらに、
落下しながら回転すること
画面下へ完全に出たら削除すること
も要求した。
ただし、この段階では、
キャッチ判定も、
得点も、
連続出現も、
まだ実装しない。
まず、
「どんぐりが1個落ちる」
という最小単位だけを作る。
どんぐりが落ちた
Unity AI Agentによる実装が完了した。
Playする。
画面上部から、
どんぐりが1個落ちてきた。
しかも、回転しながら落下している。
そして画面下へ出ると、自動的に削除された。
ここまで正常に動作した。
さらに、どんぐりの表示サイズについても、こちらから具体的な数値は指定していなかった。
指示したのは、
パンタとゲーム画面に対して適切な大きさにすること
だけである。
実際に表示されたどんぐりを見ると、特に修正する必要のない大きさになっていた。
人間が動きを判断する
一方、実際に落下するどんぐりを見ると、少し気になるところがあった。
ゲーム画面は上下に前景の枝葉と草が配置されているため、実際にどんぐりを追いかけられる空間はそれほど広くない。
そのため、最初の落下速度では少し速く感じられた。
また、どんぐりの回転については、もう少しはっきり回転してもよいように感じた。
そこでUnity AI Agentへ、
どんぐりの大きさは変更しない
落下速度だけ少し遅くする
回転は少し強くする
よう指示した。
ここでも具体的な数値は指定していない。
AIが数値を変更し、人間が実際の画面を見て判断する。
再びPlayする。
今度は、落下速度も回転も自然に感じられた。
この状態を採用することにした。
「どんぐり工場」を作る
1個のどんぐりが正常に落下することが確認できた。
次は、これを連続して出現させる。
ただし、同じ場所から落ち続けるのではゲームにならない。
そこでUnity AI Agentへ、
画面上部のランダムなX位置から、一定間隔でどんぐりを1個ずつ生成し続ける
よう指示した。
すでに完成している、
どんぐりの大きさ
落下速度
回転
画面外での削除
については変更しないようにした。
AIは、どんぐりを生成するための仕組みを構築した。
Playする。
今度は、
次々とどんぐりが降ってきた。
しかも毎回同じ位置ではなく、画面上部の異なる位置から出現する。
ここで、どんぐりを継続的にゲーム画面へ供給する基本システムが完成した。
制作中、これを私たちは、
「どんぐり工場」
と呼ぶことにした。
実際にパンタを動かしてみる
まだキャッチ判定は実装していない。
そのため、パンタをどんぐりの下へ移動させても、どんぐりはそのまま通過して画面下へ落ちていく。
それでも、パンタを左右へ操作しながら、ランダムに落ちてくるどんぐりを追いかけてみた。
すると、一つの問題が見えてきた。
思ったより難しい。
画面の上下には枝葉と下草があり、実際にプレイヤーが認識して移動できる空間は広くない。
そこで、
パンタをもう少し小さくするか。
どんぐりの落下速度をさらに遅くするか。
ゲーム画面そのものを考え直すか。
いくつかの可能性を検討した。
しかし、ここで別の考え方が出てきた。
そもそも全部取る必要があるのか
「森のどんぐり大作戦」は、
落ちてくるすべてのどんぐりを取らなければならないゲームではない。
取れないどんぐりがあってもよい。
プレイヤーは、
これは取れる。
あれは間に合わない。
次のどんぐりを狙おう。
と判断しながらキャラクターを動かす。
そう考えると、すべてのどんぐりを簡単に取れるようにする必要はない。
むしろ、全部取れてしまう方がゲームとして単調になる可能性がある。
キャラクターによってゲームが変わる
さらに、これから実装する5人のキャラクターには、それぞれ違った特徴を持たせる予定である。
移動速度についても、
高速
標準
低速
の3段階を基本とすることにしている。
現時点では、
リン=高速
パンタ=標準
ポン=低速
を想定している。
すると、同じ速度で落ちてくる同じどんぐりでも、キャラクターによって遊び方が変わる可能性がある。
リンなら、素早く走って画面の端に落ちてくるどんぐりまで追いかけられるかもしれない。
パンタなら、取れるどんぐりを判断しながら普通に追いかける。
ポンは移動が遅いため、どんぐりを追いかけるより、
「ここへ落ちてくるだろう」
と予測して待ち伏せする遊び方になるかもしれない。
そしてコンタには、移動すると少し滑るという特徴を持たせる予定である。
どんぐりを見つけて走り出したものの、
止まりたい場所で止まれない。
結果、
全然取れない。
ということも起こるかもしれない。
しかし、それも失敗ではなく、
コンタというキャラクターで遊ぶ面白さ
になる可能性がある。
難易度を今は決めない
そこで今回は、現時点で難易度調整を行わないことにした。
どんぐりの落下速度も、
パンタの大きさも、
出現間隔も、
ゲーム画面の構成も、
ひとまず現在の状態を維持する。
5人のキャラクターが実装された段階で、実際にそれぞれを操作してからゲーム全体のバランスを判断する。
これは、単純にゲームを「簡単にする」「難しくする」という調整ではない。
キャラクターの個性によって、同じゲームの遊び方そのものが変わる。
その可能性を残しておくためである。
AIがゲームシステムを作り始めた
今回、人間はどんぐりの落下スクリプトを書いていない。
2D物理コンポーネントも設定していない。
画面外へ出たどんぐりを削除する処理も書いていない。
ランダムな位置から継続的にどんぐりを生成するシステムも、人間が実装したものではない。
人間が行ったのは、
どんぐりを落としたい。
もう少しゆっくり落としたい。
もう少し回転させたい。
今度はランダムな場所から連続して落としたい。
という目的と判断を伝えることだった。
Unity AI Agentは、それをUnity上の具体的なシステムへ変換した。
前回までAIが作っていたのは、主としてキャラクターの動きだった。
今回は、
ゲーム世界そのものを動かすシステム
をAIが作り始めたことになる。
人間は、ますます観客になっていく
パンタが動き、
どんぐりが降ってくる。
画面を見ながらパンタを左右へ動かしていると、ゲームの形が急速に見え始めた。
そして今回も、人間がUnity上で直接行う作業は非常に少なかった。
AIへ指示を渡す。
必要に応じて操作を許可する。
Playする。
見る。
遊ぶ。
そして、
「これはいい」
「これは少し速い」
「このままで行ってみよう」
と判断する。
実装の主体がAIへ移るほど、人間はますます、
ゲームを作っている人というより、ゲームが作られていくところを見ている観客
のようになっていく。
もちろん、その観客は作品の方向を決める。
しかし、目の前でAIが次々とUnityを実装していく様子を見ると、
「人間はもう観客なのではないか」
と思えてくる。
そして、それが意外なほど楽しい。
今回の到達点
今回の実験によって、
どんぐり1個の生成
2D物理による落下
落下中の回転
画面外へ出たどんぐりの自動削除
落下速度と回転の調整
ランダムなX位置からの出現
一定間隔での連続生成
まで実装された。
パンタはすでにプレイヤーの操作によって左右へ動く。
その頭上から、今度はどんぐりが次々と降ってくる。
まだ、どんぐりを取ることはできない。
パンタの前を通過して、そのまま地面の下へ消えていく。
しかし、
キャラクターが動き、ゲーム世界からオブジェクトが生成される。
ここまで来たことで、「森のどんぐり大作戦」は静的なゲーム画面から、明確にゲームシステムを持つ世界へ変わり始めた。
次はいよいよ、
パンタの籠で、どんぐりを受け止める。
どんぐりが籠に入った瞬間に消える。
その瞬間、
落ちてくる
↓
追いかける
↓
キャッチする
という「森のどんぐり大作戦」の最初のゲームループが完成する。
どんぐり工場は、無事に稼働を開始した。 🌰
