Skip to content

Commit dceb5c4

Browse files
author
Chris Elion
authored
Merge pull request #3595 from Unity-Technologies/develop-BehaviorParams-public
Make BehaviorParameters public again, update editor
2 parents 04d2cc9 + 6650fdb commit dceb5c4

File tree

8 files changed

+161
-102
lines changed

8 files changed

+161
-102
lines changed

DevProject/Assets/placeholder.txt.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Project/Assets/ML-Agents/Examples/SharedAssets/Scripts/ModelOverrider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ NNModel GetModelForBehaviorName(string behaviorName)
137137
void OverrideModel()
138138
{
139139
m_Agent.LazyInitialize();
140-
var name = m_Agent.BehaviorName;
140+
var bp = m_Agent.GetComponent<BehaviorParameters>();
141+
var name = bp.behaviorName;
141142

142143
var nnModel = GetModelForBehaviorName(name);
143144
Debug.Log($"Overriding behavior {name} for agent with model {nnModel?.name}");

Project/Assets/ML-Agents/Examples/Soccer/Scripts/AgentSoccer.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ public enum Team
2727
[HideInInspector]
2828
public Rigidbody agentRb;
2929
SoccerSettings m_SoccerSettings;
30+
BehaviorParameters m_BehaviorParameters;
3031
Vector3 m_Transform;
3132

3233
public override void Initialize()
3334
{
34-
if (TeamId == (int)Team.Blue)
35+
m_BehaviorParameters = gameObject.GetComponent<BehaviorParameters>();
36+
if (m_BehaviorParameters.TeamId == (int)Team.Blue)
3537
{
3638
team = Team.Blue;
3739
m_Transform = new Vector3(transform.position.x - 4f, .5f, transform.position.z);

com.unity.ml-agents/Editor/BehaviorParametersEditor.cs

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using UnityEditor;
33
using Barracuda;
44
using MLAgents.Policies;
5+
using UnityEngine;
56

67
namespace MLAgents.Editor
78
{
@@ -22,27 +23,55 @@ public override void OnInspectorGUI()
2223
{
2324
var so = serializedObject;
2425
so.Update();
26+
bool needPolicyUpdate; // Whether the name, model, inference device, or BehaviorType changed.
2527

2628
// Drawing the Behavior Parameters
27-
EditorGUI.BeginChangeCheck();
28-
EditorGUI.indentLevel++;
29-
EditorGUILayout.PropertyField(so.FindProperty("m_BehaviorName"));
30-
EditorGUILayout.PropertyField(so.FindProperty("m_BrainParameters"), true);
31-
EditorGUILayout.PropertyField(so.FindProperty("m_Model"), true);
3229
EditorGUI.indentLevel++;
33-
EditorGUILayout.PropertyField(so.FindProperty("m_InferenceDevice"), true);
34-
EditorGUI.indentLevel--;
35-
EditorGUILayout.PropertyField(so.FindProperty("m_BehaviorType"));
30+
EditorGUI.BeginChangeCheck(); // global
31+
32+
EditorGUI.BeginChangeCheck();
33+
{
34+
EditorGUILayout.PropertyField(so.FindProperty("m_BehaviorName"));
35+
}
36+
needPolicyUpdate = EditorGUI.EndChangeCheck();
37+
38+
EditorGUI.BeginDisabledGroup(Application.isPlaying);
39+
{
40+
EditorGUILayout.PropertyField(so.FindProperty("m_BrainParameters"), true);
41+
}
42+
EditorGUI.EndDisabledGroup();
43+
44+
EditorGUI.BeginChangeCheck();
45+
{
46+
EditorGUILayout.PropertyField(so.FindProperty("m_Model"), true);
47+
EditorGUI.indentLevel++;
48+
EditorGUILayout.PropertyField(so.FindProperty("m_InferenceDevice"), true);
49+
EditorGUI.indentLevel--;
50+
}
51+
needPolicyUpdate = needPolicyUpdate || EditorGUI.EndChangeCheck();
52+
53+
EditorGUI.BeginChangeCheck();
54+
{
55+
EditorGUILayout.PropertyField(so.FindProperty("m_BehaviorType"));
56+
}
57+
needPolicyUpdate = needPolicyUpdate || EditorGUI.EndChangeCheck();
58+
3659
EditorGUILayout.PropertyField(so.FindProperty("TeamId"));
37-
EditorGUILayout.PropertyField(so.FindProperty("m_UseChildSensors"), true);
38-
// EditorGUILayout.PropertyField(serializedObject.FindProperty("m_Heuristic"), true);
39-
EditorGUI.indentLevel--;
40-
if (EditorGUI.EndChangeCheck())
60+
EditorGUI.BeginDisabledGroup(Application.isPlaying);
4161
{
42-
m_RequireReload = true;
62+
EditorGUILayout.PropertyField(so.FindProperty("m_UseChildSensors"), true);
4363
}
64+
EditorGUI.EndDisabledGroup();
65+
66+
EditorGUI.indentLevel--;
67+
m_RequireReload = EditorGUI.EndChangeCheck();
4468
DisplayFailedModelChecks();
4569
so.ApplyModifiedProperties();
70+
71+
if (needPolicyUpdate)
72+
{
73+
UpdateAgentPolicy();
74+
}
4675
}
4776

4877
/// <summary>
@@ -87,5 +116,21 @@ void DisplayFailedModelChecks()
87116
}
88117
}
89118
}
119+
120+
void UpdateAgentPolicy()
121+
{
122+
if (Application.isPlaying)
123+
{
124+
var behaviorParameters = (BehaviorParameters)target;
125+
var agent = behaviorParameters.GetComponent<Agent>();
126+
if (agent == null)
127+
{
128+
return;
129+
}
130+
131+
agent.ReloadPolicy();
132+
133+
}
134+
}
90135
}
91136
}

com.unity.ml-agents/Runtime/Agent.cs

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -119,30 +119,6 @@ internal struct AgentParameters
119119
public int maxStep;
120120
}
121121

122-
/// <summary>
123-
/// The team ID for this Agent.
124-
/// </summary>
125-
public int TeamId
126-
{
127-
get
128-
{
129-
LazyInitialize();
130-
return m_PolicyFactory.TeamId;
131-
}
132-
}
133-
134-
/// <summary>
135-
/// The name of the behavior of the Agent.
136-
/// </summary>
137-
public string BehaviorName
138-
{
139-
get
140-
{
141-
LazyInitialize();
142-
return m_PolicyFactory.behaviorName;
143-
}
144-
}
145-
146122
[SerializeField][HideInInspector]
147123
internal AgentParameters agentParameters;
148124
[SerializeField][HideInInspector]
@@ -384,25 +360,39 @@ public void SetModel(
384360
NNModel model,
385361
InferenceDevice inferenceDevice = InferenceDevice.CPU)
386362
{
387-
m_PolicyFactory.GiveModel(behaviorName, model, inferenceDevice);
388-
m_Brain?.Dispose();
389-
m_Brain = m_PolicyFactory.GeneratePolicy(Heuristic);
363+
if (behaviorName == m_PolicyFactory.behaviorName &&
364+
model == m_PolicyFactory.model &&
365+
inferenceDevice == m_PolicyFactory.inferenceDevice)
366+
{
367+
// If everything is the same, don't make any changes.
368+
return;
369+
}
370+
371+
m_PolicyFactory.model = model;
372+
m_PolicyFactory.inferenceDevice = inferenceDevice;
373+
m_PolicyFactory.behaviorName = behaviorName;
374+
ReloadPolicy();
390375
}
391376

392377
/// <summary>
393378
/// Updates the type of behavior for the agent.
394379
/// </summary>
395-
/// <param name="behaviorType"> The new behaviorType for the Agent
396-
/// </param>
380+
/// <param name="behaviorType"> The new behaviorType for the Agent.</param>
397381
public void SetBehaviorType(BehaviorType behaviorType)
398382
{
399-
if (m_PolicyFactory.m_BehaviorType == behaviorType)
383+
if (m_PolicyFactory.behaviorType == behaviorType)
400384
{
401385
return;
402386
}
403-
m_PolicyFactory.m_BehaviorType = behaviorType;
387+
m_PolicyFactory.behaviorType = behaviorType;
388+
ReloadPolicy();
389+
}
390+
391+
internal void ReloadPolicy()
392+
{
404393
m_Brain?.Dispose();
405394
m_Brain = m_PolicyFactory.GeneratePolicy(Heuristic);
395+
406396
}
407397

