ken26uの日記

Blender, Excel, その他ソフトのメモを中心にしています

Unreal Engine 4 UE4学習 25日目 ブループリントを使用した AI の紹介(1/2)

はじめに

  • なにか目的を持って作りたい為UE4を始める
  • UE4一ヶ月でどれくらいのレベルになるのか検証

ブループリントを使用したAIの紹介という教材で勉強

ブループリントを使用した AI の紹介

f:id:ken26u:20200712224428p:plain

プロジェクトと環境を作成する

プロジェクト作成

  • ゲーム
  • サードパーソン f:id:ken26u:20200712224600p:plain

レベル作成

  1. StaticMesh のスケールZ を 2.5 へ。地面に沿うように配置し直す f:id:ken26u:20200712224729p:plain

  2. StaticMesh を Alt + 移動でコピーして図のように合計9つにする f:id:ken26u:20200712224851p:plain

  3. 互いの設置物が重ならない程度に全体を移動させる f:id:ken26u:20200712225005p:plain

  4. ライトがベイクされていて、設置物を動かしたあとでも影が残っている。これから行う事に対して影響はないが気になるのでライトをビルドする f:id:ken26u:20200712225126p:plain

  5. あとはプレイしておかしなところがないか確認する f:id:ken26u:20200712225246p:plain

    • 🤔関係ないですが、カメラにシャッタースピードがあるようで、いい感じにボケて躍動感が演出されてますね。

AIの理論

AI のプロセスは3つの主要なセクションに分けることができる

🤔ここは動画ではなく記事ですね。

基礎

  • 知覚 SENSE
    • AIの現在の状態のスナップショットを取得する為のもの
    • 視覚や触覚のような物理的な感覚を含む
    • または他のAIからブロードキャストされる「目に見えない」情報のようなより抽象的な情報
    • フィルタリングも考慮される。別の感覚に優先度がある場合にある情報を無視するようなもの。
      • 🤔映画 フォーカスでも人間は1つの事を考えてる時に別のこと考えられないと説明しながらスリを教えるシーンが有りましたね
  • 思考 THINK
    • AIについて考えるときは思考について考えがちだが、思考は大きな全体像の一部にすぎない
    • 思考プロセスは知覚によって収集された情報を受け取り、現在の自分が置かれているワールドのビューを作り出す
    • 自身の内的なゴールを使用する事で、思考プロセスは次に情報とゴールを受け取り行動の流れを決定する
  • 行動 ACT
    • 知覚で情報を受け取り思考による決定を受け取ると、行動は何らなの行動を行う
    • 走ったりジャンプのような見えるものから、他のAIとのコミュニケーション、不可視のウェイポイントをドロップしたりといった目に見えないものもある
    • 行動はAIにおける最も目に見えやすい部分
    • 行動が終わるとループバックし知覚セクションを再開する

🤔ABC理論の勉強をしているようです

ループ

  • 行動が発生すると知覚にループバックする。知覚セクション→思考セクション→行動セクションのループを繰り返す
  • AIが有効である場合も上記のループを繰り返す
  • 独立して動作するセクションはなく、相互に依存しながら動作する
  • 情報なしでは決定せず、決定なしだと行動もしない。
    • このように相互依存的に動作するように設計されているためAIは各部分の総和以上のものであるような印象を与える

f:id:ken26u:20200712225330p:plain

AIキャラクターを作成する

  • AIの構築を始める前にAIでコントロールする専用のキャラクターを作成する必要がある
  • さらにそのキャラクターをAIでコントロールする事を明示的に定義する
  • 上記の目的を達成するために、2つの新規BPを作成する
    • プレイヤーキャラクターから記述するキャラクターブループリント
    • AIコントローラーブループリント
  • さらにゲーム開始時にはAIコントローラーはAIキャラクターを所有できるようにする

ThirdPersonのコンポーネントについての解説

  1. ThirdPersonを選択して右クリック、アセットをブラウズしてコンテンツブラウザ上に表示させる f:id:ken26u:20200712225337p:plain

  2. ダブルクリックでBPを開くとイベントグラフが表示される f:id:ken26u:20200712224437p:plain

    • これがプレイヤーの入力の処理に関するもの
  3. ビューポートに移動してコンポーネントの解説 f:id:ken26u:20200712224447p:plain

    • CapsuleComponent はコリジョンを管理している。このおかげで壁をすり抜けたりできなくなっている
    • Mesh はAIキャラクターやマテリアル、アニメーション自体を定義するのに使う
    • CameraBoom(スプリングアーム)とFollowCameraはこのキャラクターを所有した時に連動してプレイヤーの資格をコントロールする
    • CharacterMovement コンポーネント f:id:ken26u:20200712224455p:plain

      • 詳細パネルには歩行、ジャンプ、降下などがある

