最近花了两周时间,终于完成一个很简单的蓝图工具。
其中我觉得比较复杂的,就是数据转换和数据计算,因为蓝图中数据类型是没办法直接获取到的。
计算的时候不可能罗列所有类型的相互计算,因为类型大多了。
由于数据要序列化,所以要保存类中的字段是可在Unity可序列化的,例如:Type 和 MethodInfo 以及 object 就不行
object不能序列化就导致反射函数的参数需要转换,带来很多麻烦
一、定义保存数据的类
[Serializable]
public class SerializableClass
{
public byte bytedata;
public short shortdata;
public int intdata;
public string stringdata = "";
public float floatdata;
public double doubledata;
public bool booldata;
public Color colordata;
public Vector2 Vector2data;
public Vector3 Vector3data;
public Vector4 Vector4data;
public Vector2Int Vector2Intdata;
public Vector3Int Vector3Intdata;
public AnimationCurve animationCurvedata = new AnimationCurve();
public Gradient gradientdata = new Gradient();
public Ease animationType = Ease.Linear;
public UnityEngine.Object data = null;
public CustomType type = CustomType.Int16;
public SerializableClass()
{
}
public SerializableClass(object value)
{
type = (CustomType)Enum.Parse(typeof(CustomType), value.GetType().Name);
FieldInfo[] fieldinfo = typeof(SerializableClass).GetFields();
for (int i = 0; i < fieldinfo.Length; i++)
{
if(fieldinfo[i].FieldType == value.GetType() || value.GetType().IsInstanceOfType(fieldinfo[i].FieldType))
{
fieldinfo[i].SetValue(this, value);
}
}
}
public object GetData()
{
FieldInfo[] fieldinfo = typeof(SerializableClass).GetFields();
for (int i = 0; i < fieldinfo.Length; i++)
{
if (fieldinfo[i].FieldType.Name == type.ToString())
{
return fieldinfo[i].GetValue(this);
}
}
return data;
}
public void SetValue(object value )
{
if (value == null) return;
if (typeof(UnityEngine.Object).IsAssignableFrom(value.GetType()))
type = (Cus