您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
90 行
3.3 KiB
90 行
3.3 KiB
using System;
|
|
|
|
namespace UnityEngine.Experimental.Perception.Randomization.Parameters
|
|
{
|
|
/// <summary>
|
|
/// Used to apply sampled parameter values to a particular GameObject, Component, and property.
|
|
/// Typically managed by a parameter configuration.
|
|
/// </summary>
|
|
[Serializable]
|
|
public class ParameterTarget
|
|
{
|
|
[SerializeField] internal GameObject gameObject;
|
|
[SerializeField] internal Component component;
|
|
[SerializeField] internal string propertyName = string.Empty;
|
|
[SerializeField] internal FieldOrProperty fieldOrProperty = FieldOrProperty.Field;
|
|
[SerializeField] internal ParameterApplicationFrequency applicationFrequency = ParameterApplicationFrequency.OnIterationSetup;
|
|
|
|
/// <summary>
|
|
/// Assigns a new target
|
|
/// </summary>
|
|
/// <param name="targetObject">The target GameObject</param>
|
|
/// <param name="targetComponent">The target component on the target GameObject</param>
|
|
/// <param name="fieldOrPropertyName">The name of the property to apply the parameter to</param>
|
|
/// <param name="frequency">How often to apply the parameter to its target</param>
|
|
public void AssignNewTarget(
|
|
GameObject targetObject,
|
|
Component targetComponent,
|
|
string fieldOrPropertyName,
|
|
ParameterApplicationFrequency frequency)
|
|
{
|
|
gameObject = targetObject;
|
|
component = targetComponent;
|
|
propertyName = fieldOrPropertyName;
|
|
applicationFrequency = frequency;
|
|
var componentType = component.GetType();
|
|
fieldOrProperty = componentType.GetField(fieldOrPropertyName) != null
|
|
? FieldOrProperty.Field
|
|
: FieldOrProperty.Property;
|
|
}
|
|
|
|
internal void Clear()
|
|
{
|
|
gameObject = null;
|
|
component = null;
|
|
propertyName = string.Empty;
|
|
}
|
|
|
|
internal void ApplyValueToTarget(object value)
|
|
{
|
|
var componentType = component.GetType();
|
|
if (fieldOrProperty == FieldOrProperty.Field)
|
|
{
|
|
var field = componentType.GetField(propertyName);
|
|
if (field == null)
|
|
throw new ParameterValidationException(
|
|
$"Component type {componentType.Name} does not have a field named {propertyName}");
|
|
field.SetValue(component, value);
|
|
}
|
|
else
|
|
{
|
|
var property = componentType.GetProperty(propertyName);
|
|
if (property == null)
|
|
throw new ParameterValidationException(
|
|
$"Component type {componentType.Name} does not have a property named {propertyName}");
|
|
property.SetValue(component, value);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// How often to apply a new sample to a parameter's target
|
|
/// </summary>
|
|
public enum ParameterApplicationFrequency
|
|
{
|
|
/// <summary>
|
|
/// Applies a parameter once every iteration
|
|
/// </summary>
|
|
OnIterationSetup,
|
|
|
|
/// <summary>
|
|
/// Applies a parameter once every frame
|
|
/// </summary>
|
|
EveryFrame
|
|
}
|
|
|
|
enum FieldOrProperty
|
|
{
|
|
Field, Property
|
|
}
|
|
}
|