これでキャラクターを構成する各コンポーネントとAIに関連するコンポーネントがわかりました。これらを頭に入れて既存のアセットをベースに独自のAIキャラクターを作成します

AIキャラクターの作成

  1. ThirdPersonCharacter を右クリック→複製 f:id:ken26u:20200712224505p:plain

  2. 名前を AI_ThirdPersonCharacter にする

  3. AI_ThirdPersonCharacter をダブルクリックしてエディタを開く
  4. 必要のないもの全てを削除する

    1. イベントグラフの全ノードを選択し Delete f:id:ken26u:20200712224513p:plain

    2. BaseLookUpRateとBaseTurnRate変数も選択して削除

    3. CameraBoomコンポーネントとFollowCameraコンポーネントを削除 f:id:ken26u:20200712224521p:plain
  5. F7 でコンパイルし問題が発生しない事を確認

  6. BPを保存しBPエディタを閉じる

AIコントローラーを追加

  1. コンテンツブラウザで新規ブループリントを作成。親クラスは AIController f:id:ken26u:20200712224528p:plain

  2. 名前を AIC_ThirdPersonCharacter とする
    f:id:ken26u:20200712224535p:plain

  3. AI_ThirdPersonCharacter をダブルクリックで開く

  4. PawnのセクションのAI Controllerの項目に作成した AIC_ThirdPersonCharacter を設定する f:id:ken26u:20200712224542p:plain

AIC_ThirdPersonCharacter の動作を確認

  1. レベルに配置する f:id:ken26u:20200712224549p:plain

  2. プレイしてAIキャラクターを見てみるとIDLE状態のまま特に動かない f:id:ken26u:20200712224608p:plain

    • 既存のキャラクターから継承している内容に注意してください
    • 現時点でアニメーションがある為IDLEといえど動いていて、コリジョンがあるためすり抜けはできない

ナビゲーションの理論

  • シーン内でAIを動き回らせるために何が必要か?
    • そしてなぜそれが単なるAからB地点のように単純でないのかについて見ていきます
  • ワールド内でのナビゲーションを実現するために必要なアクタについての考察
  • リアルタイムエクスペリエンスでは事前計算によるソリューションが適切である理由を理解

AIが障害物を避けてシーン内を動き回るためには情報が必要

  • 環境内のナビゲーションはAIの基本タスクだが、単なるAからB地点の移動のように単純ではない
  • ナビゲーションには2つの重要な要素がある
    • パス検索
    • 障害物回避
  • このモジュールでは対象物は静止しているものとする
  • AIがワールド内を動き回ることができるためにはナビゲーションメッシュが必要

ナビゲーションメッシュ

  • 環境内でのナビゲーションを補助するために使用される
  • メッシュとはAIが移動可能な領域を定義する凸型ポリゴンの集合

事前計算データ

  • ナビゲーションメッシュは事前計算(ベイク)される。
    • つまり複雑な3Dコリジョンデータはゲームに現れる前に2Dポリゴンの単一メッシュに変換される
    • これによりエージェントの数とタイプが様々であるリアルタイムエクスペリエンスにおいて、ナビゲーションの負荷が軽くなる
  • 事前計算されたナビゲーションを使うためには、レベルに Navmesh アクタを追加する必要がある
  • シーンへのナビゲーションメッシュの追加は簡単
  • ナビゲーションメッシュの生成は、プロジェクトでAIをセットアップする際に最も頻繁に行うタスク

ナビゲーションメッシュを生成する

  1. ナビメッシュバウンスボリュームを Modeパネルからレベルに配置する f:id:ken26u:20200712224615p:plain

  2. ブラシ設定を x 4000, y 4000, z 400 にする

  3. シーン全体を囲むようにナビメッシュを移動させる f:id:ken26u:20200712224626p:plain

    • Pキーを押すとナビゲーションメッシュで移動可能となる範囲が可視化できる模様(黄緑の色)
  4. ナビゲーションをベイクする f:id:ken26u:20200712224635p:plain

まとめ

