Тогда добавлю еще немного отсебятины=) Вот модифицировал что бы можно было обрывать группы и переменные оставались на своих местах, а не сносились вниз...
Код
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
Для этого можно просто писать 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
Полезная штука! Вот еще бы закрытие тега было, если после группы не нужна новая, а переменные остались = ) Более мощный компьютер глючит быстрее и точнее.
я вижу 4\4 тяжелых жанра для разработки, комбинация получается вообще адской(только ммо не хватает для полной картины) - есть опыт в разработке по этим направлениям или хотя бы законченные проекты?
ЦитатаBlacit ()
Расчёт на полгода
По видимому вопрос выше отпадает... прогеру уровня "знакомым с понятием ООП" за такое время получится разве что заговнокодить некоторые механики без перспективы расширения и модификации(несколько прогеров такого уровня без должного контроля сделают еще меньше). Если нужны опытные, то нужно финансирование(% в будущем мало кого заинтересует) Так что, хотелось бы увидеть "перспективы"( готовые проекты хотя бы ) или попробуйте что то с меньшим размахом - закончите или не закончите, но опыта поднаберетесь=) Более мощный компьютер глючит быстрее и точнее.
теоретически реально, на практике очень трудно=)) Хотя смотря какая игра - мелкие матч 3 и т.п за несколько дней делаются на расслабоне=) Более мощный компьютер глючит быстрее и точнее.
Теоретически все однообразные объекты на сцене можно заинстансировать за 1 дров кол.
только теоретически... есть ограничения по колву вершин с зависимостью от количества текстур в шейдере... + хорошо разрывает батчинг разный скейл(иногда даже при анимации) Так же не нужно забывать, что на батчинг так же нужно время - один большой объект забатчится за раз но если это глобальная карта лучше разбить ее на составляющие(в зависимости от видимости камеры)
Цитатаshustr1k76 ()
Допустим у тебя есть город. Он состоит из множества зданий. А ты хоба, вместо того чтоб рисовать каждое здание отдельно взял и в 3д максе слепил всё вместе в 1 неразрывный объект и возрадовался.
вот этот варик подойдет для стратегии, где город видно целиком(или большую часть), для рпг или фпс это убийство фпс(странно выглядит но думаю понятно)
Цитатаshustr1k76 ()
на моём nexus 5 fps 54-60. На более слабых около 30.
это норма...
Добавлено (10 Мая 2018, 10:04) --------------------------------------------- и скинь скрин с игры - будет проще понимать с чем подсказывать=)
у меня в статической сцене(до появления юнитов) 200-250к - это относительный показатель...
Цитатаshustr1k76 ()
может быть есть ещё нюансы?
шейдеры, расположение, кол-во полупрозрачных моделей(и их смешивание) партиклы, размеры моделей, тирейн юнитовский сильно грузит и еще много аспектов которые нужно учитывать и балансировать... опыт в помощь - пробуй разные подходы... Более мощный компьютер глючит быстрее и точнее.
А в чем дело с ui? Может быть ссылкой по делитесь, ни где не встречал, что бы он влиял на draw call's.
ui такая же графика как и остальное и хорошо просаживает, при хаотичном использовании=) фишки те же - один материал, один скейл(flipX = scale.x -1), одна текстура(атласы в помощь)... Основная нагрузка(по мере возростания): Прозрачность, Перекрытие нескольких прозрачных спрайтов, маски, layout компоненты(ручками нужно делать)... З.Ы заметил странную тенденцию 3д модели создают больше дравколов чем 2д, но дают меньшее падение фпс...
Цитатаshustr1k76 ()
Может быть ссылкой по делитесь
когда я изучал эти аспекты гугл на запрос "смотреть фильм онлайн" выдавал ссылки по оптимизации так что упорство поможет=)))
Цитатаshustr1k76 ()
Ну и скажите какой цифры достичь
У меня сейчас телефон - эталон достаточно слабый и 40+фпс получаю тлько на <100 dc... при тестах на среднем современном устройстве спокойно 50фпс при 200+dc так что нужно тестировать отталкиваясь от минимально необходимых хар-к устройства... точных цыфр нету Более мощный компьютер глючит быстрее и точнее.
почитай как формируются дравколы и что влияет на разрывы...(frame debug поможет посмотреть что за чем отрисовывается), если есть UI посмотри сколько он жрет и как можно сократить=) Более мощный компьютер глючит быстрее и точнее.
По вашим словам - один человек может заменить всех
Вы не поняли суть сообщения... Чем ваши навыки будут полезны, в чем от вас польза? Знание нескольких навыков "по немного" не дает результата... Более мощный компьютер глючит быстрее и точнее.
Я в основном аниматор, немного художник, занимался обработкой звука и созданием музыки, хорошо знаю алгоритмы, циклы и управление массивами, владею небольшим кол-вом яз. программирования(html, css, javascript).Всего по немногу.Буду заниматься
прямо сказать, это более чем мало - средненький джун программист на unity большим запасом умений обладает...
Цитатаalxeevichev ()
и помогать коллективу с их узкоспециализированными вопросами по их направлению(отрисовка, анимирование, обработка звука, написание алгоритма и т.д.), чем смогу помогу!
для подобного нужно быть профи в этих направлениях, или от гугла будет больше толку.
Цитатаalxeevichev ()
В команду требуются: Программист (опыт работы с одним из популярных движков, знание серверного языка от регистрации, до синхронизации положения объектов на сервере)
вот подобный прогер заменит тебя с лихвой... так зачем тогда ему идти в подобную комманду? И сможешь ли ты оплатить подобную работу(не говоря о остальных) Более мощный компьютер глючит быстрее и точнее.