using UnityEngine; using UnityEditor; namespace MLAgents { /// /// CustomEditor for the Heuristic Brain class. Defines the default Inspector view for a /// HeuristicBrain. /// Shows the BrainParameters of the Brain and expose a tool to deep copy BrainParameters /// between brains. Provides a drag box for a Decision Monoscript that will be used by /// the Heuristic Brain. /// [CustomEditor(typeof(HeuristicBrain))] public class HeuristicBrainEditor : BrainEditor { public override void OnInspectorGUI() { EditorGUILayout.LabelField("Heuristic Brain", EditorStyles.boldLabel); var brain = (HeuristicBrain)target; base.OnInspectorGUI(); // Expose the Heuristic Brain's Monoscript for decision in a drag and drop box. brain.decisionScript = EditorGUILayout.ObjectField( "Decision Script", brain.decisionScript, typeof(MonoScript), true) as MonoScript; CheckIsDecision(brain); // Draw an error box if the Decision is not set. if (brain.decisionScript == null) { EditorGUILayout.HelpBox("You need to add a 'Decision' component to this Object", MessageType.Error); } } /// /// Ensures tht the Monoscript for the decision of the HeuristicBrain is either null or /// an implementation of Decision. If the Monoscript is not an implementation of /// Decision, it will be set to null. /// /// The HeuristicBrain with the decision script attached private static void CheckIsDecision(HeuristicBrain brain) { if (brain.decisionScript != null) { var decisionInstance = (CreateInstance(brain.decisionScript.name) as Decision); if (decisionInstance == null) { Debug.LogError( "Instance of " + brain.decisionScript.name + " couldn't be created. " + "The script class needs to derive from Decision."); brain.decisionScript = null; } } } } }