Steven Leal
4 年前
当前提交
228032f4
共有 34 个文件被更改,包括 433 次插入 和 475 次删除
-
20com.unity.perception/Editor/Randomization/Editors/ParameterListEditor.cs
-
11com.unity.perception/Editor/Randomization/Uxml/ParameterListItemElement.uxml
-
2com.unity.perception/Editor/Randomization/Uxml/ParameterListEditor.uxml
-
14com.unity.perception/Editor/Randomization/VisualElements/ParameterDragManipulator.cs
-
9com.unity.perception/Runtime/Randomization/ParameterBehaviours/Configuration/ParameterTarget.cs
-
38com.unity.perception/Runtime/Randomization/ParameterBehaviours/ParameterBehaviour.cs
-
18com.unity.perception/Runtime/Randomization/Parameters/Parameter.cs
-
16com.unity.perception/Runtime/Randomization/Samplers/SamplerTypes/ConstantSampler.cs
-
21com.unity.perception/Runtime/Randomization/Samplers/SamplerTypes/NormalSampler.cs
-
21com.unity.perception/Runtime/Randomization/Samplers/SamplerTypes/UniformSampler.cs
-
26com.unity.perception/Runtime/Randomization/Scenarios/ScenarioBase.cs
-
12com.unity.perception/Runtime/Randomization/Scenarios/ScenarioBase.cs.meta
-
10com.unity.perception/Tests/Runtime/Randomization/ParameterConfigurationTests.cs
-
10com.unity.perception/Tests/Runtime/Randomization/ScenarioTests.cs
-
180com.unity.perception/Editor/Randomization/VisualElements/ParameterListItemElement.cs
-
105com.unity.perception/Runtime/Randomization/ParameterBehaviours/Configuration/ParameterList.cs
-
11com.unity.perception/Runtime/Randomization/ParameterBehaviours/Configuration/ParameterListException.cs
-
28com.unity.perception/Runtime/Randomization/ParameterBehaviours/Configuration/ParameterListItem.cs
-
212com.unity.perception/Editor/Randomization/VisualElements/ConfiguredParameterElement.cs
-
28com.unity.perception/Runtime/Randomization/ParameterBehaviours/Configuration/ConfiguredParameter.cs
-
105com.unity.perception/Runtime/Randomization/ParameterBehaviours/Configuration/ParameterConfiguration.cs
-
11com.unity.perception/Runtime/Randomization/ParameterBehaviours/Configuration/ParameterConfigurationException.cs
-
0/com.unity.perception/Editor/Randomization/Editors/ParameterListEditor.cs.meta
-
0/com.unity.perception/Editor/Randomization/Editors/ParameterListEditor.cs
-
0/com.unity.perception/Editor/Randomization/Uss/ParameterListStyles.uss
-
0/com.unity.perception/Editor/Randomization/Uss/ParameterListStyles.uss.meta
-
0/com.unity.perception/Editor/Randomization/Uxml/ParameterListItemElement.uxml.meta
-
0/com.unity.perception/Editor/Randomization/Uxml/ParameterListEditor.uxml.meta
-
0/com.unity.perception/Editor/Randomization/Uxml/ParameterListItemElement.uxml
-
0/com.unity.perception/Editor/Randomization/Uxml/ParameterListEditor.uxml
-
0/com.unity.perception/Editor/Randomization/VisualElements/ParameterListItemElement.cs.meta
-
0/com.unity.perception/Runtime/Randomization/ParameterBehaviours/Configuration/ParameterListItem.cs.meta
-
0/com.unity.perception/Runtime/Randomization/ParameterBehaviours/Configuration/ParameterList.cs.meta
-
0/com.unity.perception/Runtime/Randomization/ParameterBehaviours/Configuration/ParameterListException.cs.meta
|
|||
fileFormatVersion: 2 |
|||
fileFormatVersion: 2 |
|||
timeCreated: 1589772146 |
|||
MonoImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using UnityEditor; |
|||
using UnityEditor.UIElements; |
|||
using UnityEngine.Perception.Randomization.ParameterBehaviours; |
|||
using UnityEngine.Perception.Randomization.Parameters; |
|||
using UnityEngine.UIElements; |
|||
|
|||
namespace UnityEngine.Perception.Randomization.Editor |
|||
{ |
|||
class ParameterListItemElement : VisualElement |
|||
{ |
|||
Type m_ParameterSampleType; |
|||
VisualElement m_Properties; |
|||
VisualElement m_TargetContainer; |
|||
ToolbarMenu m_TargetPropertyMenu; |
|||
SerializedProperty m_SerializedProperty; |
|||
SerializedProperty m_Collapsed; |
|||
SerializedProperty m_Target; |
|||
SerializedProperty m_TargetComponent; |
|||
SerializedProperty m_TargetProperty; |
|||
|
|||
const string k_CollapsedParameterClass = "collapsed-parameter"; |
|||
|
|||
public ParameterListEditor configEditor { get; } |
|||
|
|||
public int ParameterIndex => parent.IndexOf(this); |
|||
|
|||
GameObject gameObject => ((ParameterList)m_SerializedProperty.serializedObject.targetObject).gameObject; |
|||
GameObject targetGameObject => m_TargetComponent.objectReferenceValue != null |
|||
? ((Component)m_TargetComponent.objectReferenceValue).gameObject : null; |
|||
|
|||
public bool collapsed |
|||
{ |
|||
get => m_Collapsed.boolValue; |
|||
set |
|||
{ |
|||
m_Collapsed.boolValue = value; |
|||
m_SerializedProperty.serializedObject.ApplyModifiedProperties(); |
|||
if (value) |
|||
AddToClassList(k_CollapsedParameterClass); |
|||
else |
|||
RemoveFromClassList(k_CollapsedParameterClass); |
|||
} |
|||
} |
|||
|
|||
public bool filtered |
|||
{ |
|||
set => style.display = value |
|||
? new StyleEnum<DisplayStyle>(DisplayStyle.Flex) |
|||
: new StyleEnum<DisplayStyle>(DisplayStyle.None); |
|||
} |
|||
|
|||
public ParameterListItemElement(SerializedProperty property, ParameterListEditor config) |
|||
{ |
|||
configEditor = config; |
|||
var template = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>( |
|||
$"{StaticData.uxmlDir}/ParameterListItemElement.uxml"); |
|||
template.CloneTree(this); |
|||
|
|||
m_SerializedProperty = property; |
|||
var parameterProperty = m_SerializedProperty.FindPropertyRelative("parameter"); |
|||
var parameter = (Parameter)StaticData.GetManagedReferenceValue(parameterProperty); |
|||
m_ParameterSampleType = parameter.sampleType; |
|||
m_Collapsed = parameterProperty.FindPropertyRelative("collapsed"); |
|||
m_Target = m_SerializedProperty.FindPropertyRelative("target"); |
|||
m_TargetComponent = m_Target.FindPropertyRelative("component"); |
|||
m_TargetProperty = m_Target.FindPropertyRelative("propertyName"); |
|||
|
|||
this.AddManipulator(new ParameterDragManipulator()); |
|||
|
|||
var removeButton = this.Q<Button>("remove-parameter"); |
|||
removeButton.RegisterCallback<MouseUpEvent>(evt => configEditor.RemoveParameter(this)); |
|||
|
|||
var parameterTypeLabel = this.Query<Label>("parameter-type-label").First(); |
|||
parameterTypeLabel.text = Parameter.GetDisplayName(parameter.GetType()); |
|||
|
|||
var parameterNameField = this.Q<TextField>("name"); |
|||
parameterNameField.isDelayed = true; |
|||
parameterNameField.BindProperty(m_SerializedProperty.FindPropertyRelative("name")); |
|||
|
|||
var targetObj = targetGameObject; |
|||
if (targetObj == null) |
|||
m_TargetProperty.stringValue = string.Empty; |
|||
else if (targetObj != gameObject) |
|||
{ |
|||
var component = (Component)m_TargetComponent.objectReferenceValue; |
|||
m_TargetComponent.objectReferenceValue = gameObject.GetComponent(component.GetType()); |
|||
m_SerializedProperty.serializedObject.ApplyModifiedPropertiesWithoutUndo(); |
|||
} |
|||
m_TargetPropertyMenu = this.Q<ToolbarMenu>("property-select-menu"); |
|||
FillPropertySelectMenu(); |
|||
|
|||
var frequencyField = this.Q<EnumField>("application-frequency"); |
|||
frequencyField.Init(ParameterApplicationFrequency.OnIterationStart); |
|||
var applicationFrequency = m_Target.FindPropertyRelative("applicationFrequency"); |
|||
frequencyField.BindProperty(applicationFrequency); |
|||
|
|||
var collapseToggle = this.Q<VisualElement>("collapse"); |
|||
collapseToggle.RegisterCallback<MouseUpEvent>(evt => collapsed = !collapsed); |
|||
|
|||
var parameterProperties = this.Q<VisualElement>("properties"); |
|||
parameterProperties.Add(new ParameterElement(m_SerializedProperty.FindPropertyRelative("parameter"))); |
|||
} |
|||
|
|||
void SetTarget(ParameterTarget newTarget) |
|||
{ |
|||
m_Target.FindPropertyRelative("component").objectReferenceValue = newTarget.component; |
|||
m_Target.FindPropertyRelative("propertyName").stringValue = newTarget.propertyName; |
|||
m_Target.FindPropertyRelative("fieldOrProperty").intValue = (int)newTarget.fieldOrProperty; |
|||
m_SerializedProperty.serializedObject.ApplyModifiedProperties(); |
|||
m_TargetPropertyMenu.text = TargetPropertyDisplayText(newTarget.component, newTarget.propertyName); |
|||
} |
|||
|
|||
static string TargetPropertyDisplayText(Component component, string propertyName) |
|||
{ |
|||
return $"{component.GetType().Name}.{propertyName}"; |
|||
} |
|||
|
|||
void FillPropertySelectMenu() |
|||
{ |
|||
m_TargetPropertyMenu.menu.MenuItems().Clear(); |
|||
var options = GatherPropertyOptions(m_ParameterSampleType); |
|||
if (options.Count == 0) |
|||
{ |
|||
m_TargetPropertyMenu.text = "No compatible properties"; |
|||
m_TargetPropertyMenu.SetEnabled(false); |
|||
} |
|||
else |
|||
{ |
|||
m_TargetPropertyMenu.SetEnabled(true); |
|||
foreach (var option in options) |
|||
{ |
|||
m_TargetPropertyMenu.menu.AppendAction( |
|||
TargetPropertyDisplayText(option.component, option.propertyName), |
|||
a => { SetTarget(option); }); |
|||
} |
|||
m_TargetPropertyMenu.text = m_TargetProperty.stringValue == string.Empty |
|||
? "Select a property" |
|||
: TargetPropertyDisplayText((Component)m_TargetComponent.objectReferenceValue, m_TargetProperty.stringValue); |
|||
} |
|||
} |
|||
|
|||
List<ParameterTarget> GatherPropertyOptions(Type propertyType) |
|||
{ |
|||
var obj = ((ParameterList)m_SerializedProperty.serializedObject.targetObject).gameObject; |
|||
var options = new List<ParameterTarget>(); |
|||
foreach (var component in obj.GetComponents<Component>()) |
|||
{ |
|||
if (component == null) |
|||
continue; |
|||
var componentType = component.GetType(); |
|||
var fieldInfos = componentType.GetFields(); |
|||
foreach (var fieldInfo in fieldInfos) |
|||
{ |
|||
if (fieldInfo.FieldType == propertyType && fieldInfo.IsPublic && !fieldInfo.IsInitOnly) |
|||
options.Add(new ParameterTarget() |
|||
{ |
|||
component = component, |
|||
propertyName = fieldInfo.Name, |
|||
fieldOrProperty = FieldOrProperty.Field |
|||
}); |
|||
} |
|||
|
|||
var propertyInfos = componentType.GetProperties(); |
|||
foreach (var propertyInfo in propertyInfos) |
|||
{ |
|||
if (propertyInfo.PropertyType == propertyType && propertyInfo.GetSetMethod() != null) |
|||
options.Add(new ParameterTarget() |
|||
{ |
|||
component = component, |
|||
propertyName = propertyInfo.Name, |
|||
fieldOrProperty = FieldOrProperty.Property |
|||
}); |
|||
} |
|||
} |
|||
return options; |
|||
} |
|||
} |
|||
} |
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using Randomization.ParameterBehaviours; |
|||
using UnityEngine; |
|||
using UnityEngine.Perception.Randomization.Parameters; |
|||
|
|||
namespace UnityEngine.Perception.Randomization.ParameterBehaviours |
|||
{ |
|||
/// <summary>
|
|||
/// Defines a list of parameters for randomizing simulations
|
|||
/// </summary>
|
|||
[ExecuteInEditMode] |
|||
[AddComponentMenu("Perception/Randomization/Parameter List")] |
|||
public class ParameterList : ParameterBehaviour |
|||
{ |
|||
[SerializeReference] internal List<ParameterListItem> configuredParameters = new List<ParameterListItem>(); |
|||
|
|||
public override IEnumerable<Parameter> parameters |
|||
{ |
|||
get |
|||
{ |
|||
foreach (var configParameter in configuredParameters) |
|||
yield return configParameter.parameter; |
|||
} |
|||
} |
|||
|
|||
internal ParameterListItem AddParameter<T>(string parameterName) where T : Parameter, new() |
|||
{ |
|||
var parameter = new T(); |
|||
var configParameter = new ParameterListItem { name = parameterName, parameter = parameter }; |
|||
configuredParameters.Add(configParameter); |
|||
return configParameter; |
|||
} |
|||
|
|||
internal ParameterListItem AddParameter(string parameterName, Type parameterType) |
|||
{ |
|||
if (!parameterType.IsSubclassOf(typeof(Parameter))) |
|||
throw new ParameterListException($"Cannot add non-parameter types ({parameterType})"); |
|||
var parameter = (Parameter)Activator.CreateInstance(parameterType); |
|||
var configParameter = new ParameterListItem { name = parameterName, parameter = parameter }; |
|||
configuredParameters.Add(configParameter); |
|||
return configParameter; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Find a parameter in this configuration by name
|
|||
/// </summary>
|
|||
/// <param name="parameterName">The name of the parameter to lookup</param>
|
|||
/// <param name="parameterType">The type of parameter to lookup</param>
|
|||
/// <returns>The parameter if found, null otherwise</returns>
|
|||
/// <exception cref="ParameterListException"></exception>
|
|||
public Parameter GetParameter(string parameterName, Type parameterType) |
|||
{ |
|||
foreach (var configParameter in configuredParameters) |
|||
{ |
|||
if (configParameter.name == parameterName && configParameter.parameter.GetType() == parameterType) |
|||
return configParameter.parameter; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Find a parameter in this configuration by name and type
|
|||
/// </summary>
|
|||
/// <param name="parameterName"></param>
|
|||
/// <typeparam name="T">The type of parameter to look for</typeparam>
|
|||
/// <returns>The parameter if found, null otherwise</returns>
|
|||
public T GetParameter<T>(string parameterName) where T : Parameter |
|||
{ |
|||
foreach (var configuredParameter in configuredParameters) |
|||
{ |
|||
if (configuredParameter.name == parameterName && configuredParameter.parameter is T typedParameter) |
|||
return typedParameter; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public override void OnIterationStart() |
|||
{ |
|||
foreach (var configParameter in configuredParameters) |
|||
if (configParameter.target.applicationFrequency == ParameterApplicationFrequency.OnIterationStart) |
|||
configParameter.ApplyToTarget(); |
|||
} |
|||
|
|||
public override void OnFrameStart() |
|||
{ |
|||
foreach (var configParameter in configuredParameters) |
|||
if (configParameter.target.applicationFrequency == ParameterApplicationFrequency.EveryFrame) |
|||
configParameter.ApplyToTarget(); |
|||
} |
|||
|
|||
public override void Validate() |
|||
{ |
|||
var parameterNames = new HashSet<string>(); |
|||
foreach (var configParameter in configuredParameters) |
|||
{ |
|||
if (parameterNames.Contains(configParameter.name)) |
|||
throw new ParameterListException( |
|||
$"Two or more parameters cannot share the same name (\"{configParameter.name}\")"); |
|||
parameterNames.Add(configParameter.name); |
|||
configParameter.Validate(); |
|||
} |
|||
} |
|||
} |
|||
} |
|
|||
using System; |
|||
|
|||
namespace UnityEngine.Perception.Randomization.ParameterBehaviours |
|||
{ |
|||
[Serializable] |
|||
class ParameterListException : Exception |
|||
{ |
|||
public ParameterListException(string message) : base(message) { } |
|||
public ParameterListException(string message, Exception innerException) : base(message, innerException) { } |
|||
} |
|||
} |
|
|||
using System; |
|||
using UnityEngine.Perception.Randomization.Parameters; |
|||
|
|||
namespace UnityEngine.Perception.Randomization.ParameterBehaviours |
|||
{ |
|||
[Serializable] |
|||
class ParameterListItem |
|||
{ |
|||
public string name = "Parameter"; |
|||
[SerializeReference] public Parameter parameter; |
|||
[HideInInspector, SerializeField] public ParameterTarget target = new ParameterTarget(); |
|||
|
|||
public bool hasTarget => target.component != null; |
|||
|
|||
public void ApplyToTarget() |
|||
{ |
|||
if (!hasTarget) |
|||
return; |
|||
target.ApplyValueToTarget(parameter.GenericSample()); |
|||
} |
|||
|
|||
public void Validate() |
|||
{ |
|||
target.Validate(); |
|||
parameter.Validate(); |
|||
} |
|||
} |
|||
} |
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using UnityEditor; |
|||
using UnityEditor.UIElements; |
|||
using UnityEngine.Perception.Randomization.ParameterBehaviours.Configuration; |
|||
using UnityEngine.Perception.Randomization.Parameters; |
|||
using UnityEngine.UIElements; |
|||
|
|||
namespace UnityEngine.Perception.Randomization.Editor |
|||
{ |
|||
class ConfiguredParameterElement : VisualElement |
|||
{ |
|||
bool m_Filtered; |
|||
Type m_ParameterSampleType; |
|||
|
|||
VisualElement m_Properties; |
|||
VisualElement m_TargetContainer; |
|||
ToolbarMenu m_TargetPropertyMenu; |
|||
SerializedProperty m_SerializedProperty; |
|||
SerializedProperty m_Collapsed; |
|||
SerializedProperty m_Target; |
|||
SerializedProperty m_TargetGameObject; |
|||
SerializedProperty m_TargetComponent; |
|||
SerializedProperty m_TargetProperty; |
|||
|
|||
const string k_CollapsedParameterClass = "collapsed-parameter"; |
|||
|
|||
public ParameterConfigurationEditor configEditor { get; private set; } |
|||
|
|||
public int ParameterIndex => parent.IndexOf(this); |
|||
|
|||
public bool collapsed |
|||
{ |
|||
get => m_Collapsed.boolValue; |
|||
set |
|||
{ |
|||
m_Collapsed.boolValue = value; |
|||
m_SerializedProperty.serializedObject.ApplyModifiedProperties(); |
|||
if (value) |
|||
AddToClassList(k_CollapsedParameterClass); |
|||
else |
|||
RemoveFromClassList(k_CollapsedParameterClass); |
|||
} |
|||
} |
|||
|
|||
public bool filtered |
|||
{ |
|||
get => m_Filtered; |
|||
set |
|||
{ |
|||
m_Filtered = value; |
|||
style.display = value |
|||
? new StyleEnum<DisplayStyle>(DisplayStyle.Flex) |
|||
: new StyleEnum<DisplayStyle>(DisplayStyle.None); |
|||
} |
|||
} |
|||
|
|||
public ConfiguredParameterElement(SerializedProperty property, ParameterConfigurationEditor config) |
|||
{ |
|||
configEditor = config; |
|||
var template = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>( |
|||
$"{StaticData.uxmlDir}/ConfiguredParameterElement.uxml"); |
|||
template.CloneTree(this); |
|||
|
|||
m_SerializedProperty = property; |
|||
var parameterProperty = m_SerializedProperty.FindPropertyRelative("parameter"); |
|||
var parameter = (Parameter)StaticData.GetManagedReferenceValue(parameterProperty); |
|||
m_ParameterSampleType = parameter.sampleType; |
|||
m_Collapsed = parameterProperty.FindPropertyRelative("collapsed"); |
|||
m_Target = m_SerializedProperty.FindPropertyRelative("target"); |
|||
m_TargetGameObject = m_Target.FindPropertyRelative("gameObject"); |
|||
m_TargetComponent = m_Target.FindPropertyRelative("component"); |
|||
m_TargetProperty = m_Target.FindPropertyRelative("property"); |
|||
|
|||
this.AddManipulator(new ParameterDragManipulator()); |
|||
|
|||
var removeButton = this.Q<Button>("remove-parameter"); |
|||
removeButton.RegisterCallback<MouseUpEvent>(evt => configEditor.RemoveParameter(this)); |
|||
|
|||
var parameterTypeLabel = this.Query<Label>("parameter-type-label").First(); |
|||
parameterTypeLabel.text = Parameter.GetDisplayName(parameter.GetType()); |
|||
|
|||
var parameterNameField = this.Q<TextField>("name"); |
|||
parameterNameField.isDelayed = true; |
|||
parameterNameField.BindProperty(m_SerializedProperty.FindPropertyRelative("name")); |
|||
|
|||
m_TargetContainer = this.Q<VisualElement>("target-container"); |
|||
m_TargetPropertyMenu = this.Q<ToolbarMenu>("property-select-menu"); |
|||
|
|||
ToggleTargetContainer(); |
|||
|
|||
var frequencyField = this.Q<EnumField>("application-frequency"); |
|||
frequencyField.Init(ParameterApplicationFrequency.OnIterationStart); |
|||
var applicationFrequency = m_Target.FindPropertyRelative("applicationFrequency"); |
|||
frequencyField.BindProperty(applicationFrequency); |
|||
|
|||
var targetField = this.Q<ObjectField>("target"); |
|||
targetField.objectType = typeof(GameObject); |
|||
targetField.value = m_TargetGameObject.objectReferenceValue; |
|||
targetField.RegisterCallback<ChangeEvent<Object>>(evt => |
|||
{ |
|||
ClearTarget(); |
|||
var appFreqEnumIndex = applicationFrequency.intValue; |
|||
m_TargetGameObject.objectReferenceValue = (GameObject)evt.newValue; |
|||
applicationFrequency.intValue = appFreqEnumIndex; |
|||
m_SerializedProperty.serializedObject.ApplyModifiedProperties(); |
|||
ToggleTargetContainer(); |
|||
FillPropertySelectMenu(); |
|||
}); |
|||
FillPropertySelectMenu(); |
|||
|
|||
var collapseToggle = this.Q<VisualElement>("collapse"); |
|||
collapseToggle.RegisterCallback<MouseUpEvent>(evt => collapsed = !collapsed); |
|||
|
|||
var parameterProperties = this.Q<VisualElement>("properties"); |
|||
parameterProperties.Add(new ParameterElement(m_SerializedProperty.FindPropertyRelative("parameter"))); |
|||
} |
|||
|
|||
void ToggleTargetContainer() |
|||
{ |
|||
m_TargetContainer.style.display = m_TargetGameObject.objectReferenceValue == null |
|||
? new StyleEnum<DisplayStyle>(DisplayStyle.None) |
|||
: new StyleEnum<DisplayStyle>(DisplayStyle.Flex); |
|||
} |
|||
|
|||
void ClearTarget() |
|||
{ |
|||
m_Target.FindPropertyRelative("component").objectReferenceValue = null; |
|||
m_Target.FindPropertyRelative("propertyName").stringValue = string.Empty; |
|||
m_SerializedProperty.serializedObject.ApplyModifiedProperties(); |
|||
} |
|||
|
|||
void SetTarget(ParameterTarget newTarget) |
|||
{ |
|||
m_TargetGameObject.objectReferenceValue = newTarget.gameObject; |
|||
m_Target.FindPropertyRelative("component").objectReferenceValue = newTarget.component; |
|||
m_Target.FindPropertyRelative("propertyName").stringValue = newTarget.propertyName; |
|||
m_Target.FindPropertyRelative("fieldOrProperty").intValue = (int)newTarget.fieldOrProperty; |
|||
m_SerializedProperty.serializedObject.ApplyModifiedProperties(); |
|||
m_TargetPropertyMenu.text = TargetPropertyDisplayText(newTarget.component, newTarget.propertyName); |
|||
} |
|||
|
|||
static string TargetPropertyDisplayText(Component component, string propertyName) |
|||
{ |
|||
return $"{component.GetType().Name}.{propertyName}"; |
|||
} |
|||
|
|||
void FillPropertySelectMenu() |
|||
{ |
|||
if (m_TargetGameObject.objectReferenceValue == null) |
|||
return; |
|||
|
|||
m_TargetPropertyMenu.menu.MenuItems().Clear(); |
|||
var options = GatherPropertyOptions((GameObject)m_TargetGameObject.objectReferenceValue, m_ParameterSampleType); |
|||
if (options.Count == 0) |
|||
{ |
|||
m_TargetPropertyMenu.text = "No compatible properties"; |
|||
m_TargetPropertyMenu.SetEnabled(false); |
|||
} |
|||
else |
|||
{ |
|||
m_TargetPropertyMenu.SetEnabled(true); |
|||
foreach (var option in options) |
|||
{ |
|||
m_TargetPropertyMenu.menu.AppendAction( |
|||
TargetPropertyDisplayText(option.component, option.propertyName), |
|||
a => { SetTarget(option); }); |
|||
} |
|||
m_TargetPropertyMenu.text = m_TargetProperty.stringValue == string.Empty |
|||
? "Select a property" |
|||
: TargetPropertyDisplayText((Component)m_TargetComponent.objectReferenceValue, m_TargetProperty.stringValue); |
|||
} |
|||
} |
|||
|
|||
static List<ParameterTarget> GatherPropertyOptions(GameObject obj, Type propertyType) |
|||
{ |
|||
var options = new List<ParameterTarget>(); |
|||
foreach (var component in obj.GetComponents<Component>()) |
|||
{ |
|||
if (component == null) |
|||
continue; |
|||
var componentType = component.GetType(); |
|||
var fieldInfos = componentType.GetFields(); |
|||
foreach (var fieldInfo in fieldInfos) |
|||
{ |
|||
if (fieldInfo.FieldType == propertyType && fieldInfo.IsPublic && !fieldInfo.IsInitOnly) |
|||
options.Add(new ParameterTarget() |
|||
{ |
|||
gameObject = obj, |
|||
component = component, |
|||
propertyName = fieldInfo.Name, |
|||
fieldOrProperty = FieldOrProperty.Field |
|||
}); |
|||
} |
|||
|
|||
var propertyInfos = componentType.GetProperties(); |
|||
foreach (var propertyInfo in propertyInfos) |
|||
{ |
|||
if (propertyInfo.PropertyType == propertyType && propertyInfo.GetSetMethod() != null) |
|||
options.Add(new ParameterTarget() |
|||
{ |
|||
gameObject = obj, |
|||
component = component, |
|||
propertyName = propertyInfo.Name, |
|||
fieldOrProperty = FieldOrProperty.Property |
|||
}); |
|||
} |
|||
} |
|||
return options; |
|||
} |
|||
} |
|||
} |
|
|||
using System; |
|||
using UnityEngine.Perception.Randomization.Parameters; |
|||
|
|||
namespace UnityEngine.Perception.Randomization.ParameterBehaviours.Configuration |
|||
{ |
|||
[Serializable] |
|||
class ConfiguredParameter |
|||
{ |
|||
public string name = "Parameter"; |
|||
[SerializeReference] public Parameter parameter; |
|||
[HideInInspector, SerializeField] public ParameterTarget target = new ParameterTarget(); |
|||
|
|||
public bool hasTarget => target.gameObject != null; |
|||
|
|||
public void ApplyToTarget() |
|||
{ |
|||
if (!hasTarget) |
|||
return; |
|||
target.ApplyValueToTarget(parameter.GenericSample()); |
|||
} |
|||
|
|||
public void Validate() |
|||
{ |
|||
target.Validate(); |
|||
parameter.Validate(); |
|||
} |
|||
} |
|||
} |
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using Randomization.ParameterBehaviours; |
|||
using UnityEngine; |
|||
using UnityEngine.Perception.Randomization.Parameters; |
|||
|
|||
namespace UnityEngine.Perception.Randomization.ParameterBehaviours.Configuration |
|||
{ |
|||
/// <summary>
|
|||
/// Creates parameter interfaces for randomizing simulations
|
|||
/// </summary>
|
|||
[ExecuteInEditMode] |
|||
[AddComponentMenu("Perception/Randomization/ParameterConfiguration")] |
|||
public class ParameterConfiguration : ParameterBehaviour |
|||
{ |
|||
[SerializeReference] internal List<ConfiguredParameter> configuredParameters = new List<ConfiguredParameter>(); |
|||
|
|||
public override IEnumerable<Parameter> parameters |
|||
{ |
|||
get |
|||
{ |
|||
foreach (var configParameter in configuredParameters) |
|||
yield return configParameter.parameter; |
|||
} |
|||
} |
|||
|
|||
internal ConfiguredParameter AddParameter<T>(string parameterName) where T : Parameter, new() |
|||
{ |
|||
var parameter = new T(); |
|||
var configParameter = new ConfiguredParameter { name = parameterName, parameter = parameter }; |
|||
configuredParameters.Add(configParameter); |
|||
return configParameter; |
|||
} |
|||
|
|||
internal ConfiguredParameter AddParameter(string parameterName, Type parameterType) |
|||
{ |
|||
if (!parameterType.IsSubclassOf(typeof(Parameter))) |
|||
throw new ParameterConfigurationException($"Cannot add non-parameter types ({parameterType})"); |
|||
var parameter = (Parameter)Activator.CreateInstance(parameterType); |
|||
var configParameter = new ConfiguredParameter { name = parameterName, parameter = parameter }; |
|||
configuredParameters.Add(configParameter); |
|||
return configParameter; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Find a parameter in this configuration by name
|
|||
/// </summary>
|
|||
/// <param name="parameterName">The name of the parameter to lookup</param>
|
|||
/// <param name="parameterType">The type of parameter to lookup</param>
|
|||
/// <returns>The parameter if found, null otherwise</returns>
|
|||
/// <exception cref="ParameterConfigurationException"></exception>
|
|||
public Parameter GetParameter(string parameterName, Type parameterType) |
|||
{ |
|||
foreach (var configParameter in configuredParameters) |
|||
{ |
|||
if (configParameter.name == parameterName && configParameter.parameter.GetType() == parameterType) |
|||
return configParameter.parameter; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Find a parameter in this configuration by name and type
|
|||
/// </summary>
|
|||
/// <param name="parameterName"></param>
|
|||
/// <typeparam name="T">The type of parameter to look for</typeparam>
|
|||
/// <returns>The parameter if found, null otherwise</returns>
|
|||
public T GetParameter<T>(string parameterName) where T : Parameter |
|||
{ |
|||
foreach (var configuredParameter in configuredParameters) |
|||
{ |
|||
if (configuredParameter.name == parameterName && configuredParameter.parameter is T typedParameter) |
|||
return typedParameter; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public override void OnIterationStart() |
|||
{ |
|||
foreach (var configParameter in configuredParameters) |
|||
if (configParameter.target.applicationFrequency == ParameterApplicationFrequency.OnIterationStart) |
|||
configParameter.ApplyToTarget(); |
|||
} |
|||
|
|||
public override void OnFrameStart() |
|||
{ |
|||
foreach (var configParameter in configuredParameters) |
|||
if (configParameter.target.applicationFrequency == ParameterApplicationFrequency.EveryFrame) |
|||
configParameter.ApplyToTarget(); |
|||
} |
|||
|
|||
public override void Validate() |
|||
{ |
|||
var parameterNames = new HashSet<string>(); |
|||
foreach (var configParameter in configuredParameters) |
|||
{ |
|||
if (parameterNames.Contains(configParameter.name)) |
|||
throw new ParameterConfigurationException( |
|||
$"Two or more parameters cannot share the same name (\"{configParameter.name}\")"); |
|||
parameterNames.Add(configParameter.name); |
|||
configParameter.Validate(); |
|||
} |
|||
} |
|||
} |
|||
} |
|
|||
using System; |
|||
|
|||
namespace UnityEngine.Perception.Randomization.ParameterBehaviours.Configuration |
|||
{ |
|||
[Serializable] |
|||
class ParameterConfigurationException : Exception |
|||
{ |
|||
public ParameterConfigurationException(string message) : base(message) { } |
|||
public ParameterConfigurationException(string message, Exception innerException) : base(message, innerException) { } |
|||
} |
|||
} |
撰写
预览
正在加载...
取消
保存
Reference in new issue