Unity今日の記事は「ゲーム制作者が自由な記事を作るAdventCalendar2021」の12/07参加記事です。adventar.org先日開催されたデジゲー博2021に出展した「ギッタンバッタンバトル」のお話です。この記事にはUnity2020.3.24f1を使用しています。ローカルマルチプレイヤーゲームを作りたいCPU戦っているの?頭の悪いAIを作ろうローカルマルチプレイヤーゲームを作りたい僕はローカルマルチプレイヤーゲームを作りたい!オフラインで複数人のプレイヤーが協力・対戦するゲームを作ってみんなに遊んでもらいたいのですよ。過去にもいろんなマルチプレイヤーゲームを作ってきました。ドミノ倒しをアクションゲームにしたものとか羊飼いのゲームを作ったりとかやっぱりドミノ倒しのゲームを作ったりとか大体2,3ヶ月程度の期間でパパっと作ってデジゲー博で公開して皆に遊んでもらう形でやってきてます。今年もデジゲー博2021に出展してきました。今年はコロナ禍ということもあり、2人で対戦する戦略シミュレーションゲームを作りました。今回は知人のゲームデザイナーさんと協力して制作しました。楽しんでもらえるといいなぁ。2021年11月13日さて前置きが長くなりましたが、今回のお話は「ローカルマルチプレイヤーゲームを作ったけど、CPU操作っているの?」ということについてです。CPU戦っているの?先述の通り、今回作ったゲームは2人対戦用ゲームです。1人で遊ぶプレイヤーさん用にCPU戦が必要じゃないか!いやいや、待ってください。このゲームをzip化するから、みんな好きにダウンロードして遊んでくれ!という状況なら1人で遊ぶ人のことを考える必要がありますが、今回はデジゲー博で遊ぶことが前提にあります。デジゲー博でゲームを展示しているブースには必ず僕がいる。このゲームを遊ぶときには、僕が傍に必ずいるのです。そのため、このゲームをお客さんが遊びに来た時には僕を含めて2人以上のプレイヤー人数が確実に確保できるのです。プレイヤー人数が確保できるなら、CPU戦いらなくね?そう思っていた時期が僕にもありましたとも。ここで少しだけ今回制作したゲームであるギッタンバッタンバトルの説明を簡単にさせてください。お互いのプレイヤーには4体のキャラクターが与えられ、これらのキャラクターを操作して相手のキャラクターを全滅させるのを目指すゲームです。動かしたいキャラクターを選ぶそのキャラクターの行動を決めるこれを繰り返すこれらは全プレイヤーが同時に行われる細かいルールはまだいろいろあるのですが、端折って説明するとこんな感じです。戦略シミュレーションゲームだけあって、初見の人には覚えることが多いんですよ。ゲームを遊んでいる最中に、お客さんがゲームルールや操作方法に困っている場合は、もちろん僕がヘルプします。僕もプレイヤー人数の頭数に入っている場合は、自分もゲームをプレイしながらお客さんのヘルプをする必要があります。対戦ゲームですからね。お客さんの対戦相手は僕なわけですよ。今初めてルールを知ったお客さんと、ルールどころかゲーム内部のスクリプトの処理すら知っている、ファミ通の攻略本もビックリな情報量を持つ開発者の僕が戦うわけですよ。戦いになるわけがないじゃないですか。接待バトルをせざるを得ないわけですよお客さんも接待バトルなんて受けたくないでしょうしね。上記の理由から開発者の僕がプレイヤーになるわけにはいかんのですよ。CPU戦用のAIの作成は残ながら必要になるわけですね。僕はAIに対する知見もなければ開発時間もほとんどない。今回作るAIは気合の入ったものでなくていいんです。AIの対戦相手は初見プレイヤーですよ。初心者どころか初見なのです。こちらの手を先読みしてくる、歯ごたえのあるAIを作るわけじゃないんです。それなら短時間でも作れるはず。今回のゲーム用のAIに基本的に考えてもらうことは以下の通りです。残り体力が低い相手のキャラクターを狙ったり、危険な場所にいる自分のキャラクターを逃がすような、頭の良い行動はしてほしくない。いって、自ら相手の攻撃に当たりにいったり、無意味な行動をさせるような、接待プレイ以下の行動もしてほしくない。考えると、各キャラクターのステータス情報からAIがものを考える必要はあんまりなさそう。単純にキャラクター同士の距離感のみで考えてみましょう。ダイクストラ法を用いて各キャラクターの全グリッドへの移動コストを計算しましょう。相手の各キャラクターに対してどれぐらいの行動量で攻撃が可能になるのかが計算できます。遠いキャラクターを操作するようにお願いしています。これが今回のAIの考え方のポイントになります。近いキャラクターへ攻撃可能になる距離が、一番遠いキャラクターが操作対象になる。これは言い方を変えれば、こちらの全キャラクターが攻撃可能になるまでは、相手を攻撃しないという考えになります。この考え方により、しばらく攻撃はしてこないため、お客さんが操作の感覚を掴むまでの時間が作られるわけです。全キャラクターが攻めてくるので、遊んでいるキャラクターがいなくなります。するとお客さんも全キャラクターを満遍なく操作してくれるのです。このAIにはいろんなことをしてほしいという要望も出しています。このゲームのキャラクターは各自いろいろなスキルを持っているのですが、当然初見のお客さんはどのキャラクターにどんなスキルがあるかなんてわかりません。いって、各キャラクターについて詳しく説明していたら、ゲームを遊ぶ前に時間がかかりすぎてお客さんが遊ぶ前に帰ってしまいます。そのためAIにはいろんなキャラクターのいろんなスキルを使ってもらって、デモプレイのようにも振る舞ってほしいのです。AIのメインの思考は先述の攻撃可能距離ですが、サブの思考としてこれらのことを考えてもらいます。操作したキャラクターやスキルを履歴として覚えておいて、同じキャラクターを使いすぎない、同じスキルを使わないように操作してもらうようにしています。このゲームは攻撃力アップのスキルを使ってからの通常攻撃の連打が最も強力な戦術なのですが、それをしてこないため、いろんなスキルがあることをお客さんに見せると同時に、少しばかり非効率な攻撃方法を取るため弱体化もはかっています。最後に、ランダム性は排除しています。そのため、同じ状況ならばAIは必ず同じ行動を取ってきます。これによりデバッグが容易になり、少ない開発時間でもAIの検証がスムーズに行えます。行動が一定のパターン化もしてくれるので、初見プレイヤーさんでも攻撃が見切りやすいです。何度もプレイする場合は退屈になってしまいますが、基本お客さんは1回しかプレイしないので、これぐらいの思考のほうが適度な難易度になります。実際にこのAIをデジゲー博を展示した際に使用したのですが、初見プレイヤーさんがギリギリ負けるぐらいのいい塩梅の強さになったので良かったと思います。接待プレイより、頭のちょっと悪いAIとプレイしてもらったほうが盛り上がるかもしれません。