ベイクされたナビゲーションの長所と短所

  • 長所
    • 事前計算されたナビゲーションは高速で結果が予測可能
    • 静的なオブジェクト回避により、負荷の高い実行時のコリジョン検出を回避
      • 🤔?
    • ナビゲーションの実装が簡単で全てのAIに対して有効
  • 短所
    • ナビゲーションメッシュは静的。実行前に領域が変更されない事が前提
      • 🤔動くステージとかでは使えないということですね
    • 静的なナビゲーションメッシュではプレイヤーやAIがのような動的なオブジェクトを回避できる利点はない
      • 🤔?
    • ナビゲーションメッシュ固有のインテリジェンスはない。パス検索アルゴリズムを含む、他のシステムからのデータに依存

NavmeshBounceボリュームを使用する

  • 動画の最初でNavmeshBounceボリュームを生成する
    • 🤔すでに前のモジュールで行ったことを行うため軽くスキップ
  • パスをビルドする前なら障害物を動かすと自動的にパスが計算されナビゲーションも自動計算される
    • 大きなレベルの場合この自動計算機能を無効化したい場合もある、それを無効化する機能がある
      • 🤔動画の通りプロジェクト設定→レベルエディタとたどることはできず、項目名で検索しても出てこない
  • 最後に厳密にコントロールする方法を確認する
    • ナビメッシュモディファイアボリュームをナビメッスバウンスと連動させる事によって
      • 複雑なシーンの場合に有用

ナビゲーションメッシュで利用可能な重要オプションの解説

  • ナビゲーションメッシュのいくつかのプロパティはリキャストナビメッシュ(RecastNavMesh)を使用して調整可能
    • NavmeshBounce Volumeを配置した場合、リキャストナビメッシュ(RecastNavMesh)も配置されている f:id:ken26u:20200712224643p:plain

    • 詳細 → 表示 → オフセットを描画ではナビゲーションの表示を上下させることができる 

  • ナビメッシュモディファイアボリュームについて
    • 現時点では作成したナビゲーションメッシュはAIが移動できるのかできないのかの2択の情報しかない
    • 上記をより細かく設定したい場合は?
      • 例えば横切れなくもないが危険なルートである事を表現したいなど
        • 上記のようなルートは他のルートがない場合のみに選択する
      • この目的でナビメッシュモディファイアボリュームは使える
      • これはモードパネルより配置する事が可能 f:id:ken26u:20200712224649p:plain

      • 設定は Area Class から行う f:id:ken26u:20200712224656p:plain

      • マウスカーソルを合わせると解説が出てくるのでわかりやすい f:id:ken26u:20200712224704p:plain

      • 別のパスが存在しない限り横断してはいけない設定に変更してみた図

      • ナビメッシュモディファイアボリュームの解説が終わったようなので削除

NavMesh エージェント

  • ナビゲーションメッシュで移動範囲を定義する事には成功したが、飛んでいたり泳いでいるキャラクターを追加したい場合はどうすればよいか?
    • 新しいナビメッシュエージェント定義を作成、構成して新たなキャラクターの異なるサイズと移動機能を定義する
      • エージェントは全般的な用語で、環境内であらゆる形を取る自律的なエンティティの事
        • ここでは作成するAIキャラクターを指している
    • このセクションでは下記について解説する
      • エージェントの定義方法
      • 同一レベル内で複数のナビメッシュをサポートする方法

RecastNavMeshについて

  1. RecastNavMesh-Default を選択する。 f:id:ken26u:20200712224712p:plain

    • 詳細パネルの世代(Generation)にはエージェントに関連する多くの項目がある
      • エージェント半径 35.0(後で確認するためメモ)
      • エージェントの高さ 144.0 とある(後で確認するためメモ)
    • この設定が与える降下を確認するためナビゲーション表示フラグを有効にする。
      • 画面緑の表示。なければPキー、または 表示 → ナビゲーション

エージェント半径について

  1. コンテンツブラウザのAI_ThirdPersonCharacter をダブルクリックしてエディタを開きカプセルコンポーネントのシェイプを確認 f:id:ken26u:20200712224737p:plain

    • カプセル半径 42.0 とあり、RecastNavMeshのエージェント半径よりも大きい
  2. RecastNavMeshのエージェント半径を42にする f:id:ken26u:20200712225351g:plain

    • 可動範囲が狭まっている事がわかる
      • 🤔一瞬?となったが、力士(半径大)と子供(半径小)がこの道を歩くなら力士の方が可動範囲が狭まりますね。
    • この値を上げると小道から緑がなくなり可動範囲ではなくなる。

