徳島ゲーム開発ごっこ 技術ブログ

ゲームを作るために役に立ったり立たなかったりする技術を学んでいきます!

ローカル対戦ゲームを作ったけど、CPU戦用のAIも必要なことを強く感じたお話

今日の記事は「ゲーム制作者が自由な記事を作るAdventCalendar2021」の12/07参加記事です。
adventar.org

先日開催されたデジゲー博2021に出展した「ギッタンバッタンバトル」のお話です。
f:id:urahimono:20211207001307j:plain


この記事にはUnity2020.3.24f1を使用しています。
.Netのバージョン設定には.Net4.x を使用しています。

ローカルマルチプレイヤーゲームを作りたい

僕はローカルマルチプレイヤーゲームを作りたい!
オフラインで複数人のプレイヤーが協力・対戦するゲームを作ってみんなに遊んでもらいたいのですよ。
過去にもいろんなマルチプレイヤーゲームを作ってきました。

ドミノ倒しをアクションゲームにしたものとか
f:id:urahimono:20211207000634j:plain

羊飼いのゲームを作ったりとか
f:id:urahimono:20211207000645p:plain

やっぱりドミノ倒しのゲームを作ったりとか
f:id:urahimono:20211207000655j:plain

大体2,3ヶ月程度の期間でパパっと作って
デジゲー博で公開して皆に遊んでもらう形でやってきてます。

今年もデジゲー博2021に出展してきました。
ゲーム名は、ギッタンバッタンバトル
giornotokushima.fanbox.cc

いつもなら3,4人同時に遊べるものを作るのですが、
今年はコロナ禍ということもあり、2人で対戦する戦略シミュレーションゲームを作りました。
今回は知人のゲームデザイナーさんと協力して制作しました。

さて前置きが長くなりましたが、今回のお話は
「ローカルマルチプレイヤーゲームを作ったけど、CPU操作っているの?」
ということについてです。

CPU戦っているの?

先述の通り、今回作ったゲームは2人対戦用ゲームです。
1人では遊べません。
じゃあ、1人で遊ぶプレイヤーさん用にCPU戦が必要じゃないか!

いやいや、待ってください。
このゲームをzip化するから、みんな好きにダウンロードして遊んでくれ!
という状況なら1人で遊ぶ人のことを考える必要がありますが、今回はデジゲー博で遊ぶことが前提にあります。

そう、デジゲー博でゲームを展示しているブースには必ず僕がいる。
このゲームを遊ぶときには、僕が傍に必ずいるのです。
そのため、このゲームをお客さんが遊びに来た時には僕を含めて2人以上のプレイヤー人数が確実に確保できるのです。

プレイヤー人数が確保できるなら、CPU戦いらなくね?
そう思っていた時期が僕にもありましたとも。

ここで少しだけ今回制作したゲームであるギッタンバッタンバトルの説明を簡単にさせてください。

お互いのプレイヤーには4体のキャラクターが与えられ、
これらのキャラクターを操作して相手のキャラクターを全滅させるのを目指すゲームです。
f:id:urahimono:20211207000825j:plain

ゲームの流れとしては、

  • 動かしたいキャラクターを選ぶ
  • そのキャラクターの行動を決める
  • これを繰り返す
  • これらは全プレイヤーが同時に行われる
f:id:urahimono:20211207000834j:plainf:id:urahimono:20211207000846j:plainf:id:urahimono:20211207000925j:plain

細かいルールはまだいろいろあるのですが、端折って説明するとこんな感じです。
戦略シミュレーションゲームだけあって、初見の人には覚えることが多いんですよ。
ゲームを遊んでいる最中に、お客さんがゲームルールや操作方法に困っている場合は、もちろん僕がヘルプします。
ただ僕もプレイヤー人数の頭数に入っている場合は、自分もゲームをプレイしながらお客さんのヘルプをする必要があります。
これは大変です。

しかも対戦ゲームですからね。
お客さんの対戦相手は僕なわけですよ。
今初めてルールを知ったお客さんと、
ルールどころかゲーム内部のスクリプトの処理すら知っている、ファミ通の攻略本もビックリな情報量を持つ開発者の僕が戦うわけですよ。
ガチったら戦いになるわけがないじゃないですか。
接待バトルをせざるを得ないわけですよ
お客さんも接待バトルなんて受けたくないでしょうしね。

上記の理由から開発者の僕がプレイヤーになるわけにはいかんのですよ。
すなわちCPU戦用のAIの作成は残ながら必要になるわけですね。

