14K Views
November 27, 23
スライド概要
■概要
キャラクターがゲーム空間内を移動するためのナビゲーションAI技術に関して、RE ENGINEで用意されている機能の紹介と、それらを用いてどのようにキャラクターの移動を実現しているのかを、実際にリリースされたタイトルを例に説明します。
エネミーやNPCがどのように目的地を選択し移動経路をたどるのか、ゲーム空間を表現するための位置情報の作り方、処理負荷やメモリ使用量の最適化などについて触れます。
※CAPCOM Open Conference Professional RE:2023 で公開された動画を一部改変してスライド化しております。
■想定スキル
一般的なゲームエンジンによるゲーム制作経験
ナビゲーションAIの基礎知識があるとより理解が深まります
詳細は下記公式サイトをご確認ください。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CAPCOM Open Conference Professional RE:2023
https://www.capcom-games.com/coc/2023/
カプコンR&Dの最新情報は公式Twitterをチェック!
https://twitter.com/capcom_randd
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Copyright (c) 2009 Mikko Mononen [email protected]
Microsoft, Windows, and Microsoft Teams are trademarks or registered trademarks of Microsoft Corporation in the United States and other countries.
Screenshots of Microsoft products are used with permission from Microsoft.
株式会社カプコンが誇るゲームエンジン「RE ENGINE」を開発している技術研究統括によるカプコン公式アカウントです。 これまでの技術カンファレンスなどで行った講演資料を公開しています。 【CAPCOM オープンカンファレンス プロフェッショナル RE:2023】 https://www.capcom-games.com/coc/2023/ 【CAPCOM オープンカンファレンス RE:2022】 https://www.capcom.co.jp/RE2022/ 【CAPCOM オープンカンファレンス RE:2019】 http://www.capcom.co.jp/RE2019/
ナビゲーションAIシステム概要と タイトル活用事例 「ナビゲーションAIシステム概要とタイトル活用事例」と題して、講演を始めさせていただきます。 -------RecastNavigation Copyright (c) 2009 Mikko Mononen [email protected] Microsoft, Windows, and Microsoft Teams are trademarks or registered trademarks of Microsoft Corporation in the United States and other countries. Screenshots of Microsoft products are used with permission from Microsoft. ©CAPCOM 1
ナビゲーションAIシステム概要 ※ 内容の一部に下記を含みます。視聴には配慮をお願いします。 • 暴力シーンやグロテスクな表現 • ゲームの重要シーンや攻略に関わる情報 前半は、ナビゲーションAIシステムの概要をご紹介させていただきます。 はじめる前に、本セッションでは、実例としてゲーム内の映像を使用する箇所があります。 2 そのため、暴力シーンやグロテスクな表現、ゲームのネタバレになるような要素を含みますので、視聴には配慮をお願いします。 ©CAPCOM 2
もくじ • ナビゲーションAIとは? • AIMap作成ワークフロー • 開発支援機能 RE ENGINEのナビゲーションAIシステムについて、このような流れでご紹介いたします。 まず最初に、そもそもナビゲーションAIとはどのようなものなのか、簡単にご紹介いたします。 3 続いて、キャラクターをナビゲーションするためのマップ作りについて、ワークフローに沿いながら各システムをご紹介いたします。 最後に、実際にナビゲーションを開発・利用する際に役立つ、開発支援の機能をご紹介いたします。 ©CAPCOM 3
ナビゲーションAIとは? 最初は、ナビゲーションAIについてです。 4 ©CAPCOM 4
RE ENGINEにおけるナビゲーションAI キャラクターがゲーム世界において 任意の移動を行うための仕組み 壁などの障害物を考慮して 目的地までの経路を探索できる ナビゲーションでキャラクターが移動する様子 RE ENGINEにおけるナビゲーションAIとは、キャラクターがゲーム世界において任意の移動を行うための仕組みです。 他のゲームエンジンでも似たようなものかと思いますが、フィールドにある壁などの障害物を避けながら、目的地に向かうための経 5 路を探索できます。 動画では、フィールドに配置されたたくさんのキャラクターが、各々の最適な経路を通って、赤色のゴール地点まで移動する様子が 流れています。 このように、キャラクターをゴールまで案内する機能が、ナビゲーションです。 ©CAPCOM 5
ナビゲーションに必要な要素 目的地まで行くには何が必要? 案内役 → Agent 地図 → AIMap では、ナビゲーションを行うために必要な要素はなんでしょう? これは、現実世界で私たちがどこかへ出かけるのに必要なものと同じです。 まずは地図です。 地図が無ければ今自分がどこにいるのか、目的地がどこにあるのかもわかりません。 6 次に案内役です。現代はカーナビやスマホのナビなどで溢れかえっていますが、案内があれば知らない場所でもちゃんとたどり着く ことができます。 ナビゲーションには、現実世界の地図や案内役に対応した要素、AIMapとAgentがあります。 ©CAPCOM 6
AIMap ゲーム世界の”地図”のようなもの RE ENGINEではAIMapとして3種類の表現が存在する NavMesh VolumeSpace Waypoint AIMapは、ゲーム世界の地図のようなものです。 RE ENGINEにはNavMesh、VolumeSpace、Waypointの3種類の表現を提供しており、キャラクター毎に適切なマップを利用して 7 います。 ©CAPCOM 7
各AIMapの特徴 NavMesh VolumeSpace Waypoint NavMesh VolumeSpace Waypoint 用途 地表を移動する 空中を移動する 決まったポイント間を移動する 生成方法 コリジョンから自動生成 コリジョンから自動生成 ポイントを手置き ノード数 ≒処理負荷 多い 多い 少ない それぞれのAIMapの特徴を紹介します。 NavMeshは地表を移動するキャラクターがよく用いるマップで、地形情報のコリジョンから自動で生成されます。 8 地表部分をポリゴンのグラフで表現することで、どのポリゴンを進んでいけば目的地にたどり着くか計算することができます。 地表をポリゴンで覆う必要があるため、ノード数が多くなってしまい、 結果的に処理負荷が大きくなってしまうという難点もあります。 ©CAPCOM 8
各AIMapの特徴 NavMesh VolumeSpace Waypoint NavMesh VolumeSpace Waypoint 用途 地表を移動する 空中を移動する 決まったポイント間を移動する 生成方法 コリジョンから自動生成 コリジョンから自動生成 ポイントを手置き ノード数 ≒処理負荷 多い 多い 少ない VolumeSpaceは空中を移動するキャラクターが用いるマップで、同じくコリジョンから自動生成されるボクセルのグラフです。 NavMeshの空中版といった感じで、これもノード数が多くなってしまいます。 ©CAPCOM 9 9
各AIMapの特徴 NavMesh VolumeSpace Waypoint NavMesh VolumeSpace Waypoint 用途 地表を移動する 空中を移動する 決まったポイント間を移動する 生成方法 コリジョンから自動生成 コリジョンから自動生成 ポイントを手置き ノード数 ≒処理負荷 多い 多い 少ない Waypointは、キャラクターが通りたい場所にポイントを手で置いていく、シンプルな手法です。 ポイントの数を制御しやすいため処理負荷を抑えやすいですが、手で置いていく必要があったり、壁の検知など地形情報を考慮する 10 ことはできません。 それぞれにメリット・デメリットがあるため、キャラクターによって適切なマップを選んでもらっています。 ©CAPCOM 10
Agent キャラクターを目的地まで案内する”案内役”のようなもの コンポーネントとして、ゲームオブジェクトに付与される NavigationSurface コンポーネント ①ゲームオブジェクトにアタッチ ②AIMapや目的地を設定 ③目的地まで案内 (実際にどう動かすかはキャラ任せ) Agentはキャラクターを目的地まで案内してくれる案内役のようなものです。 動かしたいキャラクターに取り付けるもので、どのAIMapを用いてどこまで行きたいかを設定すると、目的地まで案内してくれます。 11 エージェントは動画の赤矢印のように、目的地がどちらにあるかを示してくれるだけで、実際にキャラクターがどう動くかは教えて くれません。 カーナビに「右折してください」と言われたときに車がどう動くかは運転手次第なように、キャラクターがどう動くかはキャラク ターに任せています。 ©CAPCOM 11
AIMap(ナビメッシュ) 利用ワークフロー 続いて、実際にゲームでナビゲーションを利用するときのワークフローをご紹介します。 ここでは、地表を移動するキャラクターが使うナビメッシュを題材とします。 12 ©CAPCOM 12
ナビメッシュ利用ワークフロー ベースとなるナビメッシュを自動で生成 地形情報からナビメッシュを自動生成 ワークフローの概要をご紹介します。 ナビメッシュの利用フローは主に3段階に分かれます。 まず最初に、ゲームの地形情報から、ベースとなるナビメッシュを自動で生成します。 13 地面が無いところや壁があるところには行かないよう、キャラクターが歩ける位置にナビメッシュを生成します。 ©CAPCOM 13
ナビメッシュ利用ワークフロー ベースとなるナビメッシュを自動で生成 ナビメッシュを静的に加工 地続きじゃないノード間をジャンプしたい 次に、ナビメッシュを静的に加工していきます。 この工程では、先ほど自動で生成したナビメッシュを手動で加工します。 14 例えば、図の赤矢印の位置を見てください。 地続きではないため自動生成されたナビメッシュでは繋がっていませんが、ゲームによってはジャンプして飛び越えられそうです。 このような要望を満たすために、RE ENGINEには自動生成されたナビメッシュに手を加える機能があります。 ©CAPCOM 14
ナビメッシュ利用ワークフロー ベースとなるナビメッシュを自動で生成 ナビメッシュを静的に加工 ナビメッシュを動的に加工 ゲーム内で通行可・不可を切り替えたい 最後に、ナビメッシュの動的な加工です。 「普段は繋がっている道だけど、落石イベントの後は通行止めにしたい」のように、ゲーム内で通行可能・通行止めを切り替えたい 15 ことがあります。 このような要望を満たすために、RE ENGINEにはナビメッシュの加工をゲーム内で動的に行う機能があります。 これらの機能を順番にご紹介します。 ©CAPCOM 15
1. 歩行可能な部分を自動生成する ゲーム世界のコリジョン情報から 歩行可能な部分にナビメッシュを自動で生成する ゲーム内コリジョン 生成されたナビメッシュ (RecastNavigation) キャラクターに合わせて 歩行可能な部分を制御できる ゲーム世界のコリジョン情報から、歩行可能な部分にナビメッシュを自動で生成する機能です。 ナビメッシュは緑色のノード群とそれを繋ぐ白色のリンクで表現されたグラフ構造となっています。 16 自動生成されるメッシュは、そのマップを使うキャラクターに沿って制御が可能で、キャラクターの大きさや登れる段差の高さなど、 いくつかのパラメータを設定することができます。 このあたりは、多くのゲームエンジンでも使われているRecastNavigationというソフトウェアを利用しています。 ©CAPCOM 16
2. 生成メッシュに手を加える 例えば… • ジャンプすれば届きそうなノード間を繋ぎたい • 段差を飛び降りて移動させたい • ナビメッシュ上にあまり通ってほしくないノードがある 地続きじゃないノード間ジャンプ 登れなくても飛び降りたい 毒沼を作りたい 毒沼部分は迂回してほしい 先ほど生成したナビメッシュに手を加えていきます。 例えば、ジャンプすれば届きそうなノード間を繋ぎたい とか 登れない段差だけど飛び降りて移動はさせたい とか ナビメッシュ上にあまり通ってほしくないノードがある などの場合に、それらを実現する機能を提供しています。 ©CAPCOM 17 17
2-1. ExtraLink 配置したバウンダリ間に、後付けでリンクを張る機能 片方向リンク・双方向リンクのように使い分けが可能 飛び降り用 下方向リンク ジャンプ用 双方向リンク ExtraLinkを移動する様子 最初に紹介するのはExtraLinkという機能です。 これは、任意の位置にバウンダリを配置することで、そのバウンダリの間に後付けでリンクを張るという機能です。18 片方向・双方向のどちらにも対応しており、下方向専用のリンクや、双方向からジャンプできるリンクなど、やりたいことに合わせ たリンクを張ることができます。 動画では、高台から降りるキャラクターはExtraLinkを使って飛び降りていますが、高台へ登るキャラクターはわざわざ坂道を登って 移動しています。 これは飛び降り用リンクが片方向のため、登りでは利用できないからです。 ©CAPCOM 18
2-2. MapBoundary 指定した領域と接触したノードに属性を付与 エージェントは特定の属性ノードを避けるような移動が可能 属性をつけたい範囲を バウンダリで指定 バウンダリが接触したノードに 属性が付与される 毒沼を迂回して進む様子 次にMapBoundaryの機能を紹介します。 これも任意の位置にバウンダリを配置するものですが、バウンダリに接触したノードに属性を付与することができます。 19 キャラクターは特定の属性を避けるように移動することができるため、動画では毒沼となった属性を通らず、迂回して進んでいます。 ©CAPCOM 19
2-3. MapBoundary + マップ分割 指定した領域に合わせてノードを分割し、その範囲内に属性を付与 ◎分割のメリット • ノード形状に捉われず、ギミック等の形状に 合わせて影響範囲を指定できる ▲デメリット • ノード数が増えるため、処理負荷が上がる 毒沼をギリギリ避けて最短経路を進行 MapBoundaryには、マップを分割する機能が用意されています。 先ほどMapBoundaryは接触するノードに属性を付与するといいましたが、 必ずしも毒沼の形とノードの形が一致しているとは限りません。 20 しかし、この分割機能を使うことで、ノードの形状に捉われず、 ギミック等の形状にあわせて影響範囲を指定することができます。 動画では、毒沼をギリギリ避けて最短経路を進行する様子が流れています。 一方、ノード数が増えるため、処理負荷が上がってしまうというデメリットもあります。 分割機能を使うか否かは、ギミックにあった方を選んでもらっています。 ©CAPCOM 20
3. ナビメッシュをRuntime上で動的操作 Runtime実行中、特定のタイミングで • 属性を変えたい • 特定ノード間にリンクを張りたい ◎メリット • ゲームギミックに応じて操作のON/OFFが可能 • 動く物体に合わせてナビメッシュを操作できる ▲デメリット (静的操作のメリット) • 処理負荷が高く、ゲームが重くなりやすい 『BIOHAZARD RE:4』 の梯子 ゲームによっては、時間経過で毒沼の位置が変わったり、 梯子がかかっている間だけ梯子移動ができるようなギミックがあったりします。 『BIOHAZARD RE:4』でも、敵が梯子をかけている間は梯子によって敵が登ってくるギミックがあります。 21 そのようなときに、ゲーム中でもナビメッシュに手を加えられる機能を提供しています。 ゲームギミックに応じて操作のON/OFFが出来たり、動く物体に合わせて影響範囲を変えられたりといったメリットがありますが、 ゲーム内でやる以上、処理負荷が上がってゲームが重たくなってしまうことは避けられません。 ©CAPCOM 21
3-1. AIMapEffectorを使った属性付与 動的な属性の付与 動的なマップ分割 『BIOHAZARD RE:4』の回転砲台 • 予め縦横斜めの4パターンを想定 • AIMapEffectorによる動的属性付与 • MapBoundaryによる事前分割 (処理負荷削減) 属性の移動に合わせて 経路を変えるエージェント AIMapEffectorは、動的なMapBoundaryのような機能で、接触したノードに対して動的に属性を付与することができます。 また、マップの分割も動的に行うことができます。 22 左の動画では、毒沼が動いてもちゃんと毒沼部分を避けて移動するキャラクターが確認できます。 また、処理負荷がネックなAIMapEffectorを上手く使う技として、MapBoundaryで事前にマップを分割しておいて、 AIMapEffectorで属性の付与だけ行う という実装方法があります。 『BIOHAZARD RE:4』では、これを利用した回転砲台のギミックがあります。 この砲台はプレイヤーが向きを360度動かすことができますが、 エネミーは砲台にぶつからないように避けて移動する必要があります。 ©CAPCOM 22
3-1. AIMapEffectorを使った属性付与 動的な属性の付与 動的なマップ分割 『BIOHAZARD RE:4』の回転砲台 • 予め縦横斜めの4パターンを想定 • AIMapEffectorによる動的属性付与 • MapBoundaryによる事前分割 (処理負荷削減) 属性の移動に合わせて 経路を変えるエージェント 事前に縦横斜めの4パターンを想定してMapBoundaryによる分割を行っておき、 ゲーム上にも同じサイズのEffectorを4つ用意しておきます。 ゲーム実行時は現在の角度に近いEffectorのみを有効にすることで、 砲台周辺のナビメッシュをおおよその位置で切り取ることができます。 23 右の動画は、このギミックを簡易的に再現したものです。 上の砲台のようにAIMapEffectorの動的分割を使って常時切り取ることはできますが、これは処理負荷の高い実装です。 下のように事前に切り取っておくことで、上の動的分割に近い挙動を実現しながら、処理負荷を大幅に削減することができます。 ©CAPCOM 23
3-2. AIMapEffectorを使ったExtraLink AIMapEffectorが接しているノード間に動的にExtraLinkを張る Effector(水色バウンダリ) の間にExtraLinkを動的生成 動的にリンクが張られる様子 リンク前後のエージェントの挙動 次に動的ExtraLinkです。これもAIMapEffectorを利用して提供しています。 AIMapEffectorを2つ置き、その間にリンクを張ることができる機能です。 動画では梯子を出現させると段差の上下にリンクが結ばれるようになっています。 24 最初に移動するキャラクターは梯子がないので坂道を上りますが、梯子が出現した後は梯子を使ってショートカットしています。 ©CAPCOM 24
開発支援機能 続いて、ナビゲーションを開発・利用する際に役立つ、開発支援の機能を3つほどご紹介いたします。 25 ©CAPCOM 25
AIMapDebugger AIMapの情報を可視化するツール 機能 • ノードやリンクの描画 • 描画要素のフィルタリング • 描画範囲のフィルタリング • 各ノードの詳細情報の表示 • 経路探索テスト 『MONSTER HUNTER RISE』 大社跡のAIMap描画 ※ナビゲーションのテスト用シーンのため、 実際のゲーム画面とは異なります まずはこちらのAIMapDebuggerになります。 今までの説明に使っていた画像で、ナビメッシュが緑色に描画されていましたが、 これを描画しているツールがAIMapDebuggerです。 26 AIMapのノードやリンクを描画するツールで、ゲーム上でAIMapがどのように広がっているのかを確認することができます。 ナビゲーションの開発・利用時に、正しくナビメッシュが生成されているか、ExtraLinkや属性を正しく付与できているかどうかなど、 目視で確かめることができます。 ゲーム中、どこかでキャラクターが迂回してしまうなどの不具合が起きたときは、AIMapDebuggerでノードが不自然に途切れてい ないかなどを確認します。 AIMapDebuggerには描画のフィルタリング機能や、経路探索テストなどの機能がついています。実際に、AIMapDebuggerを動か しながら見てみましょう。 ©CAPCOM 26
AIMapDebugger デモ ※デモ用のシーンのため、実際のゲーム画面とは異なります。 本デモの不具合はデモのための架空のものです。 『MONSTER HUNTER RISE』のAIMapの様子を、AIMapDebuggerで見ていきたいと思います。 今回は不具合調査のデモとして、オトモが特定の地点で遠回りしてしまうといったシーンを用意しました。 27 デモ用に作った不具合なので、実際のゲームでは起きません。ご安心ください。 まずは、不具合が起きた場所へ向かいます。 目印として黄色と青の球が置いてあります。 黄色の地点から青の地点まで行こうとすると、オトモが遠回りしてしまうそうです。 ©CAPCOM 27
AIMapDebugger デモ ※デモ用のシーンのため、実際のゲーム画面とは異なります。 本デモの不具合はデモのための架空のものです。 AIMapDebuggerには経路探索を行う機能があるので、それを使って経路を見てみましょう。 確かに、まっすぐ進めばたどり着けそうな場所で、大きく回り道した経路が出来てしまっています。 ©CAPCOM 28 28
AIMapDebugger デモ ※デモ用のシーンのため、実際のゲーム画面とは異なります。 本デモの不具合はデモのための架空のものです。 何が起きているのか、実際にオトモのAIMapを見てみましょう。 AIMapを表示してみましたが、広いステージなだけあって、ナビメッシュが大量に表示されてしまいました。 29 余計なメッシュが描画されていると調査がしにくいので、表示範囲を絞ってみましょう。 このように、バウンダリで指定した範囲にノードの描画を絞ることができます。 ©CAPCOM 29
AIMapDebugger デモ ※デモ用のシーンのため、実際のゲーム画面とは異なります。 本デモの不具合はデモのための架空のものです。 それでは、回り道した箇所を見てみましょう。 デバッグ描画を見ると、スタートとゴールの間で、ナビメッシュが分断されてしまっています。 これでは、まっすぐ進んでもゴールにたどり着けないので、オトモは回り道してしまいそうです。 ©CAPCOM 30 30
AIMapDebugger デモ ※デモ用のシーンのため、実際のゲーム画面とは異なります。 本デモの不具合はデモのための架空のものです。 今回ナビメッシュが分断されている理由は、先ほど説明したAIMapEffectorを置いておいたからです。 これを解除すると、無事にナビメッシュが繋がりました。 31 もう一度経路探索の機能で経路を確認してみると、無事にゴールまでまっすぐの経路ができるようになりました。 これにて、不具合調査は完了です。 このように、AIMapの描画、フィルタリング、経路探索機能などを使って、ナビゲーションの実装や調査などを行っています。 ©CAPCOM 31
NavigationProfiler ナビゲーションの経路探索問題 • 経路探索(A*アルゴリズム)は重い • ゴールまで遠いほど負荷増 • 同時に複数キャラが探索すれば負荷増 → どれぐらいまでなら大丈夫?可視化してほしい 欲しい情報 • 各キャラのスタート・ゴール位置と計算時間 • 複数キャラが同時にリクエストした経路探索の数 • 1フレームでかかった計算時間の合計 続いてNavigationProfilerの紹介です。 Profilerを作った経緯として、そもそも経路探索に使っているA*アルゴリズムは処理負荷が大きいため、 無暗にたくさん実行していいものではないという問題があります。 32 ゴールまでの距離が遠くなったり、複数のキャラクターが同時に経路探索をすると、処理負荷が増えていきます。 そこで、ナビゲーションを行うのにどれだけの処理がかかっているのか、可視化するツールとして、 NavigationProfilerを作成しました。 経路探索を行ったキャラクターのスタート・ゴール位置や計算時間を収集しており、 各フレームのリクエスト数や実行時間等を収集することができます。 ©CAPCOM 32
NavigationProfiler 経路探索の処理負荷の調査に必要な情報をプロファイルできるツール プロファイルできる情報 • 全体 • 計算時間・リクエスト数のフレーム平均 • 計算時間・リクエスト数の最大フレーム • プロファイル期間中のリクエスト数合計 NavigationProfilerの画面はこのようになっており、経路探索の処理負荷の調査に必要な情報をプロファイルできます。 プロファイルしたデータ全体で、リクエスト数や計算時間の最大値や平均値を取得できます。 ©CAPCOM 33 33
NavigationProfiler 経路探索の処理負荷の調査に必要な情報をプロファイルできるツール プロファイルできる情報 • 全体 • 計算時間・リクエスト数のフレーム平均 • 計算時間・リクエスト数の最大フレーム • プロファイル期間中のリクエスト数合計 • 各フレーム • 計算時間、リクエスト数 次に各フレームの情報です。 指定したフレーム毎に情報を見ることができ、そのフレームの計算時間やリクエスト数を取得できます。 ©CAPCOM 34 34
NavigationProfiler 経路探索の処理負荷の調査に必要な情報をプロファイルできるツール プロファイルできる情報 • 全体 • 計算時間・リクエスト数のフレーム平均 • 計算時間・リクエスト数の最大フレーム • プロファイル期間中のリクエスト数合計 • 各フレーム • 計算時間、リクエスト数 • 各経路探索リクエスト • 計算時間 • スタート・ゴール位置 • Mapの種類などの各種設定事項 リクエスト毎の詳細な情報も見ることができます。 どのGameObjectからのリクエストなのかや、見ているAIMapの種類、かかった時間、 スタートとゴールの座標などが一覧で表示されます。 ©CAPCOM 35 35
『BIOHAZARD RE:4』実例 『BIOHAZARD RE:4』のナビゲーションの様子を、NavigationProfilerで見てみたいと思います。 プロファイルするシーンは、ゲーム序盤に村を訪れたレオンが、村人たちの襲撃に耐えるシーンです。 36 このイベントは大勢の村人が一挙に襲ってくるもので、村人はそれぞれナビゲーションによって移動を行っているため、 経路探索のリクエストがとても混雑します。 ©CAPCOM 36
『BIOHAZARD RE:4』実例 プロファイル全体の情報 押し寄せる村人たち デモ動画 襲撃イベントの約5000フレームを計測した結果の一部をピックアップしてみました。 今回はあくまでPC環境で測定したプロファイル結果のため、PS5などプラットフォームを変えれば、 また別の結果が取れると思います。 37 5000フレームの間にリクエストは6021回呼ばれており、 1フレームあたりおよそ1.2回ほどの頻度で経路探索がリクエストされています。 ©CAPCOM 37
『BIOHAZARD RE:4』実例 プロファイル全体の情報 押し寄せる村人たち デモ動画 今回プロファイルした限りだと、1フレーム中の最大リクエストは5回でした。 次は、この最大リクエストがあったフレームを詳しく調べてみます。 38 ©CAPCOM 38
『BIOHAZARD RE:4』実例 リクエスト最大フレームの情報 ・プロファイル全体の情報 押し寄せる村人たち デモ動画 5回のリクエストがあったフレームの情報を調べてみると、計算時間の合計は0.512[ms]のようです。 平均値の0.348[ms]よりもかかっていますが、最大値の0.797[ms]よりは短いですね。 39 このフレームは、同時リクエストの数は多いですが、リクエスト1つ1つの計算時間は短かったようです。 ©CAPCOM 39
『BIOHAZARD RE:4』実例 リクエスト最大フレームの情報 5件のリクエストの詳細 押し寄せる村人たち デモ動画 リクエストされた5件の詳細を見てみましょう。 各経路計算が、どのGameObjectからのリクエストなのかや、見ているAIMap、かかった時間、 スタートとゴールの座標などが一覧で表示されます。 40 これを基に、タイトルは 「1フレーム中のリクエストが多いから制限しよう」であったり 「どのリクエストも時間がかかってるから探索距離を短めにしよう」など、 処理負荷対策のための方針を検討することができます。 ©CAPCOM 40
NavigationChecker 機能追加の際、意図せず経路が変わるバグを仕込んでしまうことがある タイトル 今までまっすぐ進んでたのに、迂回するようになった場所があります。 1か月前まではまっすぐ進んでいました。久しぶりに動かしたら迂回してました。 意図した変更ではないですね…。 エンジン 調査します。 機能追加A 機能追加B 不具合修正C ・ ・ ・ • 1か月間で大量の変更 • どれが原因か分からない • 特殊な経路でのみ発生 • 機能追加時のテストでは気付けなかった → もし不具合が入ってしまっても早めに気付きたい 最後にNavigationCheckerです。 ナビゲーションには先ほど紹介したような多くの機能がありますが、機能の追加・修正を行った際に、 誤って経路が変わってしまうことがあります。 41 目で見て分かるほど変わっていれば気づきやすいですが、実際には経路が1cmだけズレたとか、 あるゲームのあるマップでだけ変わったとか、発見が困難なケースも多いです。 しばらく誰も気づかず、1か月後になってようやく経路がズレるケースに遭遇した場合、1か月分の変更を追う必要が出てきます。 NavigationCheckerはそんな事態が起こらないよう、ナビゲーションに意図しない経路変更がないかどうか、 チェックするためのツールです。 ©CAPCOM 41
NavigationCheckerのCIチェック 意図しない経路変更が起きないよう、毎日チェックする機構 経路の各座標を登録しておき、エンジンの計算結果と差分が出たら通知 比較 基準となる経路 今日のエンジン経路 経路差分が出たらMicrosoft Teamsに投稿 NavigationCheckerは2つの機能を持っています。 スタート・ゴールの座標と、スタートからゴールに向かうまでに経由する座標値を保存しておく機能 と 42 現在のエンジンで経由座標を計算したとき、保存された座標と差があるかどうかを調べる機能 です。 これで、異常がない状態のエンジンの算出した座標を登録しておき、 毎日エンジンの計算値がこれと変わらないかどうかチェックしています。 人手で毎日チェックするのは面倒なため、チェックはCIによって自動化されています。 経路に差分が出た際は、Microsoft Teamsに投稿される仕組みになっています。 ©CAPCOM 42
NavigationCheckerのテスト経路 複雑な地形特有の問題も拾えるよう、実ゲームのマップでチェック • 発売済みの『MONSTER HUNTER RISE』のマップを利用 • マップ広範囲をカバーできる大量経路 ・13個のエリアについて、あるエリアから 別エリアへ移動する経路156個 (=13×12) • 過去に不具合が報告された特殊な経路 ×3マップ ×3ステージ 大型モンスター 小型モンスター オトモ 大社跡 砂原 溶岩洞 大量のテスト経路・座標 機能紹介でお見せしたような簡単なステージでは起きない不具合が、実際のゲームで使われる複雑な地形では起こることがあります。 そのため、複雑な地形特有の問題も検知できるよう、発売済みの『MONSTER HUNTER RISE』のマップを用いて、43 テストしています。 テストする経路の作り方ですが、まずマップの広範囲をカバーできる大量の経路を作成しました。 具体的には、本作の大社跡には13のエリアがあるため、あるエリアから別のエリアへ移動する経路を156個作ることができます。 その後、壁の登り降りを含む経路や、遠距離の経路など、過去に不具合が報告された特殊な経路をいくつか追加しました。 ©CAPCOM 43
NavigationCheckerのテスト経路 複雑な地形特有の問題も拾えるよう、実ゲームのマップでチェック • 発売済みの『MONSTER HUNTER RISE』のマップを利用 • マップ広範囲をカバーできる大量経路 ・13個のエリアについて、あるエリアから 別エリアへ移動する経路156個 (=13×12) • 過去に不具合が報告された特殊な経路 ×3マップ ×3ステージ 大型モンスター 小型モンスター オトモ 大社跡 砂原 溶岩洞 大量のテスト経路・座標 本作ではAIMapを使用するキャラクター毎に大型モンスター用・小型モンスター用、オトモ用と3種類に分けているため、 AIMap毎に経路座標を保存しています。 44 また、現在は大社跡だけでなく、砂原や溶岩洞のステージでも、同様にテスト経路を作成して、チェックを行っています。 このように作成した大量の経路でチェックを行うことで、意図しない経路の不具合が混入することを防いでいます。 ©CAPCOM 44
ナビゲーションAIシステム概要 まとめ ナビゲーションAIに必要な要素 • ゲーム世界の地図 AIMap • ゲーム世界の案内役 Agent ナビメッシュ利用ワークフロー • 地表コリジョンからナビメッシュを自動生成 • ナビメッシュの静的加工 (ExtraLink生成、属性付与) • ゲーム中で動的にExtraLink生成や属性付与 開発支援機能 • AIMapの情報を可視化するAIMapDebugger • ナビゲーションのリクエスト状況を可視化するNavigationProfiler • 意図しない経路変更を検出するNavigationChecker RE ENGINEのナビゲーションAIシステム概要については以上になるので、最後にまとめです。 まず最初に、そもそもナビゲーションAIに必要な要素として、地図としてのAIMapと、 案内役としてのAgentという要素があることを紹介しました。 45 続いて、AIMapを作成するワークフローを紹介しました。 地形コリジョンからナビメッシュを自動で生成し、その後は静的な加工とゲーム内での動的加工、 適切なタイミングでナビメッシュを加工して利用するというフローになっています。 ©CAPCOM 45
ナビゲーションAIシステム概要 まとめ ナビゲーションAIに必要な要素 • ゲーム世界の地図 AIMap • ゲーム世界の案内役 Agent ナビメッシュ利用ワークフロー • 地表コリジョンからナビメッシュを自動生成 • ナビメッシュの静的加工 (ExtraLink生成、属性付与) • ゲーム中で動的にExtraLink生成や属性付与 開発支援機能 • AIMapの情報を可視化するAIMapDebugger • ナビゲーションのリクエスト状況を可視化するNavigationProfiler • 意図しない経路変更を検出するNavigationChecker 最後に、開発支援機能を3つ紹介しました。 AIMapを描画し色々なデバッグ作業を行うことができるAIMapDebugger、 ナビゲーションのリクエストを可視化し、処理負荷軽減のための情報収集ができるNavigationProfiler、 日々の開発の中で意図しない経路変更を検出してくれるNavigationCheckerがありました。 46 RE ENGINEで作られるゲームのキャラクターたちは、 これらの機能を利用することで、ゲーム世界を走り回っています。 ©CAPCOM 46
タイトルでの活用事例 ここからは、これらのNavigation機能をタイトルではどのように活用しているのか、 実際にリリースされている『BIOHAZARD RE:4』、『EXOPRIMAL』の事例を交えながらご紹介します。 47 ©CAPCOM 47
もくじ • 敵キャラクターの移動(BIOHAZARD RE:4) • 仲間キャラクターの移動(BIOHAZARD RE:4) • 処理負荷・メモリ負荷対策(BIOHAZARD RE:4) • 開発支援(BIOHAZARD RE:4 / EXOPRIMAL) 本パートではこのような内容についてお話しします。 敵キャラクターの移動、仲間キャラクターの移動、処理負荷・メモリ負荷対策、開発支援の4つです。 ©CAPCOM 48 48
敵キャラクターの移動 (BIOHAZARD RE:4) まずは、『BIOHAZARD RE:4』の敵キャラクターの移動に関する事例からご紹介します。 49 ©CAPCOM 49
敵キャラクターの移動 ガナード(村人たち) • 集団で襲いかかってくる • 知性は残っている どんなナビゲーションが求められるのか? • 1対1では余裕…と思わせつつ、 数が増えると徐々に追い込まれていく 恐怖を感じさせる移動行動 本作を象徴するもっとも代表的な敵キャラクターが先ほどの動画にも登場していた「ガナード」という村人たちです。 彼らは人間であった頃の知性が残っており、集団で追い詰めてくることが特徴です。 50 この特徴をナビゲーションで表現するためには、単体だけでの移動では完結せず、 「どう連携するか?」に着目する必要がありました。 ©CAPCOM 50
ガナードの追跡 試しに、全ガナードに対して、プレイヤー座標を目的地にしてみると… すべてのエージェントが最短経路を示す 狭い道にガナードが渋滞、 逃げるのも倒すのもラクラク これではダメ P E E E まずは、個を意識せず、全員一様に「プレイヤーを追え」と命令した場合を考えてみましょう。 目的地以外の情報を何も与えずにNavigationを実行すれば、すべてのエージェントは最短となる経路を探索します。51 スタート地点による多少のばらつきはあれど、さながら高速道路の渋滞のように、ガナード達がひとつの通路に殺到してしまいます。 これでは、知性を感じない単調な動きになってしまい、ホラーとしての重要な役割を果たすことができません。 ©CAPCOM 51
ガナードの追跡 集団追跡時の目的地の決定方法 それぞれのガナードに役割を設定 A) 追跡部隊(Attacker) B) 回り込み部隊(Flanker) C) 待ち伏せ部隊(Zone Defense) この渋滞を解消するために何をしたのか。 本作では集団での追跡時に、ガナードの一人ひとりに役割を与えることにしました。 それがこの3つの役割です。順に説明していきます。 ©CAPCOM 52 52
A) 追跡部隊 最適、最短の経路でプレイヤーを追跡 プレイヤーの位置そのものではなく取り囲むような位置を目指して移動 P P E E E E 一点に集中すると押し合いが起き、 知性を感じなくなってしまう E E E E 集団で囲まれ、退路を塞がれるという プレッシャーを与える まずは「Attacker」と呼ばれる追跡部隊です。 彼らは単純明快に、プレイヤーを最適かつ最短の経路で追跡します。 鬼ごっこ同様、プレイヤーはまず彼らの追跡に対する対応を迫られます。 53 プレイヤーに接近した際、目的座標をプレイヤーの位置そのものに設定していると、 まっすぐ向かった結果敵同士の押し合いが発生し、やはり知性を感じない獣のような動きになってしまいます。 プレイヤーの周りを取り囲むように各々が目的座標を設定することで、 「逃さず必ず仕留める」という意思を感じる動きを表現するとともに、攻撃の対象を分散させ倒しがいを生む効果もあります。 ©CAPCOM 53
B) 回り込み部隊 追跡部隊とは別の道を使ってプレイヤーを追跡 • 最短経路は追跡部隊が使っているため避けたい • 「最短ではない経路」を使う必要がある • 通常のA*アルゴリズムでは 最短経路しか探索できない…どうする? P E E E 次に、「Flanker」と呼ばれる回り込み部隊です。 プレイヤーが追跡部隊に対して応戦しているとき、または逃げ回っているときに、 「そっちから来るか」と思わせるのがこの部隊です。 54 つまり、この部隊がガナードを「集団的知性」とせしめる重要な役割を担います。 追跡部隊は最短経路でプレイヤーを追いますが、この部隊は「それ以外」の経路が必要です。 先述の通り、Navigationシステムは「最短」の経路を得る仕組みなので、「そうでない」経路を得る方法を考える必要があります。 ©CAPCOM 54
B) 回り込み部隊 大まかな道に沿って配置したWaypointと、 詳細な地形を元に生成したNavMeshの2層構造を利用 まずWaypointで探索し、通れる道を決定したら、 ポイント間の詳細な経路はNavMeshによる探索で決定する • 同じ目的地へいろいろな経路から 進行できるようにするため その話の説明のためには、ガナードが使用するAIMap、つまり空間情報についての説明が必要です。 本作のステージでは、2種類のAIMapを併用しています。 55 先ほどの説明にもありました、ポイントを配置してその間の接続情報を持ったWaypointと、 コリジョンから自動的に生成されたNavMeshです。 前者は道路の交差点ごとにポイントを置いているイメージで、 後者は道路を全て覆うようにポリゴンが敷き詰められたイメージとお考えください。 経路探索をおこなう際には、まずWaypointで大まかに通る道を決定します。 ©CAPCOM 55
B) 回り込み部隊 大まかな道に沿って配置したWaypointと、 詳細な地形を元に生成したNavMeshの2層構造を利用 まずWaypointで探索し、通れる道を決定したら、 ポイント間の詳細な経路はNavMeshによる探索で決定する • 同じ目的地へいろいろな経路から 進行できるようにするため 配置されたポイント間を移動するための座標単位での経路はNavMeshを用いて探索します。 これらを用いて、どのように経路のバリエーションを出すのか、これから説明します。 ©CAPCOM 56 56
B) 回り込み部隊 「最短でない経路」を使ってプレイヤーを追跡 P E E P プレイヤーが通った道の Waypointを「切って」いく プレイヤーの真後ろを追跡できないので、 迂回路を取りやすくなる 話を戻して、「最短でない経路」についてです。 最短でない経路を探索するためには、逆に、最短経路を探索できないようにする、という考え方をします。 57 ホラーとしての基本的なゲームの構造として、プレイヤーは敵に対して距離を置きながら戦うことになります。 したがって、先ほどの追跡部隊はプレイヤーが通った道を後ろから追いかける形が多くなります。 ここで、プレイヤーが通った道上のWaypointに印をつけていき、回り込み部隊に対する通行止め扱いにしていきます。 最も追いかけやすい道を塞ぐことによって、同じ目的地でも迂回路が探索されるようになります。 このようにして、敵が様々な道を使って回り込んでくるという動きを実現しています。 ©CAPCOM 57
C) 待ち伏せ部隊 指定ポジションへ移動して待ち伏せる • 全員がプレイヤーを追跡してしまうと、引き付けることで逃げ続けられてしまう • 「逃げてもその先にいる」という緊張感を作り出す P E P E E E 最後に「Zone Defense」と呼ばれる待ち伏せ部隊についてです。 こちらはシンプルに、「プレイヤーのいる場所ではない、指定のポジションへ向かう」という動きをします。 58 「指定のポジション」については、プレイヤーが戦闘中に逃げ込んでくるであろう場所にあらかじめ設定しています。 プレイヤーが逃げ込みたくなるようビジュアル面からも誘導し、「待ってました」とばかりに敵が現れることで、 緩和状態から緊張状態を作り出します。 ©CAPCOM 58
部隊の切り替え プレイヤーと敵の距離や位置関係の変化に伴い、 定期的に役割が更新される • プレイヤーに近い順に【追跡部隊<回り込み部隊<待ち伏せ部隊】に割り振り P 追 待 P 追 待 回 回 これらの役割は、プレイヤーとの距離や位置関係を元に、定期的に更新されます。 プレイヤーは常に動き回りますので、状況の変化に伴い、敵の役割も変化します。 59 このようにして、敵同士が連携し、知性を持って追跡されているという感覚をプレイヤーに与えることができます。 ©CAPCOM 59
仲間キャラクターの移動 (BIOHAZARD RE:4) 敵キャラクターに関する説明は以上となります。 続きまして、同じく『BIOHAZARD RE:4』より、仲間キャラクターの移動に関する事例をご紹介します。 ©CAPCOM 60 60
仲間キャラクターの移動 アシュリー(護るべき仲間) • 危機回避は自分で判断するが攻撃はできない • 敵に狙われており連れ去られてしまう どんなナビゲーションが求められるのか? • 理不尽にプレイヤーの邪魔に なってはいけないが、プレイヤーが きちんと気を配る必要がある移動行動 本作にはアシュリーという仲間が登場します。 アシュリーは「共に戦う仲間」というよりは、 「護るべき仲間」としてプレイヤーキャラクターであるレオンの護衛のもと帯同します。 61 アシュリーは武器を持たず、敵との交戦はできませんが、意思を持って危険からは回避しようとします。 しかし、極限状態での訓練経験があるわけではなく、油断をすればあっという間に敵に連れ去られてしまいます。 このような特徴をナビゲーションで表現するため、ある程度の安全を確保しつつも、 プレイヤーに気を抜かせない移動行動が求められました。 ©CAPCOM 61
仲間キャラクターの移動 アシュリーには2つの指示状態がある • Tight(そばにいろ) • 敵から逃げるときなど • Loose(離れろ) • 戦闘中に安全な場所に待機させるときなど アシュリーはプレイヤーの指示によって2つの状態を切り替えます。 ひとつは敵から逃げるときなど、プレイヤーの近くにいてもらう「Tight」、もうひとつは逆に敵と戦うときなど、 62 間を空けて安全を確保してもらう「Loose」です。 この2つの状態ごとに移動行動も切り替わります。 ©CAPCOM 62
Tightのとき Tightでは、プレイヤーにしっかりついていけばよい • プレイヤー周辺の目的地候補から最近傍の位置を選択して最短経路で移動 • ただし、プレイヤーの移動や攻撃の邪魔にならないよう、前方周辺は避ける N P まずは「Tight」についてです。 こちらはシンプルに、プレイヤーの周辺を目的地としてまっすぐ向かってきます。 63 ただし、プレイヤーの前方は移動や攻撃の妨げになる恐れがあるため、その方向を避けて自分に近い位置を目指します。 ©CAPCOM 63
Looseのとき Looseでは、なるべく安全な位置へ、安全な経路で移動する • 「安全な位置」とは • プレイヤーに近すぎてはいけない:敵との戦闘に巻き込まれる • プレイヤーから遠すぎてもいけない:助けが間に合わない • 敵からも離れたい:近いと連れ去られるリスクが大きい • 「安全な経路」とは • 敵に近づいてはいけない: なるべく敵を避けながら移動してほしい • 絶えず状況の変化する中、安全な位置取りを 細かく調整する必要がある E E P N E 続いて「Loose」についてです。 近づく方はプレイヤーに向かえばよかったのですが、離れる方には距離や方向など、 選択肢が無数にあるため、判断が必要となります。 64 プレイヤーが望むのは、「安全な位置にいてほしい」ということです。 ここでの「安全な位置」を、「プレイヤーから近すぎず遠すぎず、敵からも距離を置いた位置」と定めます。 戦闘の邪魔にならず、すぐに助けに行ける、リスクの少ない位置です。 位置が決まっても、そこへたどり着くのに 敵の真っ只中を通ってしまっては安全とは言えません。 ©CAPCOM 64
Looseのとき Looseでは、なるべく安全な位置へ、安全な経路で移動する • 「安全な位置」とは • プレイヤーに近すぎてはいけない:敵との戦闘に巻き込まれる • プレイヤーから遠すぎてもいけない:助けが間に合わない • 敵からも離れたい:近いと連れ去られるリスクが大きい • 「安全な経路」とは • 敵に近づいてはいけない: なるべく敵を避けながら移動してほしい • 絶えず状況の変化する中、安全な位置取りを 細かく調整する必要がある E E P N E 自らの意思で危険を回避しているように思わせられる経路が必要です。 プレイヤーも敵も絶え間なく位置が変わる中で、そのような判断を常におこない移動する必要があります。 ©CAPCOM 65 65
Looseのとき 静的に作られたAIMapではきめ細かい移動調整が難しい • きめ細かい空間情報を持つにはノードが多くなり、処理負荷やメモリを圧迫… • 動的に変化する情報を持たせる必要がある アシュリーは近距離(プレイヤー周辺)しか移動しない(※) • ステージ全域の情報は不要 そこで… (※各ステージ固有の行動時を除く) 「安全な位置」を探すには、1m単位でのきめ細かい空間情報が必要になってきます。 これを静的なAIMapとしてステージ全域で作成すると、無視できないレベルの処理負荷とメモリ使用量が求められます。 66 また、プレイヤーや敵の位置関係によって常に状況が変化するため、静的な地形情報だけでなく動的な情報が必要になります。 これを解決するための手段を考えるにあたり、アシュリーの移動はプレイヤー周辺というごく狭い範囲に限られる、 という点に着目しました。 ©CAPCOM 66
アシュリー専用グリッド位置情報 グリッド状の空間情報をアシュリー周辺に動的に生成することに • 自動生成される静的ナビメッシュと比較して、ポイントが密で精細 • これをタイトル側で実装し、静的なナビメッシュの情報と組み合わせて使用する ※視認性向上のため ゲーム画面を加工しています そこで取った手段が、「グリッド状に細かく配置したポイントをアシュリーの周りに動的生成する」というものでした。 配置されるポイントは密ですが、範囲が限定的なため、処理負荷やメモリ消費は抑えられ、 動的生成なので人が手で配置するコストもかかりません。 67 これをタイトル側で実装し、ステージに配置されている静的なナビメッシュ情報と組み合わせて使用します。 ©CAPCOM 67
安全な位置取り ステップ1:グリッドの枝刈り • グリッドをナビメッシュの上に重ね、メッシュが存在しない or 進入できない (=到達できない)ポイントを削除 ステップ2:目的地の選択 • 各ポイントごとに、「プレイヤーとの距離」「敵との距離」から算出される 「安全度」を設定 ステップ3:経路の探索 • 敵の周辺は移動コストを高く設定し、迂回するように経路を探索 • 探索にはA*アルゴリズムを使用 これを踏まえた、アシュリーの移動行動はこのような手順になります。 まず、グリッドと範囲内のナビメッシュを重ね合わせ、ナビメッシュからは外れているポイント、 および進入できないノードと重なっているポイントを削除します。 これで、ナビメッシュの形状に沿ってグリッドが配置されているような形になります。 68 次に、進むべき目的地を探します。 各ポイントごとに、プレイヤーとの距離や敵との距離から算出した「安全度」を設定し、 もっとも高いところを目的地に設定します。 ©CAPCOM 68
安全な位置取り ステップ1:グリッドの枝刈り • グリッドをナビメッシュの上に重ね、メッシュが存在しない or 進入できない (=到達できない)ポイントを削除 ステップ2:目的地の選択 • 各ポイントごとに、「プレイヤーとの距離」「敵との距離」から算出される 「安全度」を設定 ステップ3:経路の探索 • 敵の周辺は移動コストを高く設定し、迂回するように経路を探索 • 探索にはA*アルゴリズムを使用 最後に、目的地へ進むための経路を探索します。 探索アルゴリズムにはA*を用いていますが、このアルゴリズムではノードにコストを設定し、選択優先を下げることができます。 69 敵がいる付近のポイントは移動コストを高くすることで、敵からなるべく距離を取りながら目的地への経路を探索できます。 ©CAPCOM 69
安全な位置取り では、実際に動画で見てみましょう。 プレイヤーが移動すると、それに合わせてグリッドの範囲も追従していることが分かります。 進入できない箇所にはグリッドも生成されていません。 70 敵がいます。敵の前を通ってみます。 敵に発見されました。 画面にいくつかのデバッグ情報が表示されていますが、アシュリー自身やプレイヤーとの距離から安全度のスコアが数値化され、 移動候補がここから選択されています。 ©CAPCOM 70
安全な位置取り プレイヤーが近づくと、距離を取るために新たな候補地を探しています。 グリッドに上に表示されている色のついた三角形は、なるべく避けて通るよう、属性が設定されているポイントです。 71 プレイヤーが銃を構えると、属性情報が変化しました。 射線上は危険なため、すぐにその場を離れようとしています。 このように、仲間が自ら判断して移動しているんだな、とプレイヤーに認識させています。 ©CAPCOM 71
処理負荷・メモリ負荷対策 (BIOHAZARD RE:4) 仲間キャラクターの説明は以上となります。 続いて、処理負荷、メモリ負荷の対策について、こちらも『BIOHAZARD RE:4』の事例をご紹介します。 ©CAPCOM 72 72
処理負荷・メモリ負荷の主な要因 経路探索の処理が重くなる主な要因は「探索されるノード数」 • 目的地が遠くなれば必然的に探索されるノード数は増える • 地形が複雑になるほどノードの密度が増す ノード数が増えればメモリ使用量も増える • 元のAIMapデータからもなるべくノード数は減らしておきたい 前提として、RE ENGINEのNavigationシステムに限らず、 一般的に経路探索の処理負荷は探索されるノード数に大きく影響されます。 目的地を遠くに設定すれば、探索する経路が長くなり、それだけ多くのノードを探索する必要が出てきます。 73 また、人工的な建物など、平坦な地形であればシンプルな形状のAIMapで表現できますが、 自然地形のような複雑さを持った地形はAIMapも密になり、短い経路でもそれだけノード数は増えることになります。 ノード数はメモリ使用量にも影響するため、探索時だけでなく、AIMapデータ自体のノード数を削減しておくことも重要です。 ©CAPCOM 73
階層的なAIMapによる探索ノード数抑制 遠距離探索用のAIMapと近距離探索用のAIMapで粒度を分ける • 遠距離へは比較的粒度の粗いAIMapで探索し、中間通過点を得る • 通過点間の移動(近距離)では粒度の細かいAIMapで探索 『BIOHAZARD RE:4』での実例 • 遠距離用のWaypointと近距離用のNavMeshの併用 • 迂回路の選択目的の他に、処理負荷を抑える効果も 先ほどの敵キャラクターの説明の中で、WaypointとNavMesh、2つのAIMapを階層的に使用しているというお話がありました。 ノード数が多くなりがちな長距離での探索は、その分粗いAIMapで探索をおこない、大まかな通過点を決定してから、 74 その点ごとに詳細な探索をおこないます。 こうすることで、経路のバリエーションを実現するとともに、探索ノード数をコントロールする効果もあります。 ©CAPCOM 74
無駄なノードの自動除去 コリジョンからナビメッシュを自動生成する都合上、意図せず キャラクターが進入しない箇所にノードが生成されることがある 主な原因 • コリジョンの削除忘れ • 遠景の画作りのため、コリジョンが付与されたアセットが配置される 細かくコリジョンの整形をすれば削減できるが時間がかかる… 何か一括で除去できる方法はないか… また、直接AIMapのノード数が増える要因として、使用していないノードが生成されてしまう問題がありました。 システム実装当時は、あらかじめNavigationに関わるコリジョンを整形してからAIMapを生成する想定でしたが、 75 昨今のステージの大規模化やより高速なワークフローの変化に伴い、手作業でコリジョンを整形することが難しくなってきました。 結果として、本作の開発では、後処理で自動的にノードを削減する手法が求められました。 ©CAPCOM 75
無駄なノードの自動除去 孤立したノードを検出して一括除去する機能をRE ENGINEに実装 • 指定した座標を基準点とし、そこからどのような経路でも たどり着けないノードを「孤立」とみなす • 孤立したノードはたどり着けないので不要なはず…なので除去する • AIMapのビルド時に指定しておくことで自動的に除去されるように 『BIOHAZARD RE:4』の あるステージでは 約50%の削減効果を実証 提案された手法は、「どこからも進入できない孤立したノードは不要とみなして削除する」というものでした。 ノードは接続情報を持っているため、それをたどれば到達できないノードは検出することができます。 76 スタート地点やスポーン地点などを基準とし、 そこから孤立したノードを自動的に削除する機能をAIMapの生成フローに導入しました。 本作で適用したところ、あるステージでは約50%という大きな削減効果が得られました。 この機能はRE ENGINEの標準機能として、他タイトルへも提供されています。 ©CAPCOM 76
開発支援 (BIOHAZARD RE:4 / EXOPRIMAL) 最後に開発支援に関する事例をご紹介します。 77 ©CAPCOM 77
ナビメッシュ画像化(MapVisualizer) ナビメッシュを元に、進入可能範囲を画像化するRE ENGINE機能 • エディター上でもメッシュの表示はしているが、 他の描画物の情報量が多く、地形だけの情報を見るのは意外と手間 • 輪郭だけを描画して視認性を担保できる まず、MapVisualizerと呼ばれるナビメッシュの画像化のご紹介です。 シーンの進入可能範囲を知りたいとき、ナビメッシュのデータを表示することはできますが、 余計な情報量も多く、欲しい情報を得るには案外手間がかかります。 78 そこで、直接ナビメッシュデータから進入可能範囲を画像化することで、 シンプルな輪郭情報を得られるようにしました。 ©CAPCOM 78
ナビメッシュ画像化(MapVisualizer) 『BIOHAZARD RE:4』での主な活用事例 • 意図せず生成されているノードの検出 • コリジョンの消し忘れ等で、思わぬところにノードが出来ることがある • レベルの更新部分の確認 • 定期的に同じ範囲、同じ解像度で出力することで、 画像の差分を取れる(画像参照) • マップUIの作成補助 • 手作業でゼロから作るよりも大幅に労力を削減できる 差分比較結果(例) 『BIOHAZARD RE:4』ではこの機能で以下のような結果を得ることができました。 まず、意図していないノードの検出です。 79 想定よりもかなり多くのノードが残っていることが分かり、先ほどのノードの自動除去の提案につながりました。 次に、レベルの更新部分の確認です。 レベルの更新箇所を言葉で説明することは難しく、変化に気づかないこともありますが、 画像比較によって正確に知ることができます。 画像出力設定を固定できる本機能ならではの活用方法です。 最後に、マップUIの作成補助です。 マップ作成はシーンを目で見てコピーするような作業になりがちでしたが、 正確なデータがあることで省力化や正確性の向上につながりました。 ©CAPCOM 79
経路探索履歴のテレメトリ 経路探索の失敗(目的地まで到達できない)は処理負荷の原因に なりうるため、可能な限り減らしておきたい • 到達可能経路が見つかるまで様々なノードを探索してしまうため P E 続いて、『EXOPRIMAL』より、テレメトリの事例を2つご紹介します。 まずは経路探索履歴のテレメトリです。 80 到達できない目的地に向かって経路探索をおこなうと、あらゆる経路を探索しようとします。 結果、探索ノード数が膨大になり処理負荷の原因になるため、失敗は極力なくす必要があります。 ©CAPCOM 80
経路探索履歴のテレメトリ 『EXOPRIMAL』では、キャラクターが実行した 経路探索の全履歴を保存 • いつ、誰が、どこから、どこまでを経路探索したか 失敗した履歴をヒートマップ化 • 通行属性の設定忘れや、ExtraLinkの設置忘れ等を 検出し修正に役立てる 本作では、キャラクターが実行した経路探索結果の履歴をすべて保存し、ヒートマップとして可視化しました。 多く失敗している箇所は、何かAIMapに不具合があるか、目的地の設定が誤っている可能性があるため、 その点に絞って調査することで問題を発見しやすくなります。 ©CAPCOM 81 81
足跡履歴のテレメトリ 経路探索で得られた経路が必ずしも正しいとは限らない キャラクターサイズより 細い通路を通ろうとしてしまう 経路の途中で床から はみ出し落下してしまう 不自然に迂回した経路を 選択してしまう 続いて、移動経路の履歴、つまり足跡履歴のテレメトリです。 経路探索自体は正常に完了していても、返された経路通りに進行したにも関わらず問題が出てしまうことがあります。 82 例えば、キャラクターのコリジョンより細い通路が選択されてしまうケース。 経路進行中に床から落下してしまうケース。 一見すると近道できそうなのに不自然に迂回してしまうケースなどです。 これらは、AIMap生成時の設定をきちんとしていれば回避はできますが、気づかれずに混入してしまうことはあります。 ©CAPCOM 82
足跡履歴のテレメトリ 『EXOPRIMAL』では、キャラクターの移動した座標の履歴を保存 • キャラクターが不自然に停滞している箇所や、意図しない経路を辿っている 箇所をピックアップし、何が起きているのかを確認する • 道幅が狭いところは広くする • 落下してしまう箇所には 壁のコリジョンを設置 これらの現象がたまたまプレイヤーのカメラに映れば気づくことはできますが、 人知れず問題が発生してしまうこともあるため、本作では移動経路も履歴を保存し可視化しました。 足跡を見ることによって、本来通ってほしい箇所を全然通っていなかったり、 ずっと同じ箇所に停滞している、といった問題に気づきやすくなります。 83 狭い道は幅を広げたり、キャラクターが曲がりきれず落下してしまうような箇所には壁を置いたりと、 対処をおこない問題を修正しました。 これらのテレメトリ情報はCIによって日々蓄積され、Navigationに関する問題を解決するために大いに役立ちました。 ©CAPCOM 83
まとめ キャラクターの移動ではRE ENGINE標準のNavigation機能と タイトル独自のシステムを組み合わせて利用することで 様々な要件・個性に対応した移動行動を実現している 目的地まで最短で移動させるだけでなく、迂回や待機行動に工夫を凝らし、 ゲームプレイの幅をより豊かにしている 処理負荷・メモリ負荷削減のため、データの削減の自動化や実行処理の見直しをおこない、 その分のリソースでより高度なゲームの表現を実現している ミスを早期発見できるよう、自動実行・自動検出の仕組みを用意し製品の品質向上に役立てている 最後にまとめです。 キャラクターの移動は、RE ENGINE標準のNavigation機能にタイトルのシステムを組み合わせ、 様々な要件や個性に対応した移動行動を実現しています。 Navigationはそのまま使えば最短経路を返すだけですが、工夫を凝らすことでその他の行動も実現でき、 ゲームプレイの幅をより豊かにしています。 84 処理負荷、メモリ負荷には常に気を配り、データの削減や実行時の処理を見直すことで、 その分のリソースをよりゲームの本質部分に使うことができます。 開発が大規模化すればミスは当然出てきますが、早期発見できるよう、自動化の仕組みを構築し製品品質を向上しています。 本講演は以上となります。 これを機に、キャラクターナビゲーションにご興味を持っていただければ幸いです。 ©CAPCOM 84