示例#1
0
        protected void DrawArrowCaps()
        {
            if (!(target is UObject))
            {
                return;
            }

            UObject t = (UObject)target;

            var attr = GlobalReflectionCache.FindOrAdd(target.GetType()).GetCustomAttribute <DrawArrowCapAttribute>();

            if (attr != null)
            {
                LokiSceneUtility.DrawArrowCap(t.transform);
            }
        }
示例#2
0
        private void DoRegister(IConsoleObject o)
        {
            Type type = o.GetType();

            if (!mConsoleInfos.TryGetValue(type, out var consoleInfo))
            {
                consoleInfo = new List <IConsoleObject>();
                mConsoleInfos.Add(type, consoleInfo);
            }

            consoleInfo.Union(o);

            if (mSearchedType.Add(type))
            {
                var reflectTypeInfo = GlobalReflectionCache.FindOrAdd(type);
                var methods         = reflectTypeInfo.FindMethods <ConsoleMethodAttribute>();

                foreach (var m in methods)
                {
                    var        attr     = m.GetCustomAttribute <ConsoleMethodAttribute>();
                    MethodInfo validate = null;
                    if (!string.IsNullOrEmpty(attr.validate))
                    {
                        validate = type.GetMethod(attr.validate);
                    }

                    if (validate != null)
                    {
                        if (validate.IsStatic != m.IsStatic)
                        {
                            DebugUtility.LogError(LoggerTags.Console, "The Method [{0}] and the validate [{1}] must be the same modifier (ex. static)", m.Name, validate.Name);
                            continue;
                        }

                        if (validate.DeclaringType != typeof(bool))
                        {
                            DebugUtility.LogError(LoggerTags.Console, "The Validate [{0}] must return bool (true or false)", validate.Name);
                            continue;
                        }
                    }

                    string cmd = attr.aliasName;
                    if (string.IsNullOrEmpty(cmd))
                    {
                        cmd = string.Concat(type.FullName, ".", m.Name);
                    }

                    if (!mCommandInfos.TryGetValue(cmd, out var cmdGroup))
                    {
                        cmdGroup = new List <ConsoleCommand>();
                        mCommandInfos.Add(cmd, cmdGroup);
                    }
                    else
                    {
                        if (cmdGroup.FindIndex(command => command.owner == type) >= 0)
                        {
                            DebugUtility.LogError(LoggerTags.Engine, "The command is existed, it is not allowed : {0}", string.Concat(type.FullName, ".", m.Name));
                            continue;
                        }
                    }

                    ConsoleCommand entry;
                    entry.owner      = type;
                    entry.attribute  = attr;
                    entry.validate   = validate;
                    entry.memberInfo = m;
                    entry.cmd        = cmd;
                    cmdGroup.Add(entry);
                }

                var fieldsOrProperties = reflectTypeInfo.FindMembers <ConsoleMemberAttribute>();
                foreach (var m in fieldsOrProperties)
                {
                    var        attr     = m.GetCustomAttribute <ConsoleMemberAttribute>();
                    MethodInfo validate = null;
                    if (!string.IsNullOrEmpty(attr.validate))
                    {
                        validate = type.GetMethod(attr.validate);
                    }

                    if (validate != null)
                    {
                        bool memberIsStatic = false;
                        if (m.MemberType == MemberTypes.Field)
                        {
                            memberIsStatic = ((FieldInfo)m).IsStatic;
                        }
                        else if (m.MemberType == MemberTypes.Property)
                        {
                            memberIsStatic = ((PropertyInfo)m).IsStatic();
                        }
                        if (validate.IsStatic != memberIsStatic)
                        {
                            DebugUtility.LogError(LoggerTags.Console, "The Field [{0}] and the validate [{1}] must be the same modifier (ex. static)", m.Name, validate.Name);
                            continue;
                        }

                        if (validate.DeclaringType != typeof(bool))
                        {
                            DebugUtility.LogError(LoggerTags.Console, "The Validate [{0}] must return bool (true or false)", validate.Name);
                            continue;
                        }
                    }

                    string cmd = attr.aliasName;
                    if (string.IsNullOrEmpty(cmd))
                    {
                        cmd = string.Concat(type.FullName, ".", m.Name);
                    }

                    if (!mCommandInfos.TryGetValue(cmd, out var cmdGroup))
                    {
                        cmdGroup = new List <ConsoleCommand>();
                        mCommandInfos.Add(cmd, cmdGroup);
                    }
                    else
                    {
                        if (cmdGroup.FindIndex(command => command.owner == type) >= 0)
                        {
                            DebugUtility.LogError(LoggerTags.Engine, "The command is existed, it is not allowed : {0}", string.Concat(type.FullName, ".", m.Name));
                            continue;
                        }
                    }

                    ConsoleCommand entry;
                    entry.owner      = type;
                    entry.attribute  = attr;
                    entry.validate   = validate;
                    entry.memberInfo = m;
                    entry.cmd        = cmd;

                    cmdGroup.Add(entry);
                }
            }
        }