頭の悪いAIを作ろう

というわけで、不本意ですがAIを作る羽目になったわけですが、
僕はAIに対する知見もなければ
開発時間もほとんどない。

ただ今回作るAIは気合の入ったものでなくていいんです。
AIの対戦相手は初見プレイヤーですよ。
初心者どころか初見なのです。
こちらの手を先読みしてくる、歯ごたえのあるAIを作るわけじゃないんです。
それなら短時間でも作れるはず。

今回のゲーム用のAIに基本的に考えてもらうことは以下の通りです。

  • どのキャラクターを操作するのか?
  • どのキャラクターを狙うのか?
  • どんな行動をさせるのか?

AIは初見プレイヤーさんと戦うためにゲームプレイしてほしいので、
残り体力が低い相手のキャラクターを狙ったり、危険な場所にいる自分のキャラクターを逃がすような、頭の良い行動はしてほしくない。
かといって、自ら相手の攻撃に当たりにいったり、無意味な行動をさせるような、接待プレイ以下の行動もしてほしくない。

そう考えると、各キャラクターのステータス情報からAIがものを考える必要はあんまりなさそう。
単純にキャラクター同士の距離感のみで考えてみましょう。

ダイクストラ法を用いて各キャラクターの全グリッドへの移動コストを計算しましょう。
f:id:urahimono:20211207000939j:plain

これに各キャラクターが持つ攻撃スキルの中で一番射程の長いスキルを合わせれば、
相手の各キャラクターに対してどれぐらいの行動量で攻撃が可能になるのかが計算できます。
f:id:urahimono:20211207000952j:plain

この情報からAIには、どのキャラクターを操作するのか?どのキャラクターを狙うのか? を決めてもらいます。
僕がこのAIにお願いしているのは、
一番近いキャラクターへ攻撃可能になる距離が、
一番遠いキャラクターを操作するようにお願いしています。
これが今回のAIの考え方のポイントになります。

一番近いキャラクターへ攻撃可能になる距離が、一番遠いキャラクターが操作対象になる。

これは言い方を変えれば、こちらの全キャラクターが攻撃可能になるまでは、相手を攻撃しないという考えになります。
この考え方により、しばらく攻撃はしてこないため、お客さんが操作の感覚を掴むまでの時間が作られるわけです。
さらに全キャラクターが攻めてくるので、遊んでいるキャラクターがいなくなります。
そうするとお客さんも全キャラクターを満遍なく操作してくれるのです。
f:id:urahimono:20211207002118j:plain

そしてこのAIにはいろんなことをしてほしいという要望も出しています。
このゲームのキャラクターは各自いろいろなスキルを持っているのですが、当然初見のお客さんはどのキャラクターにどんなスキルがあるかなんてわかりません。
かといって、各キャラクターについて詳しく説明していたら、ゲームを遊ぶ前に時間がかかりすぎてお客さんが遊ぶ前に帰ってしまいます。
f:id:urahimono:20211207002243j:plain

そのためAIにはいろんなキャラクターのいろんなスキルを使ってもらって、デモプレイのようにも振る舞ってほしいのです。
AIのメインの思考は先述の攻撃可能距離ですが、サブの思考としてこれらのことを考えてもらいます。
なので操作したキャラクターやスキルを履歴として覚えておいて、同じキャラクターを使いすぎない同じスキルを使わないように操作してもらうようにしています。
正直このゲームは攻撃力アップのスキルを使ってからの通常攻撃の連打が最も強力な戦術なのですが、それをしてこないため、
いろんなスキルがあることをお客さんに見せると同時に、少しばかり非効率な攻撃方法を取るため弱体化もはかっています。

最後に、ランダム性は排除しています。
そのため、同じ状況ならばAIは必ず同じ行動を取ってきます。
これによりデバッグが容易になり、少ない開発時間でもAIの検証がスムーズに行えます。
かつ行動が一定のパターン化もしてくれるので、初見プレイヤーさんでも攻撃が見切りやすいです。
何度もプレイする場合は退屈になってしまいますが、基本お客さんは1回しかプレイしないので、これぐらいの思考のほうが適度な難易度になります。

実際にこのAIをデジゲー博を展示した際に使用したのですが、初見プレイヤーさんがギリギリ負けるぐらいのいい塩梅の強さになったので良かったと思います。

結論としては、ローカルマルチゲームを出展する際は、
接待プレイより、頭のちょっと悪いAIとプレイしてもらったほうが盛り上がるかもしれません。