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

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

Open in Telegram

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

Show more
1 774
Subscribers
No data24 hours
No data7 days
-730 days
Posts Archive
Напоминаю, что сегодня в 16:00 по мск обсуждаем UGUI и вёрстку.
Напоминаю, что сегодня в 16:00 по мск обсуждаем UGUI и вёрстку.

Попадает ли точка в радиус? Довольно простой вопрос, который решается банальной проверкой (v2.sqrMagnitude <= radius * radius). Мы такой вопрос часто задаем на собесах, но не только для того, чтобы выяснить считает ли человек через квадрат радиуса, а скорее для того, чтобы задать второй вопрос: "а в эллипс?". И вот на этом вопросе люди начинают сами себя закапывать. Кто-то придумывает несуществующие правила и теоремы, кто-то говорит, что мол "да я это не помню, там высшая математика, кому это вообще надо", ну а кто-то предлагает решение. А самое интересное, что решение довольно простое, которое не требует никаких знаний и формул: Изменяем Y проверяемой точки на фактор соотношения Rx к Ry, а дальше проверяем на попадание в радиус Rx. То есть мы вытягиваем эллипс таким образом, чтобы он стал кругом и считаем уже относительно круга. #basics #ellipse #math #lifehack

В чем отличие Generic.List<> от массива? Такой вопрос мы задавали на собесах. Он помогал нам отсеить и закончить собес на словах "ну лист - это такая штука, где элементы ссылаются друг на друга". Но если человек проходил эту часть успешно (да, такие бывали), то в основном большинстве мы приходили к следующим утверждениям: - List<> это такой массив, но с более удобными методами; - При расширении листа - увеличивается массив x2, а данные копируются; Но был еще дополнительный вопрос:
Vector3[] arr = ; // 1 элемент или больше
List<Vector3> list = ; // 1 элемент или больше
arr[0].x = 123f;
list[0].x = 123f;
Где сломается такой код? - Нигде - arr[0].x - list[0].x - В обоих случаях Этот вопрос был не то чтобы прям "отсеивающим", но в большинстве случаев те, кто не мог ответить на этот вопрос, - никогда не писали своих коллекций и никогда не разбирались как устроены существующие. #interview

Следующий евент пройдет в субботу в 16:00 по мск. Будем обсуждать вёрстку, как верстаются интерфейсы, на что обращать внимани
Следующий евент пройдет в субботу в 16:00 по мск. Будем обсуждать вёрстку, как верстаются интерфейсы, на что обращать внимание. Регайтесь, будет интересно :) https://unsafecsharp.timepad.ru/event/2482334/ #event

Запись с последнего урока по Unity Jobs: https://www.youtube.com/watch?v=Abp_9x8pX-E Все, кто хотят меня поддержать, могут эт
Запись с последнего урока по Unity Jobs: https://www.youtube.com/watch?v=Abp_9x8pX-E Все, кто хотят меня поддержать, могут это сделать тут: Евро: NL19 BUNQ 2070 8912 32 Доллары: GB45 TCCL 0414 0434 4305 90 #event #record

У Vector2/Vector3/Vector4 переопределен оператор ==. Он сравнивает не точное значение, а приблизительное, с учетом погрешности: var v = new Vector3(0f, 0f, 0f); var v2 = Vector3.one - Vector3.one; v == v2 #basics #floats

Довольно долго эта картинка висела у нас в офисе на стене. И да, в целом так оно и было;) #meme
Довольно долго эта картинка висела у нас в офисе на стене. И да, в целом так оно и было;) #meme

Напоминаю, что сегодня встреча, на которой поговорим про джобы. Кто еще не зарегался - велкам) https://t.me/unsafecsharp/119 #event

Как мы строим пути для юнитов в Mushroom Wars 2. https://telegra.ph/Kak-my-stroim-puti-dlya-yunitov-06-23 #mushroomwars #path
Как мы строим пути для юнитов в Mushroom Wars 2. https://telegra.ph/Kak-my-stroim-puti-dlya-yunitov-06-23 #mushroomwars #pathfinding

У нас на интервью был вот такой вопрос одним из последних. Он показывает именно желание думать, если человек не знает на него ответ, конечно. У вас есть односвязный список и указатель на один из его элементов (не последний), как удалить этот элемент из списка, оставив список целостным? Возможно ли решение за О(1)? #interview

