Написал тут улучшалку в редактор : ) Буду рад если кто затестит. Я не очень хорошо знаком с функционалом редактора так что писалось по наитию, наверно есть более лучшие способы реализовать - скидывайте предложения по улучшению : )
Принцип работы прост - добавляем атрибут Foldout к переменной и даем название. Магия
Сделал апдейт легкий косметический - теперь первая буква в инспекторе всегда заглавная ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
pixeye, это настолько просто и гениально, почему мне самому это в голову не пришло xD
Спасибо : )
Фуф - последний апдейт я думаю. Сортировка групп начиная от базового класса, заменил стили и сделал чтобы группа раскрывалась по клику на таб а не только на стрелочку ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
Полезная штука! Вот еще бы закрытие тега было, если после группы не нужна новая, а переменные остались = ) Более мощный компьютер глючит быстрее и точнее.
Для этого можно просто писать Foldout("Имя") Foldout("Имя") Foldout("Имя") Foldout("Имя") - над каждой переменной оно будет так же сортировать : )
Я заметил, но некоторые группы на 20+ полей=) (например ссылки на текстовки для окна) В этом реально выручили группы, но получится многовато тегов, особенно, что большая часть полей уже с "[SerializeField]"=)
Добавлено (22 Мая 2018, 11:13) --------------------------------------------- В общем я добавил небольшой костыль для выхода через "end"... надеюсь ты не против
Код
if (fold == null) { if (prevFold != null && prevFold.foldEverything) { if (!cache.TryGetValue( prevFold.name, out c )) { cache.Add( prevFold.name, new Cache { atr = prevFold, types = new HashSet<string> { objectFields[ i ].Name } } ); } else { c.types.Add( objectFields[ i ].Name ); } }
continue; } else if (fold.name == "end")// вот тут костиль! { prevFold = null; continue; }
Более мощный компьютер глючит быстрее и точнее.
Сообщение отредактировал BrightSpot - Вторник, 22 Мая 2018, 11:14
Тогда добавлю еще немного отсебятины=) Вот модифицировал что бы можно было обрывать группы и переменные оставались на своих местах, а не сносились вниз...
Код
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object;
namespace Homebrew { [CustomEditor(typeof(Object), true, isFallback = true)] [CanEditMultipleObjects] public class EditorOverride : Editor { private Dictionary<string, Cache> cache = new Dictionary<string, Cache>(); private List<SerializedProperty> props = new List<SerializedProperty>(); private SerializedProperty propScript; private Type type; private int length; private List<FieldInfo> objectFields; private bool initialized; private Colors colors; private FoldoutAttribute prevFold; private GUIStyle style; private string freeGroup = "emty"; private int freeGroupNumber = 0;
private void Awake() { var uiTex_in = Resources.Load<Texture2D>("IN foldout focus-6510"); var uiTex_in_on = Resources.Load<Texture2D>("IN foldout focus on-5718");
var c_on = Color.white;
style = new GUIStyle(EditorStyles.foldout);
style.overflow = new RectOffset(-10, 0, 3, 0); style.padding = new RectOffset(25, 0, -3, 0);
public override void OnInspectorGUI() { serializedObject.Update();
if (!initialized) {
for (var i = 0; i < length; i++) { var fold = Attribute.GetCustomAttribute(objectFields[i], typeof(FoldoutAttribute)) as FoldoutAttribute;
Cache c; if (fold == null) { if (prevFold != null) { if (prevFold.foldEverything) { if (!cache.TryGetValue( prevFold.name, out c )) { cache.Add( prevFold.name, new Cache { atr = prevFold, types = new HashSet<string> { objectFields[ i ].Name } } ); } else { c.types.Add( objectFields[ i ].Name ); } } else { AddFreeField( objectFields[ i ] ); } } else { AddFreeField( objectFields[ i ] ); } continue; } else if (fold.name == "end") { AddFreeField( objectFields[ i ] ); continue; }
prevFold = fold; if (!cache.TryGetValue(fold.name, out c)) { cache.Add(fold.name, new Cache {atr = fold, types = new HashSet<string> {objectFields[i].Name}}); } else { c.types.Add(objectFields[i].Name); } }
var property = serializedObject.GetIterator(); var next = property.NextVisible(true); if (next) { do { HandleProp(property); } while (property.NextVisible(false)); } }
if (props.Count == 0) { DrawDefaultInspector(); return; }
initialized = true;
using (new EditorGUI.DisabledScope("m_Script" == props[0].propertyPath)) { EditorGUILayout.PropertyField(props[0], true); }
EditorGUILayout.Space();
foreach (var pair in cache) { Rect rect; if (pair.Value.isFoldDraw) { rect = EditorGUILayout.BeginVertical();
if (pair.Value.expanded || !pair.Value.isFoldDraw) { EditorGUILayout.Space(); { for (int i = 0; i < pair.Value.props.Count; i++) { EditorGUI.indentLevel = 1;
EditorGUILayout.PropertyField(pair.Value.props[i], new GUIContent(pair.Value.props[i].name.FirstLetterToUpperCase()), true); if (i == pair.Value.props.Count - 1) EditorGUILayout.Space(); } } }
public void HandleProp(SerializedProperty prop) { bool shouldBeFolded = false;
foreach (var pair in cache) { if (pair.Value.types.Contains(prop.name)) { shouldBeFolded = true; pair.Value.props.Add(prop.Copy());
break; } }
if (shouldBeFolded == false) { props.Add(prop.Copy()); } }
private struct Colors { public Color col0; public Color col1; public Color col2; }
private class Cache { public HashSet<string> types = new HashSet<string>(); public List<SerializedProperty> props = new List<SerializedProperty>(); public FoldoutAttribute atr; public bool expanded; public bool isFoldDraw = true; public void Dispose() { props.Clear(); types.Clear(); atr = null; } } }
public static partial class FrameworkExtensions { public static string FirstLetterToUpperCase(this string s) { if (string.IsNullOrEmpty(s)) return string.Empty;
char[] a = s.ToCharArray(); a[0] = char.ToUpper(a[0]); return new string(a); }
public static IList<Type> GetTypeTree(this Type t) { var types = new List<Type>(); while (t.BaseType != null) { types.Add(t); t = t.BaseType; }
return types; } } }
Более мощный компьютер глючит быстрее и точнее.
Сообщение отредактировал BrightSpot - Вторник, 22 Мая 2018, 12:30
За что люблю гитхаб тему так это когда все набегут ченить наредактируют XD класс. Спасибо ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
это настолько просто и гениально, почему мне самому это в голову не пришло xD
Добавлено (22 Мая 2018, 13:41) --------------------------------------------- Для любителей использовать "_" в начале имени переменной, как я небольшой мод:
Код
public static string FirstLetterToUpperCase(this string s) { if (string.IsNullOrEmpty( s )) return string.Empty;
char[] a = s.ToCharArray(); string newName = ""; bool isFirstChar = true; for(int i = 0; i<a.Length;i++) { if(isFirstChar) { if(a[i]!='_') { a[i] = char.ToUpper( a[ i ] ); isFirstChar = false; } } if (!isFirstChar) { newName += a[ i ]; } } return newName; }