예제 #1
0
        public static void ResetTarget(object target)
        {
            //Func<Type, bool> IsTypeSerializedByUnity = type =>
            //{
            //    // Might be forgetting something here...
            //    return (type.IsPrimitive || type.IsEnum || type == typeof(string)
            //        || type.IsA<UnityObject>()
            //        || VFWSerializationLogic.UnityStructs.ContainsValue(type)
            //        || type == typeof(AnimationCurve)
            //        || type == typeof(Gradient));
            //};

            //Func<FieldInfo, bool> IsFieldSerializedByUnity = field =>
            //{
            //    var type = field.FieldType;
            //    if (!IsTypeSerializedByUnity(type))
            //        return false;

            //    if (!field.IsPublic && !field.IsDefined<SerializeField>())
            //        return false;

            //    if (type.IsArray)
            //        return type.GetArrayRank() == 1 && IsTypeSerializedByUnity(type.GetElementType());

            //    if (type.IsGenericType)
            //        return type.GetGenericTypeDefinition() == typeof(List<>) && IsTypeSerializedByUnity(type.GetGenericArguments()[0]);

            //    if (type.IsAbstract)
            //        return false;

            //    return type.IsDefined<SerializableAttribute>();
            //};

            var members = RuntimeMember.CachedWrapMembers(target.GetType());

            for (int i = 0; i < members.Count; i++)
            {
                var member = members[i];
                member.Target = target;
                var defAttr = member.Info.GetCustomAttribute <DefaultAttribute>();
                if (defAttr == null)
                {
                    // if a field is not serializable by Unity, then Unity won't be able to set it to whatever we initialized it with,
                    // so we will reset it to its default value and unfortunately ignore the field initialization because it's very
                    // hard to obtain that value
                    //var field = member.Info as FieldInfo;
                    //if (field != null && !IsFieldSerializedByUnity(field) || member.Info is PropertyInfo)
                    //    member.Value = member.Type.GetDefaultValue();
                }
                else
                {
                    var value = defAttr.Value;
                    if (value == null && !member.Type.IsAbstract)                     // null means to instantiate a new instance
                    {
                        value = member.Type.ActivatorInstance();
                    }
                    member.Value = value;
                }
            }
        }
예제 #2
0
        public static void ResetTarget(object target)
        {
            var type    = target.GetType();
            var members = RuntimeMember.CachedWrapMembers(type);

            for (int i = 0; i < members.Count; i++)
            {
                var member  = members[i];
                var defAttr = member.Info.GetCustomAttribute <DefaultAttribute>();
                if (defAttr != null)
                {
                    member.Target = target;
                    var value = defAttr.Value;
                    if (value == null && !member.Type.IsAbstract)                     // null means to instantiate a new instance
                    {
                        value = member.Type.ActivatorInstance();
                    }
                    member.Value = value;
                }
            }
        }