Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unity 1week でつくったゲームにAIを実装してみる

torisoup
January 13, 2021

Unity 1week でつくったゲームにAIを実装してみる

Behaviour TreeでAIを実装してみた話です

Gotanda.unity #16
https://meetup.unity3d.jp/jp/events/1268

torisoup

January 13, 2021
Tweet

More Decks by torisoup

Other Decks in Technology

Transcript

  1. 自己紹介 •とりすーぷ • @toRisouP • VR系の開発してる • Microsoft MVP •

    (Developer Technologies) • 最近はVRChatしてます illustrations by kota(@kt_kkz)さん
  2. Behavior Tree Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する • 階層構造をもったグラフで AIの行動パターンを定義する • 深さ優先、左端優先
  3. Node Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する フィールド

    中央に 移動する 待機する ノード → ノード → ノード → ノード → • 各要素を「ノード」と呼ぶ
  4. • 各ノードは状態を持つ • 成功 • 失敗 • (実行中) • (待機中)

    状態 Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する フィールド 中央に 移動する 待機する
  5. ノードの種類 Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する フィールド

    中央に 移動する 待機する • ノードは大きく2種類に分類される • Control Flow ノード • Task ノード
  6. Behavior Tree Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する • Task • 実際にAIがとる「行動」を表す これらがTask→
  7. Control Flow Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する • Control Flow • 全体の”流れ”を司るノード • 種類がいくつかある • SelectorとSequence の2つがメインに使われる Control Flow
  8. Sequence Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する フィールド

    中央に 移動する 待機する • Sequence • 子のノードを左から実行 • 子がすべて成功したら「成功」 • 子が1つでも失敗したら「失敗」 になり即終了 • 要するにAND
  9. Selector Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する フィールド

    中央に 移動する 待機する • Selector • 子のノードを左から実行 • 子が成功した時点で「成功」 • 子がすべて失敗したら「失敗」 • 要するにOR
  10. Repeat Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する フィールド

    中央に 移動する 待機する • Repeat • 子の処理をずっと繰り返す
  11. このグラフの挙動 Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する フィールド

    中央に 移動する 待機する 1. 敵が近くにいるか判定する 2. 見つけた敵に向かって移動する 3. 攻撃する
  12. このグラフの挙動 Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する フィールド

    中央に 移動する 待機する 1. 敵が近くにいるか判定する 2. 見つけた敵に向かって移動する 3. 攻撃する ↑が失敗したら↓を実行する 1. フィールド中央に移動する 2. 待機する
  13. Case1: 敵が近くにいた場合 Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する 実行中 待機中 実行中
  14. Case1: 敵が近くにいた場合 Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する 「1.敵が近くにいるか?」を実行する 実行中 待機中 待機中 実行中 実行中 待機中
  15. Case1: 敵が近くにいた場合 Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する 「1.敵が近くにいるか?」が成功する → 次に処理が移る 実行中 待機中 待機中 実行中 実行中
  16. Case1: 敵が近くにいた場合 Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する 「2.対象に移動する」が成功する → 次に処理が移る 実行中 待機中 実行中 実行中
  17. Case1: 敵が近くにいた場合 Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する 「3.攻撃する」が成功する → Sequence自体が「成功」する 待機中 実行中
  18. Case1: 敵が近くにいた場合 Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する Selectorも「成功する」 → Repeatによって最初に戻る 待機中
  19. Case2: 敵が近くにいなかった Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する 実行中 待機中 実行中 「1.敵が近くにいるか?」を実行する 待機中 実行中 待機中
  20. Case2: 敵が近くにいなかった Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する 実行中 待機中 実行中 「1.敵が近くにいるか?」を実行する → 失敗する 待機中 待機中
  21. Case2: 敵が近くにいなかった Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する 待機中 実行中 「1.敵が近くにいるか?」を実行する → 失敗する → 続きは実行されずSequence自体が 失敗となる 待機中 待機中
  22. Case2: 敵が近くにいなかった Selector Sequence 敵が近くに いるか? Sequence 対象に 移動する 攻撃する

    フィールド 中央に 移動する 待機する 実行中 実行中 Selectorにより次のブロックに処理が移る 待機中 待機中 実行中