408398
/// <summary>
@@ -606,7 +596,6 @@ void SendInfoToBrain()
606596
{
607597
throw new UnityAgentsException("Call to SendInfoToBrain when Agent hasn't been initialized." +
608598
"Please ensure that you are calling 'base.OnEnable()' if you have overridden OnEnable.");
609-
610599
}
611600

612601
if (m_Brain == null)

com.unity.ml-agents/Runtime/Policies/BehaviorParameters.cs

Lines changed: 67 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -35,66 +35,97 @@ public enum BehaviorType
3535
/// The Factory to generate policies.
3636
/// </summary>
3737
[AddComponentMenu("ML Agents/Behavior Parameters", (int)MenuGroup.Default)]
38-
internal class BehaviorParameters : MonoBehaviour
38+
public class BehaviorParameters : MonoBehaviour
3939
{
40-
[HideInInspector]
41-
[SerializeField]
40+
[HideInInspector, SerializeField]
4241
BrainParameters m_BrainParameters = new BrainParameters();
43-
[HideInInspector]
44-
[SerializeField]
45-
NNModel m_Model;
46-
[HideInInspector]
47-
[SerializeField]
48-
InferenceDevice m_InferenceDevice;
49-
[HideInInspector]
50-
[SerializeField]
5142

52-
// Disable warning /com.unity.ml-agents/Runtime/Policy/BehaviorParameters.cs(...):
53-
// warning CS0649: Field 'BehaviorParameters.m_BehaviorType' is never assigned to,
54-
// and will always have its default value
55-
// This field is set in the custom editor.
56-
#pragma warning disable 0649
57-
internal BehaviorType m_BehaviorType;
58-
#pragma warning restore 0649
59-
[HideInInspector]
60-
[SerializeField]
61-
string m_BehaviorName = "My Behavior";
43+
/// <summary>
44+
/// The associated <see cref="BrainParameters"/> for this behavior.
45+
/// </summary>
46+
public BrainParameters brainParameters
47+
{
48+
get { return m_BrainParameters; }
49+
internal set { m_BrainParameters = value; }
50+
}
51+
52+
[HideInInspector, SerializeField]
53+
NNModel m_Model;
6254

6355
/// <summary>
64-
/// The team ID for this behavior.
56+
/// The neural network model used when in inference mode.
57+
/// This cannot be set directly; use <see cref="Agent.GiveModel(string,NNModel,InferenceDevice)"/>
58+
/// to set it.
6559
/// </summary>
66-
[HideInInspector, SerializeField, FormerlySerializedAs("m_TeamID")]
67-
public int TeamId;
60+
public NNModel model
61+
{
62+
get { return m_Model; }
63+
internal set { m_Model = value; }
64+
}
6865

69-
[FormerlySerializedAs("m_useChildSensors")]
70-
[HideInInspector]
71-
[SerializeField]
72-
[Tooltip("Use all Sensor components attached to child GameObjects of this Agent.")]
73-
bool m_UseChildSensors = true;
66+
[HideInInspector, SerializeField]
67+
InferenceDevice m_InferenceDevice;
7468

7569
/// <summary>
76-
/// The associated <see cref="BrainParameters"/> for this behavior.
70+
/// How inference is performed for this Agent's model.
71+
/// This cannot be set directly; use <see cref="Agent.GiveModel(string,NNModel,InferenceDevice)"/>
72+
/// to set it.
7773
/// </summary>
78-
internal BrainParameters brainParameters
74+
public InferenceDevice inferenceDevice
7975
{
80-
get { return m_BrainParameters; }
76+
get { return m_InferenceDevice; }
77+
internal set { m_InferenceDevice = value; }
8178
}
8279

80+
[HideInInspector, SerializeField]
81+
BehaviorType m_BehaviorType;
82+
8383
/// <summary>
84-
/// Whether or not to use all the sensor components attached to child GameObjects of the agent.
84+
/// The BehaviorType for the Agent.
85+
/// This cannot be set directly; use <see cref="Agent.SetBehaviorType(BehaviorType)"/>
86+
/// to set it.
8587
/// </summary>
86-
public bool useChildSensors
88+
public BehaviorType behaviorType
8789
{
88-
get { return m_UseChildSensors; }
90+
get { return m_BehaviorType; }
91+
internal set { m_BehaviorType = value; }
8992
}
9093

94+
[HideInInspector, SerializeField]
95+
string m_BehaviorName = "My Behavior";
96+
9197
/// <summary>
9298
/// The name of this behavior, which is used as a base name. See
9399
/// <see cref="fullyQualifiedBehaviorName"/> for the full name.
100+
/// This cannot be set directly; use <see cref="Agent.GiveModel(string,NNModel,InferenceDevice)"/>
101+
/// to set it.
94102
/// </summary>
95103
public string behaviorName
96104
{
97105
get { return m_BehaviorName; }
106+
internal set { m_BehaviorName = value; }
107+
}
108+
109+
/// <summary>
110+
/// The team ID for this behavior.
111+
/// </summary>
112+
[HideInInspector, SerializeField, FormerlySerializedAs("m_TeamID")]
113+
public int TeamId;
114+
// TODO properties here instead of Agent
115+
116+
[FormerlySerializedAs("m_useChildSensors")]
117+
[HideInInspector]
118+
[SerializeField]
119+
[Tooltip("Use all Sensor components attached to child GameObjects of this Agent.")]
120+
bool m_UseChildSensors = true;
121+
122+
/// <summary>
123+
/// Whether or not to use all the sensor components attached to child GameObjects of the agent.
124+
/// </summary>
125+
public bool useChildSensors
126+
{
127+
get { return m_UseChildSensors; }
128+
internal set { m_UseChildSensors = value; } // TODO make public, don't allow changes at runtime
98129
}
99130

100131
/// <summary>
@@ -105,7 +136,7 @@ public string fullyQualifiedBehaviorName
105136
get { return m_BehaviorName + "?team=" + TeamId; }
106137
}
107138

