Help us understand the problem. What is going on with this article?

[UE4] CrowdManagerによる群衆の制御

1. はじめに

[検証バージョン:4.22.0]
 CrowdManagerはEngineが提供するAI/Navigation機能の1つです。この機能についてはドキュメント等で説明されていないため、ここで少し内容を掘り下げています。この機能は多くのエージェント(AIで動作するキャラクター)を管理する際に有用です。
 以下のGifはCrowd機能のイントロダクションとして利用していないケースと利用したケースを比較したものです。各エージェントはNavmesh上を無作為に移動するような振る舞いをしています。Crowd機能なしの場合はエージェント同士が衝突し互いの移動を阻害しています。Crowd機能ありの場合はエージェント同士が自律して巡回を行い、回避するようなパスを計算して動作します。

Crowd機能なし
CrowdOff.gif

Crowd機能あり
CrowdOn.gif

2. 概要

2019-04-12_20h02_16.png
 CrowdManagerの概要は最初に説明した通りですが、多くのエージェントを制御するのに適した機能です。エージェント同士の回避動作を制御するため、Playerに対しては適用されません。また、CharacterMovementComponentには衝突回避機能としてRVO(Reciprocal Velocity Obstacles)を備えていますが、精度や負荷においてはCrowdを利用した方が若干優れています(設定にも依存します)。

3. 構成

2019-04-14_01h17_24.png
 CrowdManagerとその関連クラスについて示したものが上記となります。それぞれのクラスの役割については以下の通りです。

DetourCrowdAIController
Crowd機能をサポートするCrowdFollowingComponentを所有したAIControllerの継承クラスです。このControllerを所有するPawnはCrowdManagerによる迂回機能を利用することができます。

CrowdFollowingComponent
Crowd機能をサポートするComponentです。このComponentをControllerとして持つPawnはCrowd対象のエージェントとして登録され、CrowdManagerによって迂回機能を管理されます。

CrowdManager
Engine側でCrowdを管理するクラスです。NavigationSystemやDetorと連動して迂回パスを提供したり、エージェント同士のやりとりを管理します。

Detor(dtCrowd)
実際にCrowdを制御するための巡回パスなどを計算する実装クラスです。このモジュールはRecast機能を使用することを前提とした機能です。

NavigationSystem
CrowdManagerクラスを管理するためのNavigation機能を提供するクラスです。CrowdManagerの生成、破棄や、パス情報の提供を担います。

4. 使い方

2019-04-12_20h02_36.png
 Crowd機能を利用するためのシンプルな設定方法は、PawnのAIControllerにDetourCrowdAIControllerを設定するだけです。もし独自のAIControllerにCrowd機能を持たせる場合は、CrowdFollowingComponentを継承したComponentをAIControllerのConstructerでDefaultSubObjectとして設定するだけです。また、CrowdFollowingComponentにはMovementComponentと連動するため、PawnにはCharacterMovementComponentを設定しておきます。

MyAIController.cpp
#include "MyAIController.h"
#include "Navigation/CrowdFollowingComponent.h"
#include "MyCrowdFollowingComponent.h"

AMyAIController::AMyAIController(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer.SetDefaultSubobjectClass<UMyCrowdFollowingComponent>(TEXT("PathFollowingComponent")))
{

}

 この設定によりCrowdManagerに対象のエージェントが登録されて、Crowd機能で動作するようになります。

5. 設定

2019-04-13_23h23_57.png

 Crowd機能に関してはProjectSettingsから設定を行うことができます。独自のCrowdManagerクラスを設定したり、Crowd機能が提供する迂回機能のパラメータを調整する場合はここから設定します。

Project Settings詳細

Engine - Navigation System

項目 説明
Crowd Manager Class 独自のCrowdManagerクラスを設定

Engine - Crowd Manager

項目 説明
Avoidance Config 障害回避パラメータ
(ECrowdAvoidanceQuality毎)
Velocity Bias 速度バイアス
Desired Velocity Weight 希望の速度へのスケール
Current Velocity Weight 現在の速度へのスケール
Side Bias Weight サイドバイアスへのスケール
Impact Time Weight サイドペナルティへのスケール
Impact Time Range 衝突時間ペナルティへのスケール
Custom Pattern Idx サンプリングパターン配列のインデックス
Adaptive Divisions サンプリングにおけるリングあたりの分割数
Adaptive Rings サンプリングにおけるリング数
Adaptive Depth サンプリングにおける最高速度での反復回数
Sampling Patterns 障害回避サンプリング設定
Angle サンプリングパターン角度(Deg)
Radii サンプリングパターン半径
Max Agents 管理可能なエージェント数の上限
Max Agent Radius 管理可能なエージェントの半径上限
Max Avoided Agents 速度回避のための隣接エージェントの最大数
Max Avoided Walls 速度回避のための壁セグメントの最大数
Navmesh Check Interval NavMeshから離れた時のポーリング間隔(s)
Path Optimization Interval エージェントパス最適化間隔(s)
Separation Dir Clamp 隣接エージェントとの分離力強度
Path Offset Radius Multiplier コーナーパス補正用エージェント半径乗数
Resolve Collisions エージェント間コリジョンをCrowdで解決するか

これらのパラメータは以下のリンクでも説明されています。
[Answer Hub] Crowd Manager Avoidance Config

6. デバッグ

2019-04-12_20h03_00.png
 CrowdManagerを始めとしたAI関連の機能はVisual Loggerからデバッグすることができます。Visual Loggerはメニューの[Window]->[Developer Tools]->[Visual Logger]から開きます。Visual LoggerからPIEなどで実行した動作をレコードし、その時のCrowdのパス検索情報などをデバッグすることができます。

7. まとめ

 CrowdManagerに関するAI機能について簡単に紹介してきましたが、ドキュメントで紹介されていない機能が他にもたくさん存在していきます。これらの機能を適切な箇所で利用することで、より効率的にコンテンツを制作できることに繋がるため、今後も紹介してきたいと思います。

EGJ-Ken_Kuwano
※免責事項※ 可能な限り正確な情報を掲載するよう努めていますが、必ずしも正確性を保証するものではありません。掲載された内容によって生じた直接的、間接的な損害に対し、一切の責任を負いかねますので、ご了承ください。
epicgamesjapan
Unreal Engine の提供、開発サポートを行っています。
https://www.unrealengine.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした