UE4.10.4
親ページ:第5回UE4ぷちコン

シミュレーション的なイベント駆動はUE4以外も含めて初めて作ったので手探り。

思考処理フロー

pc05-Event01.png
BehaviorTreeをイベント毎に切り替えて挙動させる。

  • 「GrayちゃんActor」とは別に、「EvenManager」としてイベントテーブル(後述)を管理するActorを用意。ワールドに1つ。
  • 現在の「状態(何やりたいかパラメーター)」は「GrayちゃんActor」が保持
  • 「TaskActor」がイベントの定義。「本を読む」や「TVを見る」などの単位でActor化。
  • Grayちゃんの動きパターンは全て、「TaskActor」の中にある「BehaviorTree」で記述。
  1. BehaviorTree内で次のイベントに遷移してもOKなタイミングで、状態を更新+「EventManager」に条件に合致するイベント検索クエリーを投げる
  2. 次に遷移できるイベントが見つかれば、現行の「TaskActor」を破棄、新しい「TaskActor」をGrayちゃんに登録する。
  3. 新しい「TaskActor」のBehaviorTreeを起動させる

イベントテーブル

ビヘイビアツリー

イベントテーブル


pc05-Event_Table01.pngpc05-Event_Table02.png
  • 条件の状態値、イベント定義Actorの「TaskActor」をテーブル化している。
  • EventManagerで、クエリーが送られてきたら検索してヒットしたデータを返す。

強制的なイベント

ビヘイビアツリー


pc05-Event_BT01.png
  • 「本を読む」「TVを観る」等のイベント毎にBehaviorTreeを作成。

pc05-Event_BT02.pngpc05-Event_BT03.png

pc05-Event_BT04.pngpc05-Event_BT05.png
  • 各イベントで取り回ししやすいように、移動、見られた等のアクション毎にタスク化した。
    大本のイベントからこれらを呼び出すように。

強制的なイベント

  • 通常の状態値から検索するイベントとは別に、特定のタイミングで強制的に発生するイベントの仕組みも作った。
    • 今回は、開始時のおかえりなさい、就寝、起床。
  • こちらは通常のイベントテーブルとは別にテーブルを持ち、発生タイミングは別途GameMode等から一定タイミングでクエリーを投げている。

ほか

扉を開ける


面倒臭かった。いい方法知ってたら教えて下さい。

pc05-Event_Door01.png
  1. BehaviorTreeのMoveToと並列に動くサービスとして扉チェックを回す。
  2. ヒットした先が扉+閉じられていた場合、MoveToの移動先を「扉を開ける為の回避場所」にして、扉を開けられるように。
    • 扉を開ける為の回避場所:ドアActorに仕込んでおいた。
  3. 扉開ける
  4. MoveToを元の移動先に戻す。

MoveToの一時中断


デコレーターのCoolDownで中断させると、MoveToが一瞬途切れて動きがカクカクなってしまう。

という事で、Blackboardのbool値を監視してMoveToを中断させるタスクを用意した。

pc05-Event_CancelMoveTo01.png

    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS