您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
102 行
4.1 KiB
102 行
4.1 KiB
using System;
|
|
// using System.Reflection;
|
|
// using System.Reflection.Emit;
|
|
using UnityEngine.Perception.Randomization.Samplers.Abstractions;
|
|
using UnityEngine;
|
|
|
|
namespace UnityEngine.Perception.Randomization.Parameters.Abstractions
|
|
{
|
|
public abstract class Parameter<T> : ParameterBase
|
|
{
|
|
Action<Component, T> m_ApplyParameterDelegate;
|
|
|
|
public override Type SamplerType()
|
|
{
|
|
return typeof(Sampler<T>);
|
|
}
|
|
|
|
public override Type SampleType()
|
|
{
|
|
return typeof(T);
|
|
}
|
|
|
|
protected override void SetupFieldOrPropertySetters()
|
|
{
|
|
// if (!hasTarget)
|
|
// return;
|
|
// var componentType = propertyTarget.targetComponent.GetType();
|
|
// switch (propertyTarget.targetKind)
|
|
// {
|
|
// case TargetKind.Field:
|
|
// var fieldInfo = componentType.GetField(propertyTarget.propertyName);
|
|
// m_ApplyParameterDelegate = CreateFieldSetter(fieldInfo, componentType);
|
|
// break;
|
|
// case TargetKind.Property:
|
|
// var propertyInfo = componentType.GetProperty(propertyTarget.propertyName);
|
|
// m_ApplyParameterDelegate = CreatePropertySetter(propertyInfo, componentType);
|
|
// break;
|
|
// }
|
|
}
|
|
|
|
public override void Apply(IterationData data)
|
|
{
|
|
iterationData = data;
|
|
UnreflectiveApply();
|
|
|
|
// if (!hasTarget)
|
|
// return;
|
|
// var value = ((Sampler<T>)sampler).NextSample();
|
|
// m_ApplyParameterDelegate(propertyTarget.targetComponent, value);
|
|
}
|
|
|
|
void UnreflectiveApply()
|
|
{
|
|
if (!hasTarget)
|
|
return;
|
|
var value = ((Sampler<T>)sampler).NextSample();
|
|
var componentType = propertyTarget.targetComponent.GetType();
|
|
switch (propertyTarget.targetKind)
|
|
{
|
|
case TargetKind.Field:
|
|
var fieldInfo = componentType.GetField(propertyTarget.propertyName);
|
|
fieldInfo.SetValue(propertyTarget.targetComponent, value);
|
|
break;
|
|
case TargetKind.Property:
|
|
var propertyInfo = componentType.GetProperty(propertyTarget.propertyName);
|
|
propertyInfo.SetValue(propertyTarget.targetComponent, value);
|
|
break;
|
|
}
|
|
}
|
|
|
|
// static Action<Component, T> CreateFieldSetter(FieldInfo field, Type componentType)
|
|
// {
|
|
// var methodName = field.ReflectedType.FullName + ".set_" + field.Name;
|
|
// var setterMethod = new DynamicMethod(
|
|
// methodName, null, new []{ typeof(Component), typeof(T) }, true);
|
|
// var gen = setterMethod.GetILGenerator();
|
|
// gen.Emit(OpCodes.Ldarg_0);
|
|
// gen.Emit(OpCodes.Castclass, componentType);
|
|
// gen.Emit(OpCodes.Ldarg_1);
|
|
// gen.Emit(OpCodes.Stfld, field);
|
|
// gen.Emit(OpCodes.Ret);
|
|
// var newDelegate = (Action<Component, T>)setterMethod.CreateDelegate(typeof(Action<Component, T>));
|
|
// return newDelegate;
|
|
// }
|
|
//
|
|
// static Action<Component, T> CreatePropertySetter(PropertyInfo property, Type componentType)
|
|
// {
|
|
// var methodName = property.ReflectedType.FullName + ".set_" + property.Name;
|
|
// var setMethod = property.GetSetMethod();
|
|
// var setterMethod = new DynamicMethod(
|
|
// methodName, null, new []{ typeof(Component), typeof(T) }, true);
|
|
// var gen = setterMethod.GetILGenerator();
|
|
// gen.Emit(OpCodes.Ldarg_0);
|
|
// gen.Emit(OpCodes.Castclass, componentType);
|
|
// gen.Emit(OpCodes.Ldarg_1);
|
|
// gen.Emit(OpCodes.Callvirt, setMethod);
|
|
// gen.Emit(OpCodes.Ret);
|
|
// var newDelegate = (Action<Component, T>)setterMethod.CreateDelegate(typeof(Action<Component, T>));
|
|
// return newDelegate;
|
|
// }
|
|
}
|
|
}
|