SlideShare a Scribd company logo
1 of 49
Download to read offline
Behavior TreeでAIを作る
2016/12/10
@toRisouP
自己紹介
• 名前 とりすーぷ(@toRisouP)
• 趣味でC#/Unity開発をやってます
アドベントカレンダー書きました
• Unity2 Advent Calendar 4日目
今作ってるゲーム
• ハクレイフリーマーケット
– 東方2次創作同人ゲーム
– PC向け、コミケ等の同人即売会で配布
– 最大6人対戦、オンライン対戦対応
– まだ開発中です
ルール
• フィールド上のアイテムを陣地に運ぶと点数になる
– アイテムには金額がある
– 最終的に合計金額が大きいチームの勝ち
こんな要望が
• 6人対戦ゲームなのに、6人も人が集まらない
• ぼっちでも遊びたい
これらの要望に答えるためにAIを実装することにしました
今回の内容
Behavior Treeを使って
AIを作ってみた話をします
Behavior Tree
Behavior Treeとは
• AIアルゴリズムを作る手法の1つ
• 行動(Task)をTree構造で管理し、状態に応じて
深さ優先でTaskを実行する
• ステートマシンと比較して状態の管理がしやすい
Behavior Treeを実現するアセット
• Behavior Designer を今回は使いました
(Behavior Designerを使った)
Behavior Treeのしくみ解説
ノード
• Treeを構成する各要素のこと(Taskともいう)
• 「待機中」「成功」「実行中」「失敗」の状態がある
• 基本的にこの成否状態を利用して状態遷移を行う
基本単位のノード
Actionノード
• 何か処理を実行する
– 移動する、攻撃する、ジャンプするなど
– 実行結果がそのまま成否になる
Conditionalノード
• 条件判定を行う
– プレイヤが特定の座標にいるか、敵が近くにいるかなど
– 条件判定の結果が成否になる
組み合わせるノード
Sequenceノード
• ANDに相当するノード
• 子を左から順番に実行
– どれか一個でも途中で失敗したらそこで終了
– 全部実行できたら成功判定を返す
敵が近くにいるか? 攻撃する
「敵が近くにいた場合に攻撃する」
Sequence
Selectorノード
• ORに相当するノード
• 子を左から順番に実行
– どれか一個でも成功したらそこで終了して成功を返す
– 全部実行して失敗したら失敗を返す
体力が残り少ない 残り時間が少ない
?
「体力が少ない」または「残り時間が少ない」か
Selector
基本はこの4つのノード
• ActionとConditionalを並べて一連の動作を作る
– 動作をSequenceやSelectorで制御
• もうちょっと複雑な挙動をするノードもある
– 優先順位を設定可能なやつ
– ランダムに実行するやつ
– ずっと繰り返すやつ
簡単なAIの例
例
• 体力が少ないと拠点に移動
• そうでないなら敵に近づいて攻撃
?
Repeter
Selector
Sequence Sequence
体力が少ない? 拠点に移動
近くの敵を取得
近くまで移動
攻撃
?
体力が少ない? 拠点に移動
近くの敵を取得
近くまで移動
攻撃
※体力が少ないとき
?
※体力が少ないとき
体力が少ない? 拠点に移動
近くの敵を取得
近くまで移動
攻撃
1.深さ優先で条件判定開始
実行中
実行中
実行中
実行中
?
※体力が少ないとき
体力が少ない? 拠点に移動
近くの敵を取得
近くまで移動
攻撃
実行中
実行中
成功
2.条件判定に成功して
移動処理に遷移
実行中
実行中
?
体力が少ない? 拠点に移動
近くの敵を取得
近くまで移動
攻撃
※体力が多い時
?
体力が少ない? 拠点に移動
近くの敵を取得
近くまで移動
攻撃
1.深さ優先で条件判定開始
実行中
実行中
実行中
実行中
※体力が多い時
?
体力が少ない? 拠点に移動
近くの敵を取得
近くまで移動
攻撃
2.判定に失敗し、「失敗」
ステータスが返される
実行中
失敗
実行中
※体力が多い時
失敗
?
体力が少ない? 拠点に移動
近くの敵を取得
近くまで移動
攻撃
3.Selectorが次のTreeの
ノードを実行する
実行中
失敗
実行中
※体力が多い時
失敗
実行中
実行中
?
体力が少ない? 拠点に移動
近くの敵を取得
近くまで移動
攻撃
4.Sequenceが子を
順番に実行
実行中
失敗
実行中
※体力が多い時
失敗
実行中
実行中成功 成功
Behavior Treeはかんたん
• GUIで簡単にそこそこ複雑な動作が作れる
• ステートマシンと比べて状態遷移が非常に楽
• ActionとConditionalの組み合わせを変えれば挙動を
すぐに変更できる
– 再利用性も高い
実際にAIを作ってみる
専用のActionとConditional
を用意する
作ったAction
• 対象の近くまで移動する(NavMesh利用)
• 対象の方に振り向く
• 掴む/投げる
• 自陣へ運ぶ/敵陣へ運ぶ
• 攻撃する
• フィールド上のアイテムを1個選ぶ
– A:近さ優先、金額優先、軽いもの優先
– B:敵陣から、どこの陣地にも属してないフリーのもの
– A x B = 6種類 + 完全ランダム の計7種類
作ったConditional
• 優勢である
• 劣勢である
• 敵が近くにいる
• 何か持っている
– 何でも
– 敵プレイヤ
– 金額がプラスのアイテム
– 金額がマイナスをアイテム
– 爆弾
これらを組み合わせて
AIを作る
最小構成のAI
最小構成のAI
自陣へ移動
自陣に向きを合わせる
投げる
アイテムをランダムに
1つ選択
近くまで移動
向きを合わせる
掴む何か持ってる?
実際の動き
たったこれだけで動く
• これだけでもそれっぽさがある
• これをベースに拡張して賢くしていく
いろいろ追加
挙動を追加
• 優勢時・劣勢時で選ぶアイテムを変える
– 負けてると敵陣からアイテムを盗むようにする
• アイテムの価値を判断して運ぶ
– 価値がプラスのものは自陣へ、マイナスのものは敵陣へ
• 敵が近くに居たら攻撃する
• アイテムを加工する(特定キャラのユニークスキル)
• 移動中に引っかかったら諦める
さらにキャラごとの差異を出す
• キャラの特徴にあった行動を優先させる
– がめつい性格の設定のキャラは金額が高いアイテムを優先
– 足が早い設定のキャラは軽いアイテムを優先
• パラメータ調整で攻撃の頻度や強さを変更
– アグレッシブさ(攻撃する確率)
– 連続攻撃のクールタイム
– 敵を検知する範囲
最終系
実際の動き
• 全員AIの戦い
出来上がったAIの感想
• 最後までどっちが勝つかわからないいい勝負をする
– 攻めと守りのバランスが良い感じなのかな?
– 良い感じのできでは?
• 人間が遊んだときより全体的に点数が高くね?
– 人間は妨害に熱心になって全然アイテムを運ばない
– AIはひたすらアイテムを運ぶから点数が高くなる
– 人間がいるチームの方が不利なのでは?
まとめ
• BehaviorTreeを使うと簡単にAIがつくれる
– 実装にかかった時間は休日3日分くらい
– 7割くらいがTaskの実装、3割くらいがTreeの構築
• 調整がまだまだ必要
– 歩いてる途中にひっかかった時の復帰処理がまだ甘い
– もっとアグレッシブに攻撃させたい
• AIつくるの楽しいしかわいい
– 蟻が必死にお菓子運んでるみたいでかわいい
みんなもAIつくろう!
以上
• ありがとうございました
• @toRisouP

