モデルは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/12/01 11:34