您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
68 行
2.7 KiB
68 行
2.7 KiB
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
using UnityEditor;
|
|
using System.Linq;
|
|
/*
|
|
This code is meant to modify the behavior of the inspector on Brain Components.
|
|
Depending on the type of brain that is used, the available fields will be modified in the inspector accordingly.
|
|
*/
|
|
[CustomEditor(typeof(Agent), true)]
|
|
[CanEditMultipleObjects]
|
|
public class AgentEditor : Editor
|
|
{
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
SerializedObject serializedAgent = serializedObject;
|
|
serializedAgent.Update();
|
|
|
|
SerializedProperty brain = serializedAgent.FindProperty("brain");
|
|
|
|
SerializedProperty actionsPerDecision = serializedAgent.FindProperty("agentParameters.numberOfActionsBetweenDecisions");
|
|
SerializedProperty maxSteps = serializedAgent.FindProperty("agentParameters.maxStep");
|
|
SerializedProperty isResetOnDone = serializedAgent.FindProperty("agentParameters.resetOnDone");
|
|
SerializedProperty isEBS = serializedAgent.FindProperty("agentParameters.onDemandDecision");
|
|
SerializedProperty cameras = serializedAgent.FindProperty("agentParameters.agentCameras");
|
|
|
|
EditorGUILayout.PropertyField(brain);
|
|
|
|
EditorGUILayout.LabelField("Agent Cameras");
|
|
for (int i = 0; i < cameras.arraySize; i++)
|
|
{
|
|
EditorGUILayout.PropertyField(cameras.GetArrayElementAtIndex(i), new GUIContent("Camera " + (i + 1).ToString() + ": "));
|
|
}
|
|
EditorGUILayout.BeginHorizontal();
|
|
if (GUILayout.Button("Add Camera", EditorStyles.miniButton))
|
|
{
|
|
cameras.arraySize++;
|
|
}
|
|
if (GUILayout.Button("Remove Camera", EditorStyles.miniButton))
|
|
{
|
|
cameras.arraySize--;
|
|
}
|
|
EditorGUILayout.EndHorizontal();
|
|
|
|
EditorGUILayout.PropertyField(maxSteps, new GUIContent("Max Step",
|
|
"The per-agent maximum number of steps."));
|
|
EditorGUILayout.PropertyField(isResetOnDone, new GUIContent("Reset On Done",
|
|
"If checked, the agent will reset on done. Else, AgentOnDone() will be called."));
|
|
EditorGUILayout.PropertyField(isEBS, new GUIContent("On Demand Decision", "If checked, you must manually request decisions."));
|
|
if (!isEBS.boolValue)
|
|
{
|
|
EditorGUILayout.PropertyField(actionsPerDecision, new GUIContent("Decision Frequency", "The agent will automatically request a " +
|
|
"decision every X steps and perform an action at every step."));
|
|
actionsPerDecision.intValue = Mathf.Max(1, actionsPerDecision.intValue);
|
|
}
|
|
|
|
serializedAgent.ApplyModifiedProperties();
|
|
|
|
EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
|
|
base.OnInspectorGUI();
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|