Catmull rom - это такая кривая, для построения которой нужно знать 4 точки. Особенность заключается в том, что кривая будет п
Catmull rom - это такая кривая, для построения которой нужно знать 4 точки. Особенность заключается в том, что кривая будет проходить через все 4 точки. На практике мы такое часто используем, т.к. для построения, например, Безье требуются тангенты, расчет которых иногда затруднителен. #splines #curve #math #catmullrom

💾 Хоткей дня Ctrl/Cmd + Shift + P Нажать на кнопку паузы. Довольно часто мышку использовать не получается (например, если нужно отловить состояние до потери фокуса). #hotkey #editor

Немного про сжатие данных. https://telegra.ph/Kak-rabotaet-szhatie-06-21 #compress #algorithms

Ленивый if Условие всегда ленивое и хочет побыстрее выйти. Если v1 будет true, то что там дальше его не будет интересовать: if (v1 == true || v2 == true) {...} Таким образом, если у нас есть такой код: var v1 = CalcV1(); var v2 = CalcV2(); if (v1 == true || v2 == true) {...} Выглядит хоть и симпатично, но совершенно непроизводительно. Лучше писать так: if (CalcV1() == true || CalcV2() == true) {...} Естественнно нужно понимать, что CalcV2 вызываться не будет, если CalcV1 вернет true, поэтому не нужно на это расчитывать. Но я надеюсь, что вы это знаете :) #code #performance #basics

Разбирая свой гитхаб, вспомнил что когда-то писал такую штуку: https://github.com/chromealex/TapticEngine #github

Floodfill Алгоритм заливки. На самом деле ничего нового в нем нет, мы выбираем элемент массива, читаем из него данные и рекурсивно (https://t.me/unsafecsharp/115) обращаемся к элементу сверху, снизу, справа и слева. Таким образом мы обойдем все элементы, но нам нужно обойти лишь те, которые имеют те же данные, что и наш начальный элемент. Пример: 77777 77555 75557 75577 77775 Если мы возьмем центральную 5, то результат заливки числом 6 будет таким: 77777 77666 76667 76677 77775 Алгоритм используется в различных областях. Например, в графах поиска пути (https://t.me/unsafecsharp/69) заливка используется для формирования «закрытых областей», чтобы можно было рано выйти при построении пути, если дойти до точки невозможно (области начальной точки не совпадают с конечной). #floodfill #algorithms

В субботу будет тема про джобы, будем разбираться как работают, что там внутри и всякое такое :) Приходите, будет интересно!
В субботу будет тема про джобы, будем разбираться как работают, что там внутри и всякое такое :) Приходите, будет интересно! https://unsafecsharp.timepad.ru/event/2474487/ #event

Ссылка на запись последнего евента про мультиплеер: https://youtu.be/nImCndj3F6U Все, кто хотят меня поддержать, могут это сд
Ссылка на запись последнего евента про мультиплеер: https://youtu.be/nImCndj3F6U Все, кто хотят меня поддержать, могут это сделать тут: Евро: NL19 BUNQ 2070 8912 32 Доллары: GB45 TCCL 0414 0434 4305 90 #event #record

Пишите non-alloc методы. Мы часто пишем подобные методы:
List<int> GetItems() {
  var items = new List<int>();
  ...
  return items;
}
В этом методе мы просто собираем элементы и возвращаем. При этом создаем список, создание которого мы не можем запретить извне. Для этого лучше писать таким образом:
void GetItems(List<int> items) {
  ...
}
Таким образом контроль над списком может быть таким:
var list = GetFromPool();
GetItems(list);
...
ReturnToPool(list);
#gc #code #allocations

Когда мы начинали делать проект, в юнити не было возможности отключить Garbage Collector. А нам было нужно) У нас геймплей бы
Когда мы начинали делать проект, в юнити не было возможности отключить Garbage Collector. А нам было нужно) У нас геймплей был динамичный и любые "провисания" из-за gc плохо влияли на ощущения от игры. Поэтому мы решили его отключить. Раньше для этого нужно было делать хаки, а сейчас уже есть возможность это сделать нормально: https://docs.unity3d.com/Manual/performance-disabling-garbage-collection.html В нашем кейсе в геймплее мы очень бережно относились (да и относимся) к аллокациям, всё на пулах, поэтому перед началом боя мы выключаем GC, а после боя - включаем и собираем мусор. Такое решение на самом деле в последствии нам помогло на различных платформах в свое время: на ps4 и switch GC.Collect мог занимать до пары секунд. Надеюсь, что сейчас уже нет таких проблем, но 10 лет назад - были 🙂 #unity #gc