Unity 机器学习代理工具包 (ML-Agents) 是一个开源项目,它使游戏和模拟能够作为训练智能代理的环境。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

144 行
4.7 KiB

using UnityEngine;
using UnityEditor;
using System;
using System.Linq;
using UnityEditor.SceneManagement;
namespace MLAgents
{
[CustomPropertyDrawer(typeof(ResetParameters))]
public class ResetParameterDrawer : PropertyDrawer
{
private ResetParameters _Dictionary;
private const float lineHeight = 17f;
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
CheckInitialize(property, label);
return (_Dictionary.Count + 2) * lineHeight;
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
CheckInitialize(property, label);
position.height = lineHeight;
EditorGUI.LabelField(position, label);
EditorGUI.BeginProperty(position, label, property);
foreach (var item in _Dictionary)
{
var key = item.Key;
var value = item.Value;
position.y += lineHeight;
// This is the rectangle for the key
var keyRect = position;
keyRect.x += 20;
keyRect.width /= 2;
keyRect.width -= 24;
EditorGUI.BeginChangeCheck();
var newKey = EditorGUI.TextField(keyRect, key);
if (EditorGUI.EndChangeCheck())
{
EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
try
{
_Dictionary.Remove(key);
_Dictionary.Add(newKey, value);
}
catch (Exception e)
{
Debug.Log(e.Message);
}
break;
}
// This is the Rectangle for the value
var valueRect = position;
valueRect.x = position.width / 2 + 15;
valueRect.width = keyRect.width - 18;
EditorGUI.BeginChangeCheck();
value = EditorGUI.FloatField(valueRect, value);
if (EditorGUI.EndChangeCheck())
{
EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
_Dictionary[key] = value;
break;
}
}
// This is the rectangle for the Add button
position.y += lineHeight;
var AddButtonRect = position;
AddButtonRect.x += 20;
AddButtonRect.width /= 2;
AddButtonRect.width -= 24;
if (GUI.Button(AddButtonRect, new GUIContent("Add New",
"Add a new item to the default reset paramters"), EditorStyles.miniButton))
{
EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
AddNewItem();
}
// This is the rectangle for the Remove button
var RemoveButtonRect = position;
RemoveButtonRect.x = position.width / 2 + 15;
RemoveButtonRect.width = AddButtonRect.width - 18;
if (GUI.Button(RemoveButtonRect, new GUIContent("Remove Last",
"Remove the last item to the default reset paramters"), EditorStyles.miniButton))
{
EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
RemoveLastItem();
}
EditorGUI.EndProperty();
}
private void CheckInitialize(SerializedProperty property, GUIContent label)
{
if (_Dictionary == null)
{
var target = property.serializedObject.targetObject;
_Dictionary = fieldInfo.GetValue(target) as ResetParameters;
if (_Dictionary == null)
{
_Dictionary = new ResetParameters();
fieldInfo.SetValue(target, _Dictionary);
}
}
}
private void ClearResetParamters()
{
_Dictionary.Clear();
}
private void RemoveLastItem()
{
if (_Dictionary.Count > 0)
{
string key = _Dictionary.Keys.ToList()[_Dictionary.Count - 1];
_Dictionary.Remove(key);
}
}
private void AddNewItem()
{
string key = "Param-" + _Dictionary.Count.ToString();
var value = default(float);
try
{
_Dictionary.Add(key, value);
}
catch (Exception e)
{
Debug.Log(e.Message);
}
}
}
}