More Related Content

What's hot

What's hot (20)

MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
 
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
 
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
 
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介
 
インタフェース完全に理解した
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解した
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理
 
猫でも分かるUMG
猫でも分かるUMG猫でも分かるUMG
猫でも分かるUMG
 
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動についてUE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
 
【CEDEC2018】Scriptable Render Pipelineを使ってみよう
【CEDEC2018】Scriptable Render Pipelineを使ってみよう【CEDEC2018】Scriptable Render Pipelineを使ってみよう
【CEDEC2018】Scriptable Render Pipelineを使ってみよう
 
OpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたOpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみた
 
UniTask入門
UniTask入門UniTask入門
UniTask入門
 
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
 
猫でも分かるUE4のポストプロセスを使った演出・絵作り
猫でも分かるUE4のポストプロセスを使った演出・絵作り猫でも分かるUE4のポストプロセスを使った演出・絵作り
猫でも分かるUE4のポストプロセスを使った演出・絵作り
 
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
 

More from torisoup

More from torisoup (18)

Doozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_ltDoozy UI 使おうぜ! #unity_lt
Doozy UI 使おうぜ! #unity_lt
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
 
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunityUnityで作ったゲームをDLカードで配布してみた話 #roppongiunity
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
 
ARでVRアバターを表示するシステムを構築しよう
ARでVRアバターを表示するシステムを構築しようARでVRアバターを表示するシステムを構築しよう
ARでVRアバターを表示するシステムを構築しよう
 
ObserverパターンからはじめるUniRx
ObserverパターンからはじめるUniRx ObserverパターンからはじめるUniRx
ObserverパターンからはじめるUniRx
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
 
Photon Cloud ことはじめ
Photon Cloud ことはじめPhoton Cloud ことはじめ
Photon Cloud ことはじめ
 
アバター生放送支援アプリ「アバれぽ」
アバター生放送支援アプリ「アバれぽ」アバター生放送支援アプリ「アバれぽ」
アバター生放送支援アプリ「アバれぽ」
 
コールバックと戦う話
コールバックと戦う話コールバックと戦う話
コールバックと戦う話
 
UniRx完全に理解した
UniRx完全に理解したUniRx完全に理解した
UniRx完全に理解した
 
UnityとNCMBでユーザ管理を実装してみた話
UnityとNCMBでユーザ管理を実装してみた話UnityとNCMBでユーザ管理を実装してみた話
UnityとNCMBでユーザ管理を実装してみた話
 
Task vs Observable
Task vs ObservableTask vs Observable
Task vs Observable
 
UniRxでPUNを使いやすくする
UniRxでPUNを使いやすくするUniRxでPUNを使いやすくする
UniRxでPUNを使いやすくする
 
はじめてのUniRx
はじめてのUniRxはじめてのUniRx
はじめてのUniRx
 
UniRxでMV(R)Pパターン をやってみた
UniRxでMV(R)PパターンをやってみたUniRxでMV(R)Pパターンをやってみた
UniRxでMV(R)Pパターン をやってみた
 
未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-
 
みくみくまうすについて&Unity で使えるコーディングノウハウ
みくみくまうすについて&Unity で使えるコーディングノウハウみくみくまうすについて&Unity で使えるコーディングノウハウ
みくみくまうすについて&Unity で使えるコーディングノウハウ
 
Unity講習会(初級)
Unity講習会(初級)Unity講習会(初級)
Unity講習会(初級)
 

Recently uploaded

Recently uploaded (12)

論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

【Unity】 Behavior TreeでAIを作る