質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

424閲覧

Unity ML-Agentsにおいて、複数の学習モデルを切り替える方法

tako9105

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2023/11/20 01:52

実現したいこと

ML-Agentsの一つのエージェントに対して、異なる学習モデルを特定条件で切り替えて適用させたい。

前提

ML-Agentsを使い、プレイヤーのサポートを行うエージェントの作成をしています。

エージェントの動きとして、
・プレイヤーに追従する
・敵に近づく
といった異なる学習モデルをそれぞれ作成した場合、これらを特定条件で切り替える方法がありましたら教えて頂きたいです。

試したこと

全く同じ見た目のエージェントを2つ作成し、それぞれに別の学習モデルを適用、条件でエージェントごと入れ替える方法を試しました。
入れ替える際に2つのエージェントが重なる瞬間が生まれたり、動きが不自然になったりしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

モデルはAgent.SetModelで切り替えられそうでした。
試しにロケットをイメージして作ったエージェントに下記スクリプトをアタッチし...

C#

1using Unity.Barracuda; 2using Unity.MLAgents; 3using UnityEngine; 4 5[RequireComponent(typeof(Agent))] 6public class ModelSwitcher : MonoBehaviour 7{ 8 [SerializeField] private NNModel[] models; 9 private Agent agent; 10 private int modelIndex; 11 12 private void Start() 13 { 14 if (this.models.Length == 0) 15 { 16 this.enabled = false; 17 return; 18 } 19 20 this.agent = this.GetComponent<Agent>(); 21 this.SetModel(this.modelIndex); 22 } 23 24 private void OnGUI() 25 { 26 if (GUILayout.Button("Switch Model")) 27 { 28 this.modelIndex = (this.modelIndex + 1) % this.models.Length; 29 this.SetModel(this.modelIndex); 30 } 31 32 GUILayout.Label(this.models[this.modelIndex].name); 33 } 34 35 private void SetModel(int index) 36 { 37 var model = this.models[this.modelIndex]; 38 39 // ビヘイビア名はとりあえずモデルと同名に設定しました 40 // ですが、訓練を終えてゲームを実行中の段階であれば 41 // どのように設定してもいいんじゃないかと思います 42 this.agent.SetModel(model.name, model); 43 } 44}

赤玉を狙って飛ぶよう訓練したモデルと、青玉を狙って飛ぶよう訓練したモデルを切り替えさせてみました。フィールドの後方から出発して動かないターゲットへ飛ぶという単純なシチュエーションで訓練してしまったため、飛んでいる途中でモデルを切り替えると状況に対応できず混乱している様子で見苦しいですが、ともかく挙動を切り替えることはできたようでした。

図

投稿2023/11/24 21:27

Bongo

総合スコア10816

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tako9105

2023/12/01 11:34

返信が遅れ、申し訳ありません。 ご説明いただいた手法で解決致しました。 こちらで作成していたエージェントの移動が2次元であるためか、切り替え時の不自然さもさほど気になりませんでした。 プログラム例に加えてUnity上での挙動まで添付していただき、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問