UnityとゲームAIと将棋

Unity、Pythonを中心にゲーム開発やゲームAI開発の技術メモ等、たまに将棋も

ゲーム開発でのゲームAI・機械学習技術の活用

概要

ゲーム開発において、ゲームAI技術や機械学習技術を活用する流れが加速していると日々実感しています。実際の現場でも導入されることが増え、ゲーム開発の様々な部分で効率化が進んでいると思います。ただ、どのようなケースで、どのような技術を使用するのが良いのかということについては意外と整理されていないように思います。そこで、自分の経験や調べたことを元に、ゲームAI・機械学習技術の適用ケースを簡単にまとめておこうと思いました。

ゲームAI・機械学習技術の適用ケース

キャラを状況に応じて動かしたい

2D、3D空間上でキャラクターや敵キャラを自動で動かしたいとなった時にまず考えるのがルールベースAIで、コード上でAIの動きをメソッド化するなどして 決めておくという一番シンプルな手法です。
その後、ゲーム状態に応じてAIの挙動を切り替えたいということになった場合には、ゲーム状態を表すenumなどを用意し、ゲーム状態の変化に応じてAIを動かすメソッドを切り替えるというのが有限状態機械(FSM)です。
その他ではニューラルネットワークにキャラの行動を学習させるというのもあるかもしれませんが

  • 学習に使うデータ集め
  • 学習時の誤差関数の設計
  • デバッグの難しさ
  • ゲームデザイナーの意図しない挙動をする可能性

といった課題があるので実装コストに見合っているかは常に考える必要があります。もちろん、AIをより生き物らしく動かしたい場合は、誤差関数の設計に強化学習でいうところの好奇心(内発的報酬)といった概念を導入して学習させてみるといったことも考えられると思います。

対戦用AIを作りたい

対戦用AIは対戦形式がリアルタイムかターン制かによって異なります。リアルタイムの場合はルールベースAIとFSM、深層強化学習あたりがメインになってくると思います。基本的な動きはルールベースで作ってFSMで状況に応じて切り替える、状態と行動の組み合わせが多くてルールベースでは手に負えない or あまりAIが強くならない場合は深層強化学習を使うといった方針でしょうか。深層強化学習では開発時にルールベースAIとの対戦や自己対戦等を行い、対戦で利用する方策(Policy)の学習をし、対戦時にはその方策を利用して人間との対戦を行うという形になります。
一方でターン制の場合はそこにゲーム木探索が入ってきます。ゲーム木探索では学習をしなくて済む+簡単にそこそこ強くできるので、実装コスト的にもまずはゲーム木探索を考えることが多いと思います。もちろんゲーム木探索を行うには探索する際の盤面評価基準が必要なので、そこは人力で調整する必要があります。
また、ゲーム木探索での盤面評価基準を遺伝アルゴリズムで最適化するということもできます。遺伝アルゴリズムにはゲーム開発のシーンでよくある、「AIの強さや戦い方にバリエーションを作りたい」という要請に応えることができるという利点があります。深層強化学習モンテカルロ木探索では弱くなるように(勝率が〇〇%以下になるように等)調整するのが難しいですが、遺伝アルゴリズムであれば適合度関数の目標勝率を低く設定することでゲーム木探索の盤面評価基準のパラメタをAIが弱くなる方向に調整することができます。このように遺伝アルゴリズムで対戦用AIのパラメタ最適化を行う場合は「何に対して勝率を最適化するか?」という「ベースラインモデル」を決める必要があり、ベースラインモデルとしてはルールベースAI、モンテカルロ木探索、深層強化学習といったモデルを利用するという形になることが多いと思います。
加えて、遺伝アルゴリズムと深層強化学習はバランス調整に利用することも可能です。
例えば

  • 遺伝アルゴリズム
    新規キャラクターやカードを追加する際に極端に勝率の高くなるパーティやデッキの組み合わせができてしまわないか(バランスブレイカーの出現)

  • 深層強化学習
    ゲームデザイナーが想定したプレイングとは異なる挙動をする勝率の高いポリシーが獲得されてしまわないかどうか(バグやゲームバランス的な欠陥を突いたプレイングが存在しているかどうか)

といったことを調査するための手法として利用することが考えられます。

動的な難易度調整がしたい

いわゆるメタAIと呼ばれる分野の話です。ルールベースで「N回失敗したら敵を弱くする」などの処理を入れてFSM(ゲーム状態、ゲーム難易度)の切り替えを行うというような形式が基本になるかと思います。ただ、プレイヤーの腕前は「N回失敗した」「N時間でクリアした」などといった要素だけではなく、様々な要素を複合的に考慮しないと正確に判断ができないかと思います。そこで、様々な人のゲームプレイを記録して、ゲームプレイのデータからプレイヤーの腕前を判定するといったような仕組みをニューラルネットによる学習で行うといったことも考えられます。

背景やイラスト作成をしたい

  • Stable Diffusion等の拡散モデル

昔はGANやVAE等のモデルも研究されていたと思うのですが、現在は拡散モデルの1強ですね...著作権に関する議論が煮詰まっていないので、出力された絵をプロダクトに直接使うのにはまだ抵抗や不安があったりする方が多いと思います。なので、現状での活用方法としては自社内でのイメージ伝達で使ったり、自社デザイナー、イラストレーターが作成したラフ画や線画の清書、着色といった作業や既に作成した1枚のキャラ絵からimg2imgでバリエーションを量産するといった作業を自動化するというというのが現実的なラインなのかなと考えています。

ストーリーやセリフを作成したりキャラを喋らせたい

ストーリーやセリフの生成も現在ホットな分野で、GPTモデルをはじめとする各社のLLM(大規模言語モデル)のAPIや基盤モデルを利用するのが主流かと思います。自分たちが作ろうとしているキャラの性格やストーリーの世界観等に沿った形で生成するには、元設定に基づくセリフやストーリーのデータを事前情報として与えるか、それらのデータを用いたファインチューニングを行う必要があります。また、実用上問題になることとしては、倫理的に問題のある発言をしないかどうか、キャラの設定から離れた発言をしてしまう場合にどうするかといったことがあり、これらの点は人力での確認やフィルター処理等を入れる必要が出てきます。

おわりに

業務や個人開発の中でゲームAIや機械学習技術の選定を行う際に考えていたことを簡単にまとめました。実際のゲーム開発プロジェクトにおいては、このように様々なアプローチの仕方を知っておき、特定の手法にこだわらず、状況に応じた技術選定をを行うことがエンジニアとしては重要かなと思います。