エージェントの高さについて

  1. レベル上の適当なキューブを持ち上げる f:id:ken26u:20200712225358g:plain

    • NavMeshが更新され持ち上げられた下の部分も可動範囲に変わっている事がわかる
  2. プレイヤーを持ち上げたキューブの下に移動させる f:id:ken26u:20200712224755p:plain

    • キューブがそこまで上に持ち上がっていない為、キャラクターは地面にめり込んでいる
    • この原因はエージェントの高さが適切ではないため
  3. コンテンツブラウザのAI_ThirdPersonCharacter をダブルクリックしてエディタを開きカプセルコンポーネントのシェイプを確認 f:id:ken26u:20200712224737p:plain

    • Capsule Half Height(カプセル半分の高さ) 96とあり2倍すると192、RecastNavMeshのエージェントの高さ144よりも大きい事がわかる。
      • 🤔なぜに半分?半径に合わせたのかな
  4. RecastNavMeshのエージェントの高さを192にする f:id:ken26u:20200712225404g:plain

    • もはやキューブの下が可動範囲でなくなったことが確認できる

エージェントの半径と高さはプロジェクト設定からも設定可能

  • エージェント半径と高さを設定したが、プロジェクト設定からも調整可能 f:id:ken26u:20200712224802p:plain

サポートされているエージェント設定について

f:id:ken26u:20200712224809p:plain

  • この値は配列
  • 適当に2つ作成し、1つを展開した図 f:id:ken26u:20200712224815p:plain

    • エージェントの高さや半径があり
    • ジャンプが可能かどうかを設定するフラグ等がある
  • サポートされているエージェントは配列のため複数持つ事ができ

  • それぞれが異なるNavMeshを使用する事ができる
    • 🤔ここで飛んだり泳いだりのエージェントを設定するんですね

メッシュをナビゲートする

  • ナビゲーションメッシュが定義できたので、次はそれを実際に使用する思考力をAIに設定する
  • 簡単なところから始める
    • AIキャラクターがレベル内の通過可能領域をランダムに動き回る
      • AIキャラクターBPに機能を追加して、AIキャラクターをメッシュ内のそばの点に移動
      • 待機させ再び動かす
      • 上記をループさせる
        1. 具体的にはカスタムイベントをキャラクター内に作成
        1. RandomWanderロジックをそこに含める
        1. 別の関数を使用して、ゲームが実行されている時にこの関数を繰り返し呼び出す

カスタムイベント作成

  1. AI_ThirdPersonCharacterのイベントグラフを開きカスタムイベントを追加。名前を RandomWander とする f:id:ken26u:20200712224823p:plain

  2. SimpleMovetoLocation を配置しRandomWanderの実行ポートと接続

    • Simple Move To locationにはコントローラーとゴールの情報が必要
    • コントローラーを取得する為、Get Controller を配置し、Simple Move to locationのControllerと接続
      • デフォルトだとアタッチされているオブジェクトがターゲットになり、使用されているコントローラーを返す
      • ここではAIのコントローラーを取得している
    • ゴールを取得するため、GetRandomReachablePointInRadiusを配置
      • 設定可能な値が多いが今回は一部しか使わない
      • 最も重要なのは Origin で探索の開始点(from)。この場合だとAIの現在位置を設定
      • 次に Radius で原点の周りの領域を定義(to)し到達可能なポイントを探す
      • Origin取得のため GetActorLocatinを配置
      • GetRandomReachablePointInRadius の Radius は 10000 に設定
        • 🤔10000 x NavMesh で可能領域がわかるという事ですね
        • 🤔Radiusは通常であればキャラクターの視界とかのイメージなのかな。目につく範囲でランダムに動くとか
  3. GetRandomReachablePointInRadius の RandomLocation出力を SimpleMoveToLocation のGoalに接続 f:id:ken26u:20200712224836p:plain

  4. ノードを見やすく再配置する f:id:ken26u:20200712224843p:plain

作成したカスタムイベントを呼び出す

  1. Event BeginPlay を配置
  2. Set Time By Event を配置し Event BeginPlay と接続
    • タイマーで呼び出すイベントの情報が必要
    • タイマーで呼び出すイベントの情報として RandomWander を接続
    • どれくらいの間隔で RandomWander を呼び出すか設定するため、Time を 1.5(秒)に設定
    • この関数にループしてもらうため、Loopingにチェックを入れる f:id:ken26u:20200712224858p:plain

プレイして確認

  1. コンパイルする
  2. プレイして確認すると、ランダムにAIが動き回っている事が確認できる
    • 🤔との事だったが、微動だにしないため焦る
    • 別プロジェクトを作成し、同じ手順で作成し直してコンパイルしても動かず
    • 別プロジェクトでサポートされているエージェント設定を改めて RecastNavMesh を設定すると動いた f:id:ken26u:20200712224904p:plain

    • 元のプロジェクトに戻り再現させるべくプレイすると何も設定変更していないのに動く。

      • 再現できず原因特定できず。
      • しかし動かないときは サポートされているエージェント設定 を見直すと動くことがあることがわかった f:id:ken26u:20200712224911p:plain

NavMeshとゲームプレイデバッガ

  • あらゆるナビゲーションの問題をリアルタイムで速やかに特定できることはAIシステムでバグを修正する為に重要
    • Unreal にはこれを行うツールが用意されている
    • ゲームプレイデバッガと呼ばれる

デバッガをアクティブにする

  1. プロジェクト設定 → エンジン → アポストリフィがデフォルトで紐付いている f:id:ken26u:20200712224918p:plain

f:id:ken26u:20200712224925p:plain

  • しかしアポストロフィーはコンソールにも紐付いている可能性もある f:id:ken26u:20200712224931p:plain

  • 別のものに紐付けるか削除する。(私はアウトプットログから実行しているためこちらは削除した)

  • ゲームをプレイ中にアポストリフィーを押す
    f:id:ken26u:20200712224938p:plain

デバッグ内容について

f:id:ken26u:20200712224944p:plain

  • 右上には現在選択されているデバッグアクタが示されている
    • この場合は1人しかいないAIキャラクターとなっている
    • 複数キャラクターがいたりするシーンではこの表示は有用
    • AIキャラクターの頭上の赤アイコンも表示されていて選択されている事がわかる
  • いろいろな表示
    • ctrl + ~ でHUDのオン/オフ
    • ctrl + Tab えDebugMessageの表示切り替え
    • 0 Navmesh の表示/非表示
    • 1 AI の表示/非表示
      • Controller Name: AIが使用しているコントローラー名
      • Pawn Name: コントロールされているPawnの名前
      • Movement Mode(移動モード): Walking
    • など左上に記載のあることの説明
    • 🤔ctrl + ~は機能しないですね。USキーボード前提になっていて勝手が違うのかな

AI Perception の理論

ワールドを知覚する

  • AIがインテリジェンスを持っているという印象を適切に与えるには、AIが周囲の環境を知覚できるようにする
  • UEのAI Perception システムはアクタが何を知覚し、ワールドのどの部分を知覚しているかを制御する
    • 収集された情報はイベント駆動形のシステムによって処理されシンプルかつ軽量
    • BPや様々なシチュエーションにおいて幅広く使用可能

AI Perception システムの構成要素

  • 2つの主要なコンポーネントがある
    • AI Perception
      • どの感覚が使用可能か?つまり何を知覚できるかを決定する
    • AI Perception Stimuli Source
      • アクタにどの「知覚可能」なプロパティがあるかを決定

AI Perception

  • 知覚システムがどの知覚を使用できるか
    • 何を「参照」できるかを設定する事が可能
  • 1つのコンポーネントには複数の感覚を追加する事ができる
    • Dominant Sense プロパティを使用して知覚されるアクタの場所を特定する際にある感覚を他の感覚よりも優先させる事ができる
    • 例えば「視覚」を「聴覚」よりも優先させたいなどの使用例がある

AI Perception Stimuli Source

  • AI Perception システムがどの感覚を登録するかを決定する
    • 例えばAI Perception Stimuli Sourceを視覚の刺激として設定する
  • 1つのコンポーネントには複数の刺激を登録する事ができる

イベント及び刺激

  • ワールド内のアクタは刺激を発生する
  • アクタがどの刺激を発生させるか設定
  • AIは自身が知覚可能な情報に基づきその情報について思考し、必要に応じ行動を起こす
  • On Target Perception Updated イベントを使用する

