問題タブ [behavior-tree]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
optimization - ネストされた状態からネストされた状態への移行のベスト プラクティス (図を参照)
私は、単一のスレッド化されたプログラミング言語 (Actionscript) でネストされた状態遷移を実装するための最良の方法に頭を悩ませようとしています。このビヘイビア ツリーのような構造があるとします。
ここで、各リーフ ノードが、ギャラリーの画像や、ページ ビューにネストされた投稿ビューにネストされたコメントのように、Web サイトの目的地であると想像してください...そして、目標は、リーフからアニメーション化されたトランジションを実行できるようにすることです。ノードからリーフ ノードへ、前のツリーを (下から上へ) アニメーション化し、現在のツリーで (上から下へ) アニメーション化します。
そのため、一番左下のリーフ ノードにいて、一番右下のリーフ ノードに移動したい場合は、次のようにする必要があります。
- 左下のノードから移行
- 完了すると (たとえば、アニメーションの 1 秒後)、親から移行します。
- 完了すると、その親から移行します
- 完了すると、一番右の親に遷移します
- 完了時、右端の子に遷移
- 完了時、リーフで遷移
私の質問は:
これらの各ノードを HTML ビュー (リーフは「部分」であり、レールから用語を借用したもの)、またはサブコンポーネントをネストしている MXML ビューとして想像すると、アプリケーションルート、上記のように遷移をアニメーション化する最良の方法は何ですか?
1 つの方法は、考えられるすべてのパスをグローバルに保存してから、「アプリケーション、このパスから遷移し、このパスに遷移します」と言うことです。アプリケーションが非常に単純な場合、これは機能します。これが、Actionscript フレームワークであるGaiaのやり方です。ただし、任意にネストされたパスに出入りできるようにしたい場合は、次の理由により、それをグローバルに保存できません。
- Actionscript はそのすべての処理を処理できませんでした
- 良いカプセル化のようには見えません
したがって、この質問は次のように言い換えることができます。どのように左端の葉のノードとその親を葉から開始し、右端の葉のノードでルートから開始してアニメーション化しますか? その情報はどこに保存されますか (何を移行するか)。
別の可能な解決策は、「アプリケーション、前の子ノードから移行し、それが完了したら、現在の子ノードに移行する」ということです。ここで、「子ノード」はアプリケーション ルートの直接の子です。次に、アプリケーション ルートの一番左の子 (2 つの子ノードがあり、それぞれに 2 つの子ノードがあります) は、正しい状態にあるかどうかを確認します (その子が「移行されている」場合)。そうでない場合は、それらに対して「transitionOut()」を呼び出します...そのようにして、すべてが完全にカプセル化されます。しかし、それはかなりプロセッサ集約的であるようです。
どう思いますか?他の代替手段はありますか?または、 AI Behavior Treesまたは Hierarchical State Machines で、非同期状態遷移を実際に実装する方法を説明している優れたリソースを教えてください。
- オブジェクトのどこから「transitionOut」を呼び出すのでしょうか? ルートまたは特定の子から?
- 状態はどこに保存されますか? グローバルに、ローカルに?「transitionIn()」と「transitionOut()」を呼び出すものを定義するスコープは何ですか?
私は AI とステート マシンに関する多くの記事/本を見たり読んだりしましたが、ビヘイビア ツリーに参加する数百のビュー/グラフィックスを含む複雑な MVC オブジェクト指向プロジェクトで非同期/アニメーション遷移を実際に実装する方法を説明するものをまだ見つけていません。
一番親のオブジェクトからトランジションを呼び出すべきですか、それとも子からトランジションを呼び出すべきですか?
ここに私が調べたもののいくつかがあります:
- ゲーム ビヘイビア AI のアーキテクチャ: ビヘイビア マルチキュー
- 階層ステート マシン — 基本的に重要な設計方法
- 例によるゲーム AI のプログラミング
- 目標主導のエージェントの行動
- トロイ・ガードナーによる高度な状態管理
- Troyworks の AS3 COGS ライブラリ
- ビヘイビア ツリー設計への一般的なアプローチ
- 非同期感覚システムのイベント駆動条件の構築
これは必ずしも AI の問題ではありませんが、ネストされた状態のアーキテクチャを Web サイトに適用する方法を説明する他のリソースはありません。これらは最も近いものです。
質問の別の言い方: 状態の変化をアプリケーションにどのようにブロードキャストしますか? イベントリスナーはどこに置いていますか? 任意にネストされている場合、アニメーション化するビューをどのように見つけますか?
注: 私はゲームを構築しようとしているのではなく、アニメーション化された Web サイトを構築しようとしているだけです。
ruby-on-rails - Model-View-Controller は人工知能やビヘイビア ツリーとうまく連携できますか?
私は MVC のバックグラウンド (Flex と Rails) から来ており、コードの分離、再利用性、カプセル化などのアイデアが大好きです。これにより、物事をすばやく構築し、他のプロジェクトでコンポーネントを再利用することが容易になります。ただし、複雑で状態駆動型の非同期のアニメーション化されたアプリケーションを構築しようとする場合、MVC の原則に固執することは非常に困難でした。
アプリケーション内の多くのネストされたビュー間でアニメーション化されたトランジションを作成しようとしていますが、自分自身を誤解させているかどうかを考えさせられました... MVC の原則を人工知能 (ビヘイビア ツリー、階層ステート マシン) の原則に適用できますか? 、ネストされた状態)、ゲームのような? これらの 2 つの分野はうまく連携していますか?
HTML CMS システムなどのように、物事が静的である場合、ビュー/グラフィックスがそれ以外のものを無視するのは非常に簡単です。しかし、複雑な状態駆動型の遷移を追加し始めると、すべてが他のすべてのことを知る必要があるように思われ、MVC がほとんど邪魔になります。どう思いますか?
アップデート:
例。今、私はFlexでWebサイトに取り組んでいます。アプリケーション内のネストされたすべての要素を適切にアニメーション化するには、それらを AI エージェントと見なす必要があるという結論に達しました。したがって、各「ビュー」には独自のビヘイビア ツリーがあります。つまり、コンテキストに基づいてアクション(表示および非表示) を実行します。(選択したデータは何かなど)。そのためには、ViewController タイプのものが必要です。私はそれをプレゼンターと呼んでいます。ビュー (MXML でレイアウトされたグラフィックス)、プレゼンター (アプリケーションの状態とネストされた状態に基づいてビューが実行できるアニメーションとアクションを定義する)、およびビューにデータを表示するためのプレゼンテーション モデル (発表者を通して)。また、値オブジェクト用のモデルと、URL やデータベース呼び出しなどを処理するためのコントローラーもあります...すべての通常の静的/html のような MVC のもの。
しばらくの間、私はこれらの「エージェント」をどのように構成して、周囲のコンテキスト (何が選択されているかなど) に応答できるようにするかを考えていました。他のすべてを認識する必要があるように思えました。そして、ゲームのパス/ナビゲーション テーブル/リストについて読み、すぐに、すべてのエージェントが実行できるすべての事前計算されたアクションの中央に格納されたテーブルがあると思いました。そのため、彼らが実際にコードをどのように構成しているのか疑問に思いました。
3D ビデオ ゲームのすべては大きな秘密であり、ビヘイビア ツリーの定義など、グラフィカルな UI/エディタで行われていることがわかります。そのため、エージェントが環境にどのように応答するか、またコードをモジュール化してカプセル化する方法を構造化するために、ある種の MVC を使用しているのかどうか疑問に思っています。
artificial-intelligence - 部分的にランダムであるが好みに影響される場合、NPC が実行するアクションを決定しますか?
ゲーム内のキャラクターに、部分的にランダムなアクションを実行させたいのですが、好みの影響も受けます。たとえば、キャラクターが怒っている場合、冗談を言うよりも怒鳴る可能性が高くなります。そこで、キャラクターがとる行動をどのように決定するかを考えています。これが私に思いついたアイデアです。
解決策 #1 : 考えられるすべてのアクションを繰り返します。アクションごとにランダムロールを行い、その乱数に優先値を追加します。最も高い値を持つアクションが、キャラクターがとるアクションです。
解決策 #2 : アクションに数値の範囲を割り当て、アクションの可能性が高いほど範囲が広くなります。したがって、ランダム ロールが 1 ~ 5 のいずれかに戻ると、キャラクターは冗談を言います。6-75 を返すと、彼らは叫びます。等々。
解決策 #3 : すべてのアクションをグループ化し、分岐ツリーを作成します。彼らは友好的な行動をとるでしょうか、それとも敵対的な行動をとるでしょうか? ランダム ロール (好みの値が追加された) は、敵対的であると言います。彼らは物理的な攻撃や口頭で攻撃しますか? ランダムロールは口頭で言います。アクションに到達するまで、ラインを下っていきます。
解決策 1 は最も単純ですが、ほとんど効率的ではありません。解決策 #3 はもう少し複雑だと思いますが、より効率的ではありませんか?
この特定の問題について、これ以上の洞察を持っている人はいますか? #3は最善の解決策ですか?より良い解決策はありますか?
algorithm - ビヘイビア ツリーの実装
私は任意の言語でビヘイビア ツリーの実装を探しています。それらがどのように実装され使用されているかについて詳しく知りたいので、自分でロール バックできますが、残念ながらOwylを 1 つしか見つけることができませんでした。使用方法の例は含まれていません。
コードを閲覧できる他のオープンソースのものを知っている人は、それらがどのように使用されているかなどのいくつかの例を参照してください?
EDIT:ビヘイビアツリーはデータ構造の名前です。
c# - Treesharp C# ビヘイビア ツリー ライブラリ - どこから始めればよいですか?
最近、 apoc によって投稿された treesharp ライブラリを使用して、堅牢なビヘイビア ツリーを実装しようとしています。私は本でイテレータとインターフェースを調べてきましたが、このライブラリを使用するどころか、テストする方法さえまだわかりません。インターフェイスが相互に接続する方法と、実際にそれらを使用してテスト/ツリーを構築する方法は、私を混乱させます。
通常、このような状況では、コード例を探して、他の人の作品を見て啓発を導き出しますが、このライブラリの場合、サンプル コードはないようです。
このライブラリを使用して動作ツリーの構築を開始する方法を理解してくれる人はいますか? 質問が非常に初心者である場合は申し訳ありませんが(そうかもしれないと思います)、列挙子とインターフェース内のプログレッシブインターフェースは、今のところ理解するのが非常に困難です。
c# - C# で AI ビヘイビア ツリーを作成する - どのように?
C# を使用して「ビヘイビア ツリー」を作成しようとしています。
知らない人のために説明すると、ビヘイビア ツリーは基本的に AI を構築できるフレームワークです。シーケンサー、セレクター、デコレーター、複合アクションなどがあります。
ここ( http://code.google.com/p/treesharp/ )にあるC#で「ビヘイビアツリー」を実装した単一のライブラリを見つけましたが、サンプルコードがないため、実際に使用する方法がわかりませんから描けます。このフレームワークを実際に使用する方法を示す簡単なサンプル コードを作成できる人はいますか? または、C# でビヘイビア ツリーを実装する別の方法を知っている人はいますか?
本当にありがとう!
actionscript-3 - AS3 の RTS ゲームに最適なデザイン パターンはどれですか?
デザイン パターンに関する優れた書籍を探していますが、リアルタイム ストラテジー ゲーム (Starcraft など) の MVC に推奨する特定のパターンを教えてください。.
いつか Flash で基本的な RTS を作成したいと考えており、これに最適なパターンの研究を開始したいと考えています。
乾杯!
python - 宣言型 DSL をネストされた関数呼び出しに変換する
ネストされた関数呼び出しから特別な反復子 (ビヘイビア ツリー) を構築する python ライブラリがあります。API は (Python であるため) かなり軽量な構文を備えていますが、実際には宣言型 DSL を使用できます。
ここに私が想定しているものの大まかなスケッチがあります:
DSL (YAML を使用):
次のネストされた関数呼び出しが発生します。
これを行う方法を正確に視覚化するのに苦労しています。DSL はツリーを表現する必要があるため、単純な深さ優先トラバーサルが適切と思われます。しかし、ネストされた関数呼び出しを作成するには、これを裏返しにする必要があります。おそらく、中間スタックなどを使用した賢い何かが関係しているのでしょうが、私はそれを完全に把握することはできません. この変換を実行する正しい方法は何ですか?