//---------------------------------------------------------------------- void DrawEnumerableFieldAndUpdateValues(ref object _param, ParameterInfo _info) { var list = _param as IList; int desiredLength = EditorGUILayout.IntField("Count", list.Count); int diff = desiredLength - list.Count; var paramType = _info.ParameterType; var baseType = paramType.IsArray ? paramType.GetElementType() : paramType.GetGenericArguments() [0]; if (diff != 0) { for (int i = 0; i < diff; i++) { object value = CreateDefaultObject(baseType); list.Add(value); } int target = list.Count - 1 + diff; for (int i = list.Count - 1; i > target; i--) { list.RemoveAt(i); } } for (int i = 0; i < list.Count; i++) { var item = list[i]; list[i] = UnitySerialiseFieldByType [baseType] (item, _info); } }
//---------------------------------------------------------------------- void DrawListFieldAndUpdateValues(ref object _param, ParameterInfo _info) { var list = _param as IList; int desiredLength = EditorGUILayout.IntField("Length", list.Count); int diff = desiredLength - list.Count; var baseType = _info.ParameterType.GetGenericArguments()[0]; //add/remove contents for (int i = 0; i < diff; i++) { object value = CreateDefaultObject(baseType); list.Add(value); } for (int i = list.Count - 1; i > list.Count + diff; i--) { list.RemoveAt(i); } for (int i = 0; i < list.Count; i++) { var item = list[i]; if (list[i] != null) { Debug.LogFormat("{0}:{1}", i, item.ToString()); } list[i] = UnitySerialiseFieldByType[baseType](item, _info); } }
//---------------------------------------------------------------------- void DrawParameterFieldAndUpdateValue(ref object _param, ParameterInfo _info) { Type type = _info.ParameterType; if (type.IsEnum) { type = typeof(System.Enum); } if (CanSerialiseEnumerable(type)) { DrawEnumerableFieldAndUpdateValues(ref _param, _info); } else { _param = UnitySerialiseFieldByType [type] (_param, _info); } }
//---------------------------------------------------------------------- void DrawParameterFieldAndUpdateValue(ref object _param, ParameterInfo _info) { Type type = _info.ParameterType; if (type.IsEnum) { type = typeof(System.Enum); } if (type.IsArray) { DrawArrayFieldAndUpdateValues(ref _param, _info); } else if (CanSerialiseGenericList(type)) { DrawListFieldAndUpdateValues(ref _param, _info); } else { _param = UnitySerialiseFieldByType[type](_param, _info); } }
//---------------------------------------------------------------------- bool CanSerialiseAllParameters(ParameterInfo[] _params) { for (int i = 0; i < _params.Length; i++) { var type = _params[i].ParameterType; if (type.IsEnum) { continue; } if (CanSerialiseArray(type)) { type = type.GetElementType(); } if (CanSerialiseGenericList(type)) { type = type.GetGenericArguments()[0]; } if (!UnitySerialiseFieldByType.ContainsKey(type)) { return(false); } } return(true); }