Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

初心者がEQSやってみた

952 views

Published on

https://ue4study-osaka.connpass.com/event/93325/
での講演資料です。

Published in: Engineering
  • Be the first to comment

初心者がEQSやってみた

  1. 1. 初心者がEQSやってみた
  2. 2. 目次 ●自己紹介 ●EQSって? ●Item ●Context ●Generator 〇ActorOfClass 〇Circle 〇Donut 〇Grid ●Test 〇Distance 〇Dot 〇Pathfinding 〇Trace ●EQSの実行方法 〇ビヘイビアツリーで 〇ブループリントで ●EQSにパラメータを渡す ●実演 〇敵探索 〇標的周りを円運動 〇標的に攻撃可能な位置に移動 ●参考資料 ●まとめ
  3. 3. 自己紹介 ●HN:goolee ●Twitter:goolee07 ●社会人1年目ゲームプログラマー ●UE4歴 3年くらい
  4. 4. EQSって? レベル上から情報を収集し、Item(位置情報やアクタの情報)を生成、 それらにTest(複数の条件式を与えスコアを計算する)を行い、 一番欲しい情報を取得するシステム
  5. 5. EQSって? 日常生活でよくやっていることじゃん!
  6. 6. EQSって? 徒歩 5分 品揃えが好み じゃない 徒歩 7分 品揃え好み コンビニ行きたいなぁ アイテム テスト テスト
  7. 7. Item レベル上の位置情報やアクタの情報 テストの結果のスコアを保持する EQSTestingPawnクラスを継承したブループリントでデバッグ表示可能
  8. 8. Generator レベルから情報を読み取り、Itemを生成するもの 今日話す 〇ActorOfClass 〇Circle 〇Donut 〇Grid 今日話さない 〇Composite 〇CurrentLocation 〇Cone 〇PathingGrid
  9. 9. Context ●Generator アイテム生成の基準となるなにか ●Test スコア計算の基準となるなにか Context はアクターとして扱える デフォルトで用意されているもの 〇EnvQueryContext_Item Generatorで生成されたアイテム 〇EnvQueryContext_Querier EQSを実行しているPawn EnvQueryContext_BlueprintBaseクラスを継承して作成が可能
  10. 10. Generator - ActorOfClass - 指定範囲内のアクタ情報のアイテムを生成する
  11. 11. Generator - ActorOfClass - ●SearchedActor Class 検索するアクタのクラスを指定 デフォルトではActor
  12. 12. Generator - ActorOfClass - ●Generate Only Actors in Radius 有効になっていないと、レベル上の指定した アクタすべてを検索する
  13. 13. Generator - ActorOfClass - ●Search Radius 対象アクタを検索する範囲
  14. 14. Generator - ActorOfClass - ●Search Center 検索の中心となるコンテキスト デフォルトではQuerier
  15. 15. Generator - Circle - 指定半径の円上に位置情報のアイテムを生成する
  16. 16. Generator - Circle - ●Circle Radius 中心からの円の半径
  17. 17. Generator - Circle - ●Circle Center 円の中心となるコンテキスト
  18. 18. Generator - Circle - 〇Point On Circle Spacing Method ●Space Between 指定間隔でアイテムを生成 ●Number Of Points 円上の指定個数のアイテムを生成
  19. 19. Generator - Circle - 〇ArcDirection チェックを入れるかArcAngleを360から変更すると 自動で有効になる 円ではなく扇形になり、弧上にアイテムを生成する
  20. 20. Generator - Circle - ●ArcDirection ○Rotation 指定したコンテキストの向きに扇形を生成 〇Two Points 指定したベクトル方向に扇形を生成
  21. 21. Generator - Donut - 複数円上に位置情報のアイテムを生成する
  22. 22. Generator - Donut - ●Inner Radius 内側の円の半径
  23. 23. Generator - Donut - ●Outer Radius 外側の円の半径
  24. 24. Generator - Donut - ●Number Of Rings 生成する円の数
  25. 25. Generator - Donut - ●Points Per Ring 各円上に生成するアイテムの数
  26. 26. Generator - Donut - ●Use Spiral Pattern 有効にすると生成されたアイテムが らせん状に配置される
  27. 27. Generator - Donut - ●Center 円の中心となるコンテキスト
  28. 28. Generator - Grid - 格子状に位置情報のアイテムを生成する
  29. 29. Generator - Grid - ● GridHalfSize 生成する格子の半分の高さと幅
  30. 30. Generator - Grid - ● Space Between アイテム間の距離
  31. 31. Generator - Grid - ● GenerateAround 格子の中心となるコンテキスト
  32. 32. Generator - Circle - ○TraceData CircleCenterの高さのXY方向にトレースを行い、アイテムの 生成位置を変更する。 ●None 障害物を検出しない 障害物内部にアイテムがめり込む
  33. 33. Generator - Circle - ○TraceData XY方向にトレースを行い、アイテムの生成位置を変更する。 ●Navigation NavMeshをもとに障害物を検出する NavMeshのエッジ上に生成される
  34. 34. Generator - Circle - ○TraceData XY方向にトレースを行い、アイテムの生成位置を変更する。 ●Geometry 地形をもとに障害物を検出 地形にヒットした位置にアイテムを生成
  35. 35. Generator - Circle - ●ProjectionData Z方向にトレースした際にヒットした地形にアイテムを生成 〇None:トレースをしない
  36. 36. Generator - Circle - ●ProjectionData Z方向にトレースした際にヒットした地点にアイテムを生成 〇Navigation ヒットした地点にNavMeshがあれば NavMeshにそって生成
  37. 37. Generator - Circle - ●ProjectionData Z方向にトレースした際にヒットした地点にアイテムを生成 〇Geometry ヒットした地点に生成 地形に沿った位置にアイテムが生成される
  38. 38. Test スコアを計算するための条件 今日話す 〇Distance 〇Dot 〇Pathfinding 〇Trace 今日話さない 〇GameplayTags 〇Oveerlap 〇Pathfinding Batch 〇Project
  39. 39. Test ●TestPurpose 〇Filter 条件に当てはまらないアイテムはスコアの計算対象から除外 別のテストでも計算されなくなる 〇Score 全アイテムのスコアを計算 〇FilterAndScore 条件に当てはまるアイテムのみスコアを計算 あてはまらないものは計算対象から除外
  40. 40. Test - distance - アイテムから対象までの距離でスコアを計算する
  41. 41. Test - distance - 〇TestMode ●Distance3D 3次元座標上での距離をチェック ●Distance2D XY平面上での距離をチェック ●Distance Z 高さでの距離をチェック ●Distance Z (Absolute) 単純な高さで距離をチェック
  42. 42. Test - distance - ●DistanceTo 距離の測定に使用するコンテキスト
  43. 43. Test – dot - 2つのベクトルの内積でスコアを計算
  44. 44. Test – dot - ベクトルは2通りの設定方法がある 〇Mode:Rotation Rotationで指定したコンテキストが 向いている方向 ●Rotation: ベクトルの起点となる コンテキスト
  45. 45. Test – dot - ベクトルは2通りの設定方法がある 〇Mode:TwoPoints 起点から終点へのベクトル ●LineFrom: ベクトルの起点となる コンテキスト ●LineTo: ベクトルの終点となる コンテキスト
  46. 46. Test – dot - 〇TestMode ●Dot(3D) 三次元座標での内積 ●Dot2D XY平面上での内積
  47. 47. Test – dot - 〇AbsoluteValue 有効にすると 左右、上下それぞれのスコアが同じ値になります。
  48. 48. Test – pathfinding - アイテムまで到達可能か判定
  49. 49. Test – pathfinding - ●Context ここで指定したコンテキストまでのパスがあるかを判断する ●Path from Context アイテムからコンテキストではなく コンテキストからアイテムへのパス探索に切り替わる
  50. 50. Test - Trace - アイテムとの間に障害物があるか判定
  51. 51. Test – trace - ●Trace from Context チェックを入れると、 指定したコンテキストから Itemへとトレース方向が逆になる
  52. 52. Test – Trace - ●Boolの一致 〇True アイテムとの間に障害物あり、スコア計算対象から除外 〇False 障害物なし
  53. 53. EQSの作成 [エディタの環境設定] ⇒ [実験段階] Environment Quering System のチェックを有効に
  54. 54. EQSの作成 [右クリック] ⇒ [AI] ⇒ [環境クエリ]で作成できる
  55. 55. EQSの実行 2通りの方法 〇ビヘイビアツリーで実行 〇Blueprintで実行
  56. 56. EQSの実行 – ビヘイビアツリー - ●BlackBoardKey EQSの結果の保存先 ●QueryTemplate 実行するEQS ●RunMode アイテムを選択する方法
  57. 57. EQSの実行 – ブループリント- ●QueryTemplate 実行するEQS ●Querier EQSを実行するコンテキスト ●RunMode アイテムを選択する方法
  58. 58. EQSの実行 - Run EQSQueryノード - ●アイテムを取得するには OnQueryFinishedを割り当てる
  59. 59. EQSの実行 ●RunMode アイテムを取得する方法 〇SingleBestItem スコアが最大のもの 〇SingleRandomItemForBest5% スコアが大きい5%の中からランダムに一つ 〇SingleRandomItemForBest25% スコアが大きい25%の中からランダムに1つ 〇AllMatching スコアの計算されたものすべて
  60. 60. EQSの実行 - Run EQSQueryノード - ●QueryInhstanceピンから2つの関数が取得できる GetResultsAsActors と GetResultsAsLocations それぞれの配列のインデックス0がEQSの実行結果
  61. 61. EQSの実行 - Run EQSQueryノード - ●スコアを取得したい場合 QueryInstanceピンから GetItemScore関数で取得可能
  62. 62. EQSにパラメータを渡す ●DataBinding QueryParams に設定 〇ParamName パラメータ名
  63. 63. EQSにパラメータを渡す ●ビヘイビアツリーで渡す場合 RunEQSQueryのQueryConfigに 設定したパラメータが追加されている 〇BBKey 設定するとブラックボードの値が パラメータとして渡される
  64. 64. EQSにパラメータを渡す ●ブループリントで渡す場合 RunEQSQueryノードのReturnValueからSetNamedParamノード 〇ParamName EQSに設定したパラメータ名 〇Value 渡す値
  65. 65. 実演
  66. 66. 実演 – 敵探索のEQS - ●行うことは? 〇自分を中心とした探索 〇指定したアクタを探索 〇一定距離以内のアクタを探索対象 〇一番近い距離のアクタを選択
  67. 67. 実演 – 敵探索のEQS - 〇自分を中心とした敵探索 Generator [ActorOfClass] を使用 Search Center は Querier
  68. 68. 実演 – 敵探索のEQS - 〇指定したアクタを探索 Searched Actor Class に探索するアクタを指定
  69. 69. 実演 – 敵探索のEQS - 〇一定距離以内のアクタを探索対象 Search Radius を探索する距離に変更
  70. 70. 実演 – 敵探索のEQS - 〇一番近い距離のアクタを選択 Test [Distance] を追加 TestPurposeを Score Onlyに
  71. 71. 実演 – 敵探索のEQS - 〇一番近い距離のアクタを選択 Scoring Equation を Inverse Linearに 近いアイテムのスコアを高くする
  72. 72. 実演 – 標的周りを円運動 - ●行うことは? 〇対象を中心とした複数円を生成 〇自身から一番近い円上の点 〇自身から対象へのベクトルに垂直方向の円上の点 〇自身の移動方向の円上の点 〇自身から一定距離離れた円上の点 〇自身の目標地点から一定距離離れた円上の点 〇各条件の重みを調整
  73. 73. 実演 – 標的周りを円運動 - 〇対象を中心とした複数円を生成 Generator [ActorOfClass] を使用 Search Center は対象のコンテキスト
  74. 74. 実演 – 標的周りを円運動 - 〇対象を中心とした複数円を生成 Inner Radius は対象に一番近づく距離 Outer Radius は対象から一番離れる距離を設定
  75. 75. 実演 – 標的周りを円運動 - 〇対象を中心とした複数円を生成 最小円、最大円含めた円をいくつ生成するか設定 各円にいくつアイテムを生成するか設定
  76. 76. 実演 – 標的周りを円運動 - 〇対象を中心とした複数円を生成 生成したアイテムをらせん状に配置
  77. 77. 実演 – 標的周りを円運動 - 〇自身から一番近い円上の点 Test [Distance] を追加 TestPurposeを Score Onlyに
  78. 78. 実演 – 標的周りを円運動 - 〇自身から一番近い円上の点 Scoring Equation を Inverse Linearに 近いアイテムのスコアを高くする
  79. 79. 実演 – 標的周りを円運動 - 〇自身から対象へのベクトルに垂直方向の円上の点 Test [Dot] を追加 TestPurposeを Score Onlyに
  80. 80. 実演 – 標的周りを円運動 - 〇自身から対象へのベクトルに垂直方向の円上の点 LineAをTowPointsに設定 LineFromを自身のコンテキスト LineToを対象のコンテキストに設定
  81. 81. 実演 – 標的周りを円運動 - 〇自身から対象へのベクトルに垂直方向の円上の点 LineBをTowPointsに設定 LineFromを自身に LineToを生成したItemに設定
  82. 82. 実演 – 標的周りを円運動 - 〇自身から対象へのベクトルに垂直方向の円上の点 Scoring Equation を Inverse Linearに 横、後ろ方向のアイテムのスコアを高くする
  83. 83. 実演 – 標的周りを円運動 - 〇自身の移動方向の円上の点 Test [Dot] を追加 TestPurposeを Score Onlyに
  84. 84. 実演 – 標的周りを円運動 - 〇自身の移動方向の円上の点 LineAをTowPointsに設定 LineFromを自身のコンテキスト LineToを目標地点のコンテキストに設定
  85. 85. 実演 – 標的周りを円運動 - 〇自身の移動方向の円上の点 LineBをTowPointsに設定 LineFromを自身に LineToを生成したItemに設定
  86. 86. 実演 – 標的周りを円運動 - 〇自身から一定距離離れた円上の点 Test [Distance] を追加 TestPurposeを Filter Onlyに
  87. 87. 実演 – 標的周りを円運動 - 〇自身から一定距離離れた円上の点 DistanceTo を自身のコンテキストに設定
  88. 88. 実演 – 標的周りを円運動 - 〇自身から一定距離離れた円上の点 FilterTypeをMinimum に FloatValue Minで距離を指定
  89. 89. 実演 – 標的周りを円運動 - 〇自身の目標地点から一定距離離れた円上の点 Test [Distance] を追加 TestPurposeを Filter Onlyに
  90. 90. 実演 – 標的周りを円運動 - 〇自身の目標地点から一定距離離れた円上の点 DistanceTo を目標地点の コンテキストに設定
  91. 91. 実演 – 標的周りを円運動 - 〇自身の目標地点から一定距離離れた円上の点 FilterTypeをMinimum に FloatValue Minで距離を指定
  92. 92. 実演 – 標的周りを円運動 - 〇各条件の重みを調整 Scoring Factor でスコアの重みを変更 自身に近い距離のアイテムを4 進行方向のアイテムを2 に設定
  93. 93. 実演 –対象に攻撃可能な位置に移動- ●行うことは? 〇対象を中心とした円を計算 〇円の半径は攻撃が届く距離 〇自身から一番近い円上の点を選択
  94. 94. 実演 –対象に攻撃可能な位置に移動- 〇対象を中心とした円を計算 Generator [Circle] を使用 Circle Center に 攻撃対象の コンテキストを設定
  95. 95. 実演 –対象に攻撃可能な位置に移動- 〇対象を中心とした円を計算 Points on Cicle Spacing Method を By Number Of Points に設定 NumberOfPoints を 12に
  96. 96. 実演 –対象に攻撃可能な位置に移動- 〇円の半径は攻撃が届く距離 Circle Radius を 攻撃が届く距離に設定
  97. 97. 実演 –対象に攻撃可能な位置に移動- 〇自身から一番近い円上の点を選択 Test [Distance] を追加 TestPurposeを Score Onlyに
  98. 98. 実演 –対象に攻撃可能な位置に移動- 〇自身から一番近い円上の点を選択 Scoring Equation を Inverse Linearに 近いアイテムのスコアを高くする
  99. 99. まとめ EQSについての説明、実演をしてきました しかし、まだまだ情報が少ないのが現状です ぜひEQSをつかって様々な処理を実装してみてください そして知見の共有をお願いします
  100. 100. 参考資料 ●はじめてのAI ~愛のあるAIを作ろう~ https://www.slideshare.net/masahikonakamura50/ai-ai-62023284 ●スクウェア・エニックスにおけるUnrealEngine4を用いた 人口技能技術の開発事例 https://www.youtube.com/watch?v=BV2GTGbSjq8&t=2426s
  101. 101. ご清聴ありがとうございました。

×