public int Store(object obj, bool writeProperties = true) { //storing nulls to -1 if (obj == null) { return(-1); } //if this object already added returning it's num int entitiesCount = entities.Count; for (int i = 0; i < entitiesCount; i++) { if (obj == entities[i].obj) { return(i); } } //creating entity SerializedObject entity = new SerializedObject(); System.Type objType = obj.GetType(); entity.typeName = objType.AssemblyQualifiedName.ToString(); entity.obj = obj; //adding entity to list before storing other objs entities.Add(entity); int result = entities.Count - 1; //writing arrays if (objType.IsArray) { Array array = (Array)obj; System.Type elementType = objType.GetElementType(); entity.AddValues(elementType, array, this); //for (int i=0;i<array.Length;i++) entity.AddValue(elementType, array.GetValue(i), "", this); return(result); } //writing fields FieldInfo[] fields = objType.GetFields(BindingFlags.Public | BindingFlags.Instance); //BindingFlags.NonPublic - does not work in web player for (int i = 0; i < fields.Length; i++) { FieldInfo field = fields[i]; if (field.IsLiteral) { continue; //leaving constant fields blank } if (field.FieldType.IsPointer) { continue; //skipping pointers (they make unity crash. Maybe require unsafe) } if (field.IsNotSerialized) { continue; } entity.AddValue(field.FieldType, field.GetValue(obj), field.Name, this); } //writing properties if (writeProperties) { PropertyInfo[] properties = objType.GetProperties(BindingFlags.Public | BindingFlags.Instance); for (int i = 0; i < properties.Length; i++) { PropertyInfo prop = properties[i]; if (!prop.CanWrite) { continue; } if (prop.Name == "Item") { continue; //ignoring this[x] } entity.AddValue(prop.PropertyType, prop.GetValue(obj, null), prop.Name, this); } } return(result); }
/// <summary> /// 存储对象 /// </summary> /// <param name="iObj">对象</param> /// <param name="iWriteProperties">属性写入标识位</param> /// <returns>-1:失败或者未写入任何内容;其他:被写入实体列表中的索引值;</returns> public int Store(object iObj, bool iWriteProperties = true) { //storing nulls to -1 if (iObj == null) { return(-1); } // 遍历当前实体列表,看是否已经存在。若存在,则返回索引 var entitiesCount = entities.Count; for (var i = 0; i < entitiesCount; i++) { if (iObj == entities[i].obj) { return(i); } } // 创建新的序列化对象 var entity = new SerializedObject(); var objType = iObj.GetType(); entity.typeName = objType.AssemblyQualifiedName; entity.obj = iObj; //adding entity to list before storing other objs entities.Add(entity); var index = entities.Count - 1; // 数组 if (objType.IsArray) { var array = (Array)iObj; var elementType = objType.GetElementType(); entity.AddValues(elementType, array, this); //for (int i=0;i<array.Length;i++) entity.AddValue(elementType, array.GetValue(i), "", this); return(index); } // 获取字段信息 var fields = objType.GetFields(BindingFlags.Public | BindingFlags.Instance); //BindingFlags.NonPublic - does not work in web player for (var i = 0; i < fields.Length; i++) { var field = fields[i]; // 若是编译时写入,且不能修改 if (field.IsLiteral) { continue; //leaving constant fields blank } // 指针类型 if (field.FieldType.IsPointer) { continue; //skipping pointers (they make unity crash. Maybe require unsafe) } // 非序列化对象 if (field.IsNotSerialized) { continue; } entity.AddValue(field.FieldType, field.GetValue(iObj), field.Name, this); } //writing properties if (!iWriteProperties) { return(index); } var properties = objType.GetProperties(BindingFlags.Public | BindingFlags.Instance); for (var i = 0; i < properties.Length; i++) { var prop = properties[i]; // 不可写 if (!prop.CanWrite) { continue; } if (prop.Name == "Item") { continue; //ignoring this[x] } entity.AddValue(prop.PropertyType, prop.GetValue(iObj, null), prop.Name, this); } return(index); }