On Target Perception Updated イベント

  • AlStimulus 構造体を通じて資格された刺激について有用な情報を提供する f:id:ken26u:20200712224952p:plain

  • 他にもプロジェクトで使用できる便利な知覚イベントが有る

  • イベントリストはAI Perceptionページで参照可能

https://docs.unrealengine.com/ja/Engine/ArtificialIntelligence/AIPerception/index.html

AIの知覚方法

  • AIが何かを知覚するためには、ワールド内に Stimuli Sourceコンポーネントが存在する必要がある f:id:ken26u:20200712224959p:plain

  • AIが知覚する情報をプレイヤーは出力する f:id:ken26u:20200712225013p:plain

  • AI の視覚がAI Perception Componentに入る

  • On Target Perception Updated イベントが発動する

AI Perceptionの設定

AI_ThirdPersonCharacterでの作業

  1. AI_ThirdPersonCharacter をダブルクリックしてエディターを開く
  2. コンポーネントを追加で AI Perceptionを追加
  3. 詳細パネル AI Perceptionの項で + (add)して、Ai Sight config を追加 f:id:ken26u:20200712225049p:plain

  4. 追加したものを展開すると詳細が設定可能 f:id:ken26u:20200712225057p:plain

    • Sight Radius (視野半径) は最大視野距離を定義可能で、AIがターゲットを近くできる範囲を意味する
    • Lose Sight Radius(視野喪失半径)はすでに見えている対象が見え続ける最大視野 距離を定義する
    • Peripheral Vision Half Angle Degrees はAIの視野のコーンを定義する。
      • キャラクターの前方ベクトルを基準としている
      • 🤔視野角ですかね。馬の視野角は350度どかそういった感じの
    • Detection by Affilation セクションを展開し Detect Neutrals(中立を検出)をオンにする
      • デフォルトだと全てのオブジェクトは中立のため f:id:ken26u:20200712225106p:plain

      • 🤔これはAIのチュートリアルなのでやらないが、敵、味方、中立など役割を付ける事ができて見つけられる対象もこれで設定可能のよう

    • Max Age はいつまで知覚し続けるかという時間
      • Age は視認→消失のプロセスのうち消失してからの経過時間。視界に入っているうちは 0固定
  5. コンパイル→保存してエディターを閉じる

ThirdPersonCharacter(自キャラ)での作業

  1. ThirdPersonCharacterをダブルクリックしてエディターを開く
  2. コンポーネントを追加で AI Perception Stimuli Source を追加
  3. 詳細よりAuto Register as source にチェック f:id:ken26u:20200712225114p:plain

  4. Register as source for Sense の +(add)をクリックしてAi Sight config を追加 f:id:ken26u:20200712225120p:plain

  5. コンパイル→保存してエディターを閉じる

AI Perception とゲームプレイ デバッガ

作業の前に

現在ランダムに動いているAIを無効化する

  1. Begin Play イベントから出ている接続を解除 f:id:ken26u:20200712225020p:plain

  2. コンパイル→保存してエディターを閉じる

  3. プレイしても動き回っていない事が確認できる

Temporal AA(TAA)を無効化する

  • TAAは複数のフレームをブレンドする
  • 単一のピクセルラインをデバッグで確認しようとしても見えにくくなることがある
    • 🤔急に新しいのが出てきた

  1. プロジェクト設定のレンダリングアンチエイリアス設定を None にする f:id:ken26u:20200712225026p:plain

ゲームプレイデバッガーで Perceptionのみを有効にして表示する

  1. プレイ中に Numpad を押し 5 だけが有効になるようにする f:id:ken26u:20200712225134p:plain

    • Sight = 1 は完全に見えている事を示している
    • Age = 0 は現在の状態であり経過時間を示している
    • 視界に入り続けている間はAgeは 0 のまま
  2. AIの視界から消える f:id:ken26u:20200712225032p:plain

    • age が時間とともに上がっていくのがわかる
  3. Tabを押してから上空から見下ろすと、外側に2つの円があることがわかる f:id:ken26u:20200712225039p:plain

    • 内側が緑(Sight Radius)、外側がピンク(Lose Sight Radius)
      • デバッガーの表示により大きいことが判明したため調整する
  4. AI_ThircPersonCharacter をエディターで開く
  5. Sight Radius 1000, Lose Sight Radius 1500に設定する f:id:ken26u:20200712225142p:plain

  6. コンパイル→保存してエディターを閉じる

  7. AI_Character をレベルの隅っこに配置し直す f:id:ken26u:20200712225148p:plain

  8. プレイ→ゲームプレイデバッガーで再度確認 f:id:ken26u:20200712225157p:plain

    • 視野が現実的なスケールになっている事がわかる

