コガネブログ

平日更新を目標にUnityやC#、Visual Studioなどのゲーム開発アレコレを書いていきます

【gumiStudy】「Luaで構築するゲームAIとその実例」メモ

登壇者:田村 祐樹(gumi corporate officer)
ドラゴンジェネシスー聖戦の絆ーで用いた
Erlangの上で動作するLuaでAIを構築したお話をします。

アジェンダ

  • そもそもAIとは
  • AIに関わるエトセトラ
  • ドラゴンジェネシスでやったこと

そもそもAIとは

  • AIとは知能のシミュレートを行います
  • 多くのゲームに「人間そのまま」の知識は必要ありません
  • 「人間らしい」または「ゲームらしい」振る舞いが求められます

AIに関わるエトセトラ

AI書いてますか?

  • 地道にゴリゴリ書いたAIの場合
    • PL「やっぱりボスだからドカンと一発欲しいよね」
    • PL「そうそう、ここでドーンとダメージいれて」
    • PL「やっぱりさあ、このタイミングで回復させちゃおうよ」
      • PG「ごめん、無理」

地道なのも勿論AIですが

  • IF文を連ねたものはルールベースのAIと呼びます
  • ただ、地道にゴリゴリ書いたAIは調整できません
  • 地道よりは楽な方がいいでしょ

ゲームAIの代表的なモデル

  • Movement(動作)
  • Decision Making(意思決定)
  • Strategy(戦略)
  • Infrastructure(基盤)
  • Agent Based AI(エージェントベースAI)

これらは必ずしも1つのゲームの中に全てそろっている訳ではありません
例えば、将棋やチェスは「戦略」は必要としますが、個々の駒の判断は必要ありません
逆に、RPGやアクションゲームは「戦略」が必要なく、個々の判断だけで動きます

Movement

  • モーション/アクションの決定に関するアルゴリズム
  • 例えば近接行動しか持っていなモンスターは「徘徊」→「接近」→「攻撃」と決定をします
  • ただし、「接近」は見た目的に一直線に相手に向かっていく事はできません
  • なぜなら、障害物や、通路/線路を避けるために思考が必要だからです

Decision Making

  • 意思決定は次に何をするかを決めます
  • 例えば「攻撃」「探索」「警戒」「防衛」と言った行動
  • 基本、瞬間瞬間で最適化を得ます

Strategy

  • 多くのゲームはMovementとDecisionを使えば深みを出せます
  • ただ、この「戦略」を使わないと行けないケースもあります

Infrastructure

  • 基盤は個々のAIが生み出した結果を反映する何かであり全てです
  • 例えば動作で「走る」を選択した場合、走るモーション、アニメーションが画面に反映される必要があります

Agent Based AI

  • 自立駆動型のAIです
  • これらは動作や意思決定から構成され基盤に影響を受けたり与えたりします
  • これらは知性と環境/基盤を明確に区別したボトムアップ型のAIと呼ばれます

そもそもAIは何ができる?

  • 遊び相手になる
  • ゲームに幅を与える
  • 新しい遊びを生み出せる

疑問

  • でも、カードゲームにAIはいらないよね
  • AIなんていらないんじゃ?

今までと何が違う?

  • WebゲームにもAIはあった
  • ただし、自律的な物はほとんどない

AIができた先には何がある?

  • AIを使ったゲームはより面白い遊びができます
  • AR(拡張現実)やVR(仮想現実)の分野にも適用されています
  • もっともっと面白い事ができるでしょう!

ドラゴンジェネシスでやったこと

開発環境

クライアント

  • C++11
  • Lua
  • Cocos2d-x
  • Xcode
  • Android NDK
  • CloudFront
  • S3

サーバー

  • Python
  • Erlang/Lua
  • Django
  • MySQL
  • Apache
  • AWS
  • RDS

補助ツール

  • Python
  • Objective-C
  • OSS各種
  • Jenkins
  • Trello
  • HipChat

Luaについて

  • 強い、速い、軽いと三拍子揃っています
  • Cocos2d-xのデフォルトサポート
  • Squirrel、AngelScriptなど競合と比べても軽い
  • そもそも今回はErlangの上で動くVMなので他に選択肢がほとんどないとも言えます

サーバー内でAIを動作させる場合

  • 疎結合にしにくい
  • またスケールしにくい
  • ジョブキューなどでまわすにしても、こけたりつまったりする
  • データ駆動にする事もできるが、プログラムと密な関係を持つ事になる

意思決定

  • いつ誰をどれくらい殴るか
  • 意思決定したら、それをサーバに送る
  • この役割を果たすのがgbot(Erlang+Lua)
  • 他のプレイヤーと同様にコマンドを送っている

Behaviour Tree

  • 意思決定のツールとして非常に有名
  • 階層型ステートマシンと共通点が多い
  • が、Behaviour Treeはステートではなくタスクを極小にする構造になる

ステートマシン?

  • 待機
  • 徘徊
  • 攻撃
  • 逃避
  • ステート(状態)遷移で表現する
  • 階層化もできる

ステートマシンの弱点

  • ステートが増えるほど複雑になる

何が違うか?

  • Behaviour Treeはゲームデザイナがプログラマの助けが無くてもAIを構築できるように発案された物です
  • 構造が複雑化せず、見通しが良いのが利点
    • 各タスクのモジュール化
    • 階層化
    • セレクションルール
    • よって単純化したのが強み

ビヘイビアの機能

  • 各ビヘイビアは具体的な行動を持ちます
  • 自分でそれが実行可能か判断します

タスク?

  • 各タスクを極小に設計する事で、タスクを使い回す事ができ、よりシンプルに構造を保ちます
  • タスクの主な要素は下記の3種類
    • 条件
    • 行動
    • それらの複合

条件?

  • 条件は主に自分や環境を調べます
    • 自分のHPは30%以上あるか?
    • 自分のMPは300残っているか?
    • 目の前の部屋のドアは開いているか?

行動?

  • 行動はゲームの状態を変化させる何かです
    • 薬草を使う
    • エーテルを飲む
    • 部屋に侵入する

主な構成要素

  • 行動
  • 条件
  • 子供を成功するまで順番に実行
  • 子供を1つずつ順番に実行

ドラジェネの場合

  • ドラジェネのゴリアテ戦ではBehaviourTreeで簡単な分岐を用いています
  • ゴリアテ戦においては、自分のHPやビットが生きているかどうか、相手が何人参戦しているかといったパラメータが条件になります
  • 対して、行動は「強い単体攻撃」「全体攻撃」「デバフ」「自軍回復」といったものです

メリット

  • ルールを階層化して定義できるので、複雑ルールでも複雑な構造になりづらい
  • ステートマシンと違い、遷移が派入り組まないので遷移を画面に表示しやすい
  • 1つのビヘイビアを使い回せる

デメリット

  • 必ず先端からノードをたどるため、ステートマシンよりも負荷が高くなりがち
  • どんな簡単な事でもビヘイビアを作らないと行けない

まとめ

  • Luaは強く、速く、軽い
  • AIにはいろんな種類があるが「Movement」「Decision making」は重要かつ見た目に直結
  • BehaviourTreeは複雑なAIに向いている
  • どうしてAIが必要なのか?
    • AIはゲームを面白くするのに不可欠
  • パズドラは別にAI使っていないでしょ?
    • ルールベース(条件分岐)のAIもAIです
  • 遊びなら人間同士を結びつければいいんじゃない?
    • 人間にできない事をするAIもいます