示例#3
0
        protected virtual void OnDrawInspectorPreview()
        {
            if (target == null)
            {
                return;
            }

            Type targetType  = target.GetType();
            var  memberInfos = GlobalReflectionCache.FindOrAdd(targetType).FindMembers <PreviewMemberBaseAttribute>();

            if (memberInfos == null || memberInfos.Count <= 0)
            {
                return;
            }

            DrawLine();
            foreach (var m in memberInfos)
            {
                PreviewMemberBaseAttribute attr = m.GetCustomAttribute <PreviewMemberBaseAttribute>(true);
                TooltipAttribute           ta   = m.GetCustomAttribute <TooltipAttribute>(true);
                Type   drawType = null;
                object value    = null;
                Action <object, object> setValue = null;
                bool readonlyMember = false;

                if (m is FieldInfo)
                {
                    var field = (FieldInfo)m;
                    value          = field.GetValue(target);
                    drawType       = field.FieldType;
                    setValue       = field.SetValue;
                    readonlyMember = field.IsInitOnly;
                }
                else if (m is PropertyInfo)
                {
                    var property = (PropertyInfo)m;
                    value          = property.GetValue(target);
                    drawType       = property.PropertyType;
                    setValue       = property.SetValue;
                    readonlyMember = !property.CanWrite;
                }
                else
                {
                    continue;
                }

                string tooltip = ta != null ? ta.tooltip : string.Empty;
                if (string.IsNullOrEmpty(tooltip))
                {
                    var lta = m.GetCustomAttribute <LokiTooltipAttribute>(true);
                    tooltip = lta != null ? lta.tooltip : string.Empty;
                }
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField(new GUIContent(m.Name, tooltip), WidthPercent(0.4f));

                EditorGUI.BeginChangeCheck();
                var lastGUIEnable = GUI.enabled;
                GUI.enabled = !readonlyMember;

                if (attr.useRange)
                {
                    float rangeMin = 0.0f;
                    float rangeMax = 100000.0f;
                    if (attr is PreviewMemberAttribute)
                    {
                        PreviewMemberAttribute real = (PreviewMemberAttribute)attr;
                        rangeMin = real.rangeMin;
                        rangeMax = real.rangeMax;
                    }
                    else if (attr is PreviewMemberDynamicPropertyAttribute)
                    {
                        PreviewMemberDynamicPropertyAttribute real = (PreviewMemberDynamicPropertyAttribute)attr;
                        if (drawType == typeof(float) || drawType == typeof(int))
                        {
                            if (!string.IsNullOrEmpty(real.rangeMin))
                            {
                                rangeMin = (float)targetType.GetProperty(real.rangeMin).GetValue(target);
                            }
                            if (!string.IsNullOrEmpty(real.rangeMax))
                            {
                                rangeMax = (float)targetType.GetProperty(real.rangeMax).GetValue(target);
                            }
                        }
                    }
                    else if (attr is PreviewMemberDynamicFieldAttribute)
                    {
                        PreviewMemberDynamicFieldAttribute real = (PreviewMemberDynamicFieldAttribute)attr;
                        if (drawType == typeof(float) || drawType == typeof(int))
                        {
                            if (!string.IsNullOrEmpty(real.rangeMin))
                            {
                                rangeMin = (float)targetType.GetField(real.rangeMin).GetValue(target);
                            }
                            if (!string.IsNullOrEmpty(real.rangeMax))
                            {
                                rangeMax = (float)targetType.GetField(real.rangeMax).GetValue(target);
                            }
                        }
                    }
                    value = EditorGUILayoutObjectField(drawType, value, rangeMin, rangeMax);
                }
                else
                {
                    value = EditorGUILayoutObjectField(drawType, value);
                }
                GUI.enabled = lastGUIEnable;
                if (EditorGUI.EndChangeCheck())
                {
                    setValue(target, value);
                }

                EditorGUILayout.EndHorizontal();
            }
        }
示例#4
0
        protected static void AutoSerializing(object t)
        {
            Type    targetType = t.GetType();
            UObject target     = t as UObject;

            if (target == null)
            {
                return;
            }

            var fieldsInfo = GlobalReflectionCache.FindOrAdd(targetType).FindSerializeFields();

            if (fieldsInfo == null)
            {
                return;
            }

            foreach (var field in fieldsInfo)
            {
                bool fieldIsGameObject = (field.FieldType == typeof(GameObject));
                bool fieldIsComponent  = (field.FieldType.IsSubclassOf(typeof(Component)));

                string fieldName = field.Name;
                var    attr      = field.GetCustomAttribute <AutoSerializeFieldAttribute>(true);
                if (attr != null)
                {
                    if (!string.IsNullOrEmpty(attr.aliasName))
                    {
                        fieldName = attr.aliasName;
                    }
                    else
                    {
                        string autoRemovePrefix = attr.autoRemovePrefix;
                        if (!string.IsNullOrEmpty(autoRemovePrefix))
                        {
                            if (fieldName.Length > autoRemovePrefix.Length && fieldName.StartsWith(autoRemovePrefix))
                            {
                                fieldName = fieldName.Substring(autoRemovePrefix.Length);
                            }
                        }
                    }
                }

                if (fieldIsComponent || fieldIsGameObject)
                {
                    Transform tr = target.transform.FindUnique(fieldName, StringComparison.OrdinalIgnoreCase);
                    if (tr == null)
                    {
                        if (fieldName.StartsWith("m"))
                        {
                            tr = target.transform.FindUnique(fieldName.Substring(1), StringComparison.OrdinalIgnoreCase);
                        }
                    }
                    if (tr != null)
                    {
                        if (fieldIsGameObject)
                        {
                            field.SetValue(target, tr.gameObject);
                        }
                        else if (fieldIsComponent)
                        {
                            var fieldComponent = tr.GetComponent(field.FieldType);
                            if (fieldComponent != null)
                            {
                                field.SetValue(target, fieldComponent);
                            }
                        }
                        else                         // todo
                        {
                        }
                    }
                }
            }
        }