AI Perception イベントを使用する

  • AIが知覚したものについての情報を収集する
  • そのために On Target Perception Updated イベントを使用する
  • デバッグモードでステップ実行し何が得られているかを見ていく

AI ThirdPersonCharacter セットアップ

  • Perceptionイベントを設定する
  • このイベントにはAIが使用する有益な知覚情報が含まれる Stimulus変数が渡されている

  1. AI_ThirdPersonCharacter をダブルクリックしてエディターを開く
  2. AI Perceptionを選択し、詳細のイベントから On Target Perception Updated の + をクリックする f:id:ken26u:20200712225207p:plain

    • ノードが追加される 🤔この追加方法は初めてですね
    • On Target Perception Updated の Actor ピンには知覚した対象のアクタへの参照が入っている
  3. Actor はBP内で頻繁に参照する為、変数へ昇格させ変数名は PerceivedActor とする f:id:ken26u:20200712225214p:plain

f:id:ken26u:20200712225221p:plain

  • 🤔Perceived Actor 認識された行動者という事ですね
  • Stimulus を分解する f:id:ken26u:20200712225228p:plain

f:id:ken26u:20200712225234p:plain

  • 展開すると多くの情報が含まれている事がわかる
  • ここでは単純に Successfully Sensed (Bool)にのみ注目する
    • True は正常に認識したとき
    • False は消失したとき
  • ブランチを配置し、図のように接続 f:id:ken26u:20200712225240p:plain

    • Successfully Sensed の結果に応じて2つの処理を分岐させられるようになった
      • 言い換えるとこれによって視認初めと消失のタイミングが得られるようになった

消失時のイベントを作成

消失後に暫く経つと探すのを諦めるようにする。そのためにカスタムイベントを配置しそのイベントが呼ばれた時にPerceived ActorをNullにする処理を作成

  1. Custom Event を配置し TargetLost という名前にする
  2. Set Timer by Event を配置し Branch のFalseとつなぎ Event には TargetLost とつなぐ
  3. 時間は5秒に設定する f:id:ken26u:20200712225254p:plain

  4. PerceivedActor を Null にするため変数をグラフにSet で配置 f:id:ken26u:20200712225301p:plain

    • Alt 押しながらドラッグで Set で配置
  5. TargetLost と接続する f:id:ken26u:20200712225307p:plain

    • 何をセットするかを指定していない為、結果 Null となる
    • 次に True パートの実装を行うが、1つの事のみ行う。それは False の際に設定したタイマーをキャンセルする事
  6. Clear and Invalidate Timer by Handle を配置する
    • このノードにはタイマーのハンドルが必要
    • タイマーのハンドルは Set Timer by Event の Return Value から取得できる為これを変数にしておく
  7. Set Timer by Event の Return Value を変数に昇格させる。名前は TargetLostTimer とする f:id:ken26u:20200712225313p:plain

  8. TargetLostTimer を Get で配置し図のとおり接続 f:id:ken26u:20200712225320p:plain

    • ctrl を押しながらドラッグで Get で配置
  9. コンパイル→保存してエディターを閉じる

最後に

自分の感想などは先頭に🤔を入れることにした。絵文字で目立つしなんて便利なんだ。色々な使い方ができそう。疑問とか喜怒哀楽も表現できる。素晴らしい。

しかし少しおさらいの意味を込めてこのシリーズのブログ読み返したけど、えらく読みづらいな😅

整理整頓しなければ使えない。一旦終わらせてどうするか考えよう

メモ

  • このコースではプロジェクトファイルをダウンロードする事も可能。それは参照用として用意したものとのこと
  • Target self は、指定がなければアタッチされているキャラクターとなる

f:id:ken26u:20200712224829p:plain

英語メモ

  • ブロードキャスト メッセージを複数の受信者に同時に転送する事
  • ベイク 事前計算

ショートカット

  • レベルエディタで地面にスナップ f:id:ken26u:20200712225345g:plain

  • レベルエディタで表示→ナビゲーションのショートカットは P でPathの頭文字の模様

  • イベントグラフでF7はコンパイル
  • イベントグラフで B + クリック でブランチを配置する
  • プレイ中に Pause キーを押すと一時停止できる