您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
114 行
4.7 KiB
114 行
4.7 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using UnityEngine.Perception.Randomization;
|
|
|
|
namespace UnityEditor.Perception.Randomization
|
|
{
|
|
[CustomEditor(typeof(Randomizer))]
|
|
public class RandomizerEditor : Editor
|
|
{
|
|
struct RandomizationTarget
|
|
{
|
|
public GameObject GameObject;
|
|
public Type ComponentType;
|
|
public string FloatFieldName;
|
|
public TargetKind TargetKind;
|
|
}
|
|
public override void OnInspectorGUI()
|
|
{
|
|
base.OnInspectorGUI();
|
|
if (EditorGUILayout.DropdownButton(new GUIContent("Add parameter"), FocusType.Keyboard))
|
|
{
|
|
var lastRect = GUILayoutUtility.GetLastRect();
|
|
var dropdownOptions = GatherOptions().ToArray();
|
|
var menu = new GenericMenu();
|
|
foreach (var option in dropdownOptions)
|
|
{
|
|
var localOption = option;
|
|
menu.AddItem(new GUIContent($"{option.GameObject.name}.{option.ComponentType.Name}.{option.FloatFieldName}"),
|
|
false,
|
|
() => AddParameter(localOption));
|
|
}
|
|
menu.DropDown(lastRect);
|
|
}
|
|
}
|
|
|
|
void AddParameter(RandomizationTarget localOption)
|
|
{
|
|
var entriesProp = this.serializedObject.FindProperty(nameof(Randomizer.randomizationEntries));
|
|
var newIndex = entriesProp.arraySize;
|
|
entriesProp.InsertArrayElementAtIndex(newIndex);
|
|
var element = entriesProp.GetArrayElementAtIndex(newIndex);
|
|
element.FindPropertyRelative(nameof(RandomizationEntry.GameObject)).objectReferenceValue = localOption.GameObject;
|
|
element.FindPropertyRelative(nameof(RandomizationEntry.ComponentType)).stringValue =
|
|
$"{localOption.ComponentType.FullName}, {localOption.ComponentType.Assembly.FullName}";
|
|
element.FindPropertyRelative(nameof(RandomizationEntry.MemberName)).stringValue = localOption.FloatFieldName;
|
|
var targetKindProp = element.FindPropertyRelative(nameof(RandomizationEntry.TargetKind));
|
|
targetKindProp.enumValueIndex = (int)localOption.TargetKind;
|
|
element.FindPropertyRelative(nameof(RandomizationEntry.Min)).floatValue = 0f;
|
|
element.FindPropertyRelative(nameof(RandomizationEntry.Max)).floatValue = 1f;
|
|
serializedObject.ApplyModifiedProperties();
|
|
}
|
|
|
|
IEnumerable<RandomizationTarget> GatherOptions()
|
|
{
|
|
var randomizer = (Randomizer)this.target;
|
|
var targetScene = randomizer.gameObject.scene;
|
|
var rootGameObjects = targetScene.GetRootGameObjects();
|
|
foreach (var rootGameObject in rootGameObjects)
|
|
{
|
|
foreach (var randomizationTarget in GatherOptions(rootGameObject.transform))
|
|
{
|
|
yield return randomizationTarget;
|
|
}
|
|
}
|
|
}
|
|
|
|
IEnumerable<RandomizationTarget> GatherOptions(Transform parent)
|
|
{
|
|
foreach (var component in parent.GetComponents<Component>())
|
|
{
|
|
if (component == null)
|
|
continue;
|
|
|
|
var componentType = component.GetType();
|
|
var fieldInfos = componentType.GetFields();
|
|
|
|
foreach (var fieldInfo in fieldInfos)
|
|
{
|
|
if (fieldInfo.FieldType == typeof(float))
|
|
yield return new RandomizationTarget()
|
|
{
|
|
ComponentType = componentType,
|
|
FloatFieldName = fieldInfo.Name,
|
|
TargetKind = TargetKind.Field,
|
|
GameObject = parent.gameObject
|
|
};
|
|
}
|
|
var propertyInfos = componentType.GetProperties();
|
|
|
|
foreach (var propertyInfo in propertyInfos)
|
|
{
|
|
if (propertyInfo.PropertyType == typeof(float))
|
|
yield return new RandomizationTarget()
|
|
{
|
|
ComponentType = componentType,
|
|
FloatFieldName = propertyInfo.Name,
|
|
TargetKind = TargetKind.Property,
|
|
GameObject = parent.gameObject
|
|
};
|
|
}
|
|
}
|
|
for (int i = 0; i < parent.transform.childCount; i++)
|
|
{
|
|
foreach (var childOption in GatherOptions(parent.transform.GetChild(i)))
|
|
{
|
|
yield return childOption;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|