You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
4.2 KiB
127 lines
4.2 KiB
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
using UnityEditor.PostProcessing;
|
|
using UnityEngine.UCMobile;
|
|
using System;
|
|
using System.Reflection;
|
|
using System.Linq;
|
|
|
|
[CustomEditor(typeof(UCMobile))]
|
|
public class UCMobileEditor : Editor
|
|
{
|
|
GUIStyle header;
|
|
Dictionary<UCMobileModelEditor, UCMobileModel> m_CustomEditors = new Dictionary<UCMobileModelEditor, UCMobileModel>();
|
|
public void OnEnable()
|
|
{
|
|
|
|
if (target == null)
|
|
return;
|
|
|
|
var assembly = typeof(UCMobileEditor).Assembly;
|
|
|
|
var editorTypes = assembly.GetTypes()
|
|
.Where(x => x.IsDefined(typeof(UCMobileEditorAttribute), false));
|
|
|
|
var customEditors = new Dictionary<Type, UCMobileModelEditor>();
|
|
|
|
foreach (var editor in editorTypes)
|
|
{
|
|
var attr = (UCMobileEditorAttribute)editor.GetCustomAttributes(typeof(UCMobileEditorAttribute), false)[0];
|
|
var effectType = attr.type;
|
|
var alwaysEnabled = attr.alwaysEnabled;
|
|
|
|
var editorInst = (UCMobileModelEditor)Activator.CreateInstance(editor);
|
|
editorInst.alwaysEnabled = alwaysEnabled;
|
|
editorInst.profile = target as UCMobile;
|
|
editorInst.inspector = this;
|
|
customEditors.Add(effectType, editorInst);
|
|
}
|
|
|
|
var baseType = target.GetType();
|
|
var property = serializedObject.GetIterator();
|
|
|
|
while (property.Next(true))
|
|
{
|
|
if (!property.hasChildren)
|
|
continue;
|
|
|
|
var type = baseType;
|
|
var srcObject = UnityEngine.UCMobile.ReflectionUtils.GetFieldValueFromPath(serializedObject.targetObject, ref type, property.propertyPath);
|
|
|
|
if (srcObject == null)
|
|
continue;
|
|
UCMobileModelEditor editor;
|
|
if (customEditors.TryGetValue(type, out editor))
|
|
{
|
|
var effect = (UCMobileModel)srcObject;
|
|
|
|
if (editor.alwaysEnabled)
|
|
effect.enabled = editor.alwaysEnabled;
|
|
|
|
m_CustomEditors.Add(editor, effect);
|
|
editor.target = effect;
|
|
editor.serializedProperty = property.Copy();
|
|
editor.OnPreEnable();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
header = new GUIStyle("ShurikenModuleTitle")
|
|
{
|
|
font = (new GUIStyle("Label")).font,
|
|
border = new RectOffset(15, 7, 4, 4),
|
|
fixedHeight = 22,
|
|
contentOffset = new Vector2(20f, -2f)
|
|
};
|
|
foreach (var editor in m_CustomEditors)
|
|
{
|
|
EditorGUI.BeginChangeCheck();
|
|
EditorGUILayout.Separator();
|
|
GUILayout.BeginHorizontal();
|
|
|
|
SerializedProperty IsEnable = editor.Key.serializedProperty.FindPropertyRelative("m_Enabled");
|
|
SerializedProperty IsUsed = editor.Key.serializedProperty.FindPropertyRelative("IsUsed");
|
|
var rect = GUILayoutUtility.GetRect(16f, 20f, header);
|
|
GUI.Box(rect, editor.Key.title, header);
|
|
var toggleRect = new Rect(rect.x + 4f, rect.y + 1f, 12f, 12f);
|
|
IsUsed.boolValue = GUI.Toggle(toggleRect, IsUsed.boolValue, editor.Key.title);
|
|
GUILayout.EndHorizontal();
|
|
var e = Event.current;
|
|
if (e.type == EventType.MouseDown)
|
|
{
|
|
if (toggleRect.Contains(e.mousePosition))
|
|
{
|
|
e.Use();
|
|
}
|
|
else if (rect.Contains(e.mousePosition))
|
|
{
|
|
IsEnable.boolValue = !IsEnable.boolValue;
|
|
e.Use();
|
|
}
|
|
}
|
|
|
|
if (IsEnable.boolValue)
|
|
{
|
|
using (new EditorGUI.DisabledGroupScope(!IsEnable.boolValue))
|
|
{
|
|
EditorGUILayout.Separator();
|
|
editor.Key.OnInspectorGUI();
|
|
EditorGUILayout.Separator();
|
|
}
|
|
}
|
|
|
|
if (EditorGUI.EndChangeCheck())
|
|
editor.Value.OnValidate();
|
|
|
|
editor.Key.serializedProperty.serializedObject.ApplyModifiedProperties();
|
|
|
|
}
|
|
EditorGUILayout.Separator();
|
|
}
|
|
|
|
}
|
|
|