tgindex

Unity: Всё, что вы не знали о разработке

описание

Авторский канал о разработке в Unity от Alex Silaev (CTO в Zillion Whales). Mushroom Wars 2 моих рук дело. Рассказываю об интересный кейсах, делюсь лайфхаками, решениями.

1 746
подписчиков
Охват к подписчикам
183,3%
ERR
Реакции к просмотрам
1,67%
1 644 на 31 постов
Пересылки к просмотрам
0,82%
803
Постов в день
0,0
всего 32

Где отзываются чаще

доля реакций к просмотрам
  • 2 мар.Век живи - век учись Я вот только сегодня узнал, что оказывается можно писать не только так: var str = $"{value}"; А еще и вот так: var str = $$"""{{value}}"""; Или вот так: var str = $$$"""{{{value}}}"""; Или проще говоря, от количества $ символов зависит количество скобочек. В целом довольно удобно иногда может быть. Я вот обнаружил это только сейчас, т.к. мне всегда хватало и одного $. #csharp #strings3,82%
  • 19 нояб. 2024 г.без подписи3,44%
  • 11 нояб. 2024 г.Как свапнуть значение Представим, что у нас есть 2 переменные a и b, нам нужно поменять их значения местами: a => b, b => a. Обычно, мы пишем так: var temp = a; a = b; b = temp; Но есть возможность записать это проще: (a, b) = (b, a); По производительности записи идентичны, т.к. второй вариант превращается в первый. #tips #basics3,08%
  • 3 окт. 2024 г.без подписи2,80%
  • 10 февр.Overlay У юнити, начиная с 2022.2, появилась возможность рисовать свои окна в SceneView, при этом не прибегая к костылям вида "подпишусь на колбэк GUI, потом нарисую хрен пойми где хрен пойми как". UnityEditor.Overlays.Overlay - позволяет это сделать очень просто и легко. [Overlay(typeof(SceneView), "YourUniqueId", "Caption", defaultDisplay = true)] public class YourOverlay : Overlay { public override VisualElement CreatePanelContent() { return new Label("Test"); } } В целом довольно удобно, когда нужны какие-то настройки объектов на сцене, раньше приходилось руками рисовать, а сейчас удобная тулза. #unity #editor #sceneview2,53%
  • 7 дек.Простые лайфхаки Часто встречаю в разных проектах подобные конструкции (на самом деле обычно они страшнее, но я убрал все лишнее): var result = false; if (Method1() == true) result = true; if (Method2() == true) result = true; if (Method3() == true) result = true; ... return result; На самом деле этот код можно записать проще: var result = false; result |= Method1(); result |= Method2(); result |= Method3(); ... return result; Аналогично можно делать и обратную историю: var result = true; result &= ... В целом подобных штук можно найти немало, которые сэкономят время и приведут код с красивому и читаемому виду. #lifehack #basics #code2,33%
  • 4 сент. 2025 г.Всем привет ;) Как вы могли заметить, в этом канале нет рекламы, продажи курсов и подобных историй. Так будет продолжаться и дальше. Но я хотел бы предложить свои услуги в качестве консультаций в частном порядке, то есть мы разберем вашу проблему и найдем оптимальное для нее решение. Готов помочь с любыми проблемами на ваших текущих проектах или просто подтянуть знания по какой-то теме. Оплата по договоренности. https://boosty.to/chromealex Пишите в личку: @chromealex2,29%
  • 6 окт. 2024 г.checked/unchecked Встречали ли вы эти слова в коде? Думаю, что вряд ли. А все потому что в основном мы работаем с числами и относимся к ним как к хранилищу. Большинство вообще используют int и float, а если будут хранить большие числа - ну long и double. Для каких-нибудь ГК игр используют BigInteger при необходимости. И на самом деле большинство никогда не задумывается «а что будет если». Но вернемся к теме. В шарпе по-умолчанию число int.MaxValue + 1 вернет результат без исключения и будет равно int.MinValue. То есть по сути будет ходить по кругу. Иногда это критично для некоторых кейсов, поэтому используют блок checked: value = int.MaxValue; checked { value += 1; // тут мы получим исключение } Тем самым можно поймать исключение, которое потом правильно обработать, ну или получить исключение в правильном месте. Ведь где-нибудь мы считали индекс массива, он стал минусовым, а потом где-нибудь совершенно в другом месте упал с ошибкой «чет индекс не попадает в рамки массива». И хорошо, если это индекс массива, а если просто число, которое влияет на логику выполнения и в какой-то момент у вас что-нибудь начнет крутиться в другую сторону? Аналогично checked существует и unchecked: value = int.MaxValue; unchecked { value += 1; // тут исключения не будет, число будет равно минимальному значению } На самом деле хоть unchecked - это поведение по-умолчанию, все равно его можно переопределить параметром компилятора. Также существуют checked/unchecked операторы для более котороткой записи: return checked(value + 1); Для контекста переполнения важен контекст (странно даже), то есть если вы будете вызывать метод внутри checked, внутри которого будет переполнение, то исключения не будет, это важно не забыть. #basics #overflow2,25%
  • 30 авг. 2025 г.CallerFilePathAttribute Этот аттрибут позволяет получить путь к файлу, из которого происходит вызов метода: void Sample([CallerFilePath] string file = null) { UnityEngine.Debug.Log(file); } Еще обратите внимание, что есть CallerMemberName (из какого метода вызов) и CallerLineNumber (на какой строке). #debug #csharp #code2,24%
  • 1 сент. 2025 г.Unity.Mathematics На самом деле многие не поняли зачем им использовать Unity.Mathematics, если у них есть Vector2/Vector3 и Mathf, например. Давайте разберем самый простой пример: var a = 10; var b = 20; var c = 30; var result = a * b + c; // Считаем результат У Unity.Mathematics есть math.mad, который внутри делает тоже самое: void mad(int a, int b, int c) => a * b + c; И самая большая ошибка считать, что никакой разницы в коде не будет. А работает это так: при компиляции кода, вызов math.mad мапится напрямую на simd-инструкцию, то есть код превращается из 2х инструкций в одну. Пример с math.mad - это лишь пример того, где вы можете сэкономить, в целом есть всякие select еще, которые тоже все избегают использовать. #unity #simd #math2,17%
  • 31 авг. 2025 г.Player Loop Вместо MonoBehaviour на сцене можно использовать инжект в текущий луп. Для этого нужно понимать в какой именно мы хотим добавить вызов своего метода. Всего есть 8 групп: TimeUpdate = 0 Initialization = 1 EarlyUpdate = 2 FixedUpdate = 3 PreUpdate = 4 Update = 5 PreLateUpdate = 6 PostLateUpdate = 7 Использовать проще всего с инжектом при инициализации, но в принципе можно вызывать этот код когда угодно, как и удалять свою систему из обработки: [RuntimeInitializeOnLoadMethod] static void Inject() { var loop = PlayerLoop.GetCurrentPlayerLoop(); var sys = new PlayerLoopSystem { type = typeof(YourClassName), updateDelegate = () => Debug.Log("Custom Update") }; var index = 4; // PreUpdate (см список выше) loop.subSystemList[index].subSystemList = loop.subSystemList[index].subSystemList.Append(sys).ToArray(); PlayerLoop.SetPlayerLoop(loop); } #unity #playerloop2,14%
  • 12 окт. 2024 г.Quaternion vs Euler На самом деле довольно интересная тема. Многие (особенно начинающие) не особо понимают в чем разница, т.к. кватернион хрен знает что это, там если умножить на вектор вроде как вектор повернет (но это не точно), а вот euler ваще классная штука (ведь не даром поворот в трансформе 3мя флотами записан (нет)). Но давайте вспомним (или узнаем) про gimbal lock. Это такое положение осей, когда две оси сложились, а третья не в состоянии повлиять на вращение в нужную нам сторону (на рисунке зеленая и синия ось сложились в одну плоскость, а красная в состоянии вращать только в одном направлении). Вообще euler angles - это понятное представление осей для человека, где есть понятный поворот x, y, z. Но в играх предпочтительно использовать quaternion, т.к. он не подвержен проблеме gimbal lock. Другое дело quaternion. В реальности это гиперкомплексные числа. Если не вдаваться в подробности математики (может стоит?), а остановиться на том, что мы используем в юнити, то вот несколько моментов: 1. Quaternion не может содержать 4 значения 0; 2. Существуют проблемы с точностью float, которые могут приводить к невалидному состоянию; 3. Умножение кватерниона на вектор - повернут вектор; 4. Умножение кватерниона на кватернион - сложение углов; 5. Кватернион можно представить в виде матрицы; 6. Порядок умножения кватернионов важен; 7. Умножение quaternion на inverse(quaternion) вычитает повороты; На самом деле пока писал этот пост несколько раз подумал о том, что хорошо бы рассказать было о матрицах для начала. Но надеюсь, что и эта информация для кого-то окажется полезной. #quaternion #euler #math1,96%