|
using UnityEditor; |
|
using Unity.MLAgents.Editor; |
|
using Unity.MLAgents.Extensions.Sensors; |
|
|
|
namespace Unity.MLAgents.Extensions.Editor |
|
{ |
|
[CustomEditor(typeof(RigidBodySensorComponent))] |
|
[CanEditMultipleObjects] |
|
internal class RigidBodySensorComponentEditor : UnityEditor.Editor |
|
{ |
|
bool ShowHierarchy = true; |
|
|
|
public override void OnInspectorGUI() |
|
{ |
|
var so = serializedObject; |
|
so.Update(); |
|
|
|
var rbSensorComp = so.targetObject as RigidBodySensorComponent; |
|
if (rbSensorComp.IsTrivial()) |
|
{ |
|
EditorGUILayout.HelpBox( |
|
"The Root Body has no Joints, and the Virtual Root is null or the same as the " + |
|
"Root Body's GameObject. This will not generate any useful observations; they will always " + |
|
"be the identity values. Consider removing this component since it won't help the Agent.", |
|
MessageType.Warning |
|
); |
|
} |
|
|
|
bool requireExtractorUpdate; |
|
|
|
EditorGUI.BeginDisabledGroup(!EditorUtilities.CanUpdateModelProperties()); |
|
{ |
|
|
|
|
|
EditorGUI.BeginChangeCheck(); |
|
EditorGUILayout.PropertyField(so.FindProperty("RootBody"), true); |
|
EditorGUILayout.PropertyField(so.FindProperty("VirtualRoot"), true); |
|
|
|
|
|
requireExtractorUpdate = EditorGUI.EndChangeCheck(); |
|
|
|
EditorGUILayout.PropertyField(so.FindProperty("Settings"), true); |
|
|
|
|
|
ShowHierarchy = EditorGUILayout.Foldout(ShowHierarchy, "Hierarchy", true); |
|
if (ShowHierarchy) |
|
{ |
|
var treeNodes = rbSensorComp.GetDisplayNodes(); |
|
var originalIndent = EditorGUI.indentLevel; |
|
foreach (var node in treeNodes) |
|
{ |
|
var obj = node.NodeObject; |
|
var objContents = EditorGUIUtility.ObjectContent(obj, obj.GetType()); |
|
EditorGUI.indentLevel = originalIndent + node.Depth; |
|
var enabled = EditorGUILayout.Toggle(objContents, node.Enabled); |
|
rbSensorComp.SetPoseEnabled(node.OriginalIndex, enabled); |
|
} |
|
|
|
EditorGUI.indentLevel = originalIndent; |
|
} |
|
|
|
EditorGUILayout.PropertyField(so.FindProperty("sensorName"), true); |
|
} |
|
EditorGUI.EndDisabledGroup(); |
|
|
|
so.ApplyModifiedProperties(); |
|
if (requireExtractorUpdate) |
|
{ |
|
rbSensorComp.ResetPoseExtractor(); |
|
} |
|
} |
|
} |
|
} |
|
|