108-
public IPolicy GeneratePolicy(Func<float[]> heuristic)
139+
internal IPolicy GeneratePolicy(Func<float[]> heuristic)
109140
{
110141
switch (m_BehaviorType)
111142
{
@@ -130,21 +161,5 @@ public IPolicy GeneratePolicy(Func<float[]> heuristic)
130161
return new HeuristicPolicy(heuristic);
131162
}
132163
}
133-
134-
/// <summary>
135-
/// Updates the model and related details for this behavior.
136-
/// </summary>
137-
/// <param name="newBehaviorName">New name for the behavior.</param>
138-
/// <param name="model">New neural network model for this behavior.</param>
139-
/// <param name="inferenceDevice">New inference device for this behavior.</param>
140-
public void GiveModel(
141-
string newBehaviorName,
142-
NNModel model,
143-
InferenceDevice inferenceDevice = InferenceDevice.CPU)
144-
{
145-
m_Model = model;
146-
m_InferenceDevice = inferenceDevice;
147-
m_BehaviorName = newBehaviorName;
148-
}
149164
}
150165
}

com.unity.ml-agents/Runtime/Policies/BrainParameters.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace MLAgents.Policies
66
/// <summary>
77
/// Whether the action space is discrete or continuous.
88
/// </summary>
9-
internal enum SpaceType
9+
public enum SpaceType
1010
{
1111
/// <summary>
1212
/// Discrete action space: a fixed number of options are available.
@@ -24,7 +24,7 @@ internal enum SpaceType
2424
/// decision process.
2525
/// </summary>
2626
[Serializable]
27-
internal class BrainParameters
27+
public class BrainParameters
2828
{
2929
/// <summary>
3030
/// If continuous : The length of the float vector that represents the state.

0 commit comments

Comments
 (0)