Ответы пользователя по тегу Unity
  • Какие книги стоит почитать для поднятия навыков в написание кода для игр в Unity новичку?

    @Ente
    Unity developer
    1) По C#
    2) Изучи принципы SOLID/KISS/DRY/MVC и популярные паттерны, посмотри статьи/видео на том же хабре или ютубе.
    3) Далее прочитай книги, вроде чистого кода от Мартина, чтобы заиметь привычку не создавать функции по сотне строк и не называть их транслитом.
    4) В тоже время делай пет проекты разных жанров, нарабатывай практику, пусть они плохенькими поначалу, с каждым новым проектом будешь понимать, что раньше надо было сделать по другому. Чем больше кода будет попадать в новые проекты - тем лучше (это значит, что он становится менее связанным и способен переиспользоваться).
    Ответ написан
  • Как десериализовать массив именных объектов в именно объекте посредством Unity JsonUtility?

    @Ente
    Unity developer
    1) Не используй стандартный JSON от Unity - он ужасен, он не работает с уровнем вложенности большим, чем 1.
    2) Newtonsoft гораздо лучше, сама команда Unity включила его в свои packages.
    3) Чтобы считать класс в JSON, тебе нужно создать его с атрибутом [Serializable]. Также обрати внимание, что не все базовые классы/структуры в Unity могут быть сериализованы. Например, могут возникнуть проблемы с Vector3, кое где может потребовать написать свой класс для этого.
    Ответ написан
    Комментировать
  • Как создать шаблоны проектов в Unity?

    @Ente
    Unity developer
    Используй гит и сделай ветвления по разным шаблонам - переключения по веткам происходит достаточно быстро.
    Ответ написан
    Комментировать
  • Можно ли строить логику игры на тегах?

    @Ente
    Unity developer
    1) Поиск объектов по тегам долгое, потребуется постоянное кеширование.
    2) Тегов может стать очень много, выбирать нужный тег из 2000 такое себе удовольствие.
    3) Нельзя сделать несколько тегов (по аналогии с классами в HTML/JS). Допустим у нас есть стратегия, где есть два типа юнитов - техника и пехота, мы не можем сделать общий тег Юнит и добавить плюсом теги Пехота и Техника соответственно для лучшего поиска.

    Если хочешь отвязаться от сериализованных полей Unity (так как они часто бьются) и искать по ним - лучше написать свою систему тегов (которая будет поддерживать множественность) и сделать ее по аналогии с классами в HTML/JS (естественно, с кешированием)
    Ответ написан
    1 комментарий
  • Почему я повернул объект, а в префабе он остался без поворота?

    @Ente
    Unity developer
    Переменные префаба, которые изменены на сцене не меняются, даже если менять их в префабе. Нужно нажать на переменную правой кнопкой мыши и сделать ресет.
    Ответ написан
    8 комментариев
  • Как реализовать зависимость скорости выстрела от скорости персонажа?

    @Ente
    Unity developer
    Перед спавном снаряда, ты можешь брать последнее изменения позиции игрока (например, пошел с 0,0 в 0,1) и добавлять к направлению снаряда, например 10% этого изменения. (прибавляешь 0,0.1 к вектору снаряда)
    Ответ написан
    Комментировать
  • Unity dontdestroyonload как ему взаимодействовать с UI на сцене?

    @Ente
    Unity developer
    Dontdestroyonload по своей сути костыль, лучше использовать несколько сцен, динамически подгружая и выгружая их. UI можно вообще вытащить в отдельную сцену и всегда держать ее активной, так как в любой игре может быть сотни уровней и локаций, но UI то будет всегда единый для них.
    Ответ написан
    Комментировать
  • Ассет по 2д метанию мяча, или как самому написать такое?

    @Ente
    Unity developer
    Берешь точку первого касания, засекаешь текущее игровое время. Затем проверяешь, когда это касание исчезло, смотришь разницу по времени. Также считаешь расстояние между ними. Используя расстояние и время, ты можешь посчитать силу удара, формулу можешь подобрать свою, например, скорость зависит больше от расстояния или наоборот, чем меньше времени прошло, тем сильнее, а лучше и то, и то. Также зная две точки, легко можно найти вектор удара.
    Ответ написан
    Комментировать
  • Как сделать урон от взрыва в Unity 2D (чтобы этот урон получили все, кто находился в радиусе взрыва)?

    @Ente
    Unity developer
    Вешаешь на все предметы, которые должны быть подвержены взрыву коллайдер2D (ставишь IsTrigger=true) и rigidbody2D (его делаешь IsKinematic = true). Затем создаешь префаб со взрывом, также выставь ему коллайдер с IsTrigger=true, а затем в скрипте на предметах, при столкновениях у тебя будет вызываться функция OnTriggerEnter2D. В ней ты можешь узнать с каким триггером объект столкнулся и точку пересечения.
    Ответ написан
    2 комментария
  • Как сделать рандомный спавн нескольких объектов в 1 скрипте?

    @Ente
    Unity developer
    Почему неиграбельно? Создай один префаб - это будет главный образец для метеоритов. Затем создай наследованные префабы от него и дай им уникальные характеристики, например размер, спрайт, какие-то настройки скриптов. Затем создай один скрипт MeteorSpawner. Затем можешь набросать несколько скриптов и каждому выставить уникальные значения, либо разделить на разные GameObject'ы.

    [SerializeField] private GameObject prefab;
    [SerializeField] private Vector2 minPos;
    [SerializeField] private Vector2 maxPos;
    [SerializeField] private Vector2 spawnRate;
    
    private IEnumerator Start()
    {
         while (true)
         {
              yield return new WaitForSeconds(Random.Range(spawnRate.x, spawnRate.y));
              var pos = new Vector2(Random.Range(min.x, max.x), Random.Range(min.y, max.y));
              Instantiate(prefab, pos, Quaternion.identity);
         }
    }
    Ответ написан
    1 комментарий
  • Как задать движение по кривой Безье при старте приложения?

    @Ente
    Unity developer
    Воспользуйся бесплатным плагином из стора - Bézier Path Creator. В нем уже встроены и построение, и нахождение любого положения на кривой и прочие полезные фичи.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы тайл в юнити выбирался, при этом у разных тайлов были разные свойства?

    @Ente
    Unity developer
    Тайлмапы не очень хорошо подходят для интерактива, это больше для создания окружения, которое не взаимодействует с игроком. Использую обычные gameobject'ы, если карта совсем большая и будет просадка по кадрам/памяти, используй то количество, которое видимо на камере (+1 по краям, чтобы не обрезались посередине) и двигай их вместе с камерой, заменяя их свойства согласно твоей карте.

    Либо второй вариант - можешь построить тайлмап, а затем определяй, с каким взаимодействует игрок и вытаскивай из массива (своего скрипта) по координатам их свойства.
    Ответ написан
    Комментировать
  • Как получить абсолютную позицию элемента на канвасе?

    @Ente
    Unity developer
    Ты можешь брать world позицию, как у обычного Transform, а потом перемещать этот объект в другой канвас и ставить ему ту же самую world позицию.
    Ответ написан
    Комментировать
  • Не запускается билд WebGl?

    @Ente
    Unity developer
    WebGL просит, чтобы ты развернуть веб сервер для него (Apache/Nginx). Когда ты запускаешь через Build and Run, Unity скорее всего запускает свой сервер и там дает тебе возможность протестировать, но делает это разово.
    Ответ написан
  • Что лучше, rigid body или character controller для player?

    @Ente
    Unity developer
    Character Controller - аркадная физика, вроде Дума, бегаешь со скоростью 60км в час, мгновенно поворачиваешься, прыгаешь, как супер марио.
    Rigid Body - это уже ближе к физике в стиле GTA IV, с рэгдоллами, скольжениями и т.п.

    Если нужно реалистичную - используешь Rigid Body, если реалистичная физика не нужна - Character Controller
    Ответ написан
    1 комментарий
  • Почему transform.translate отскакивает при касании колайдера?

    @Ente
    Unity developer
    Все перемещения объектов, на которые влияет физика Unity, должны быть сделаны в FixedUpdate, в других Update они будут дергаться и дрожать.
    Ответ написан
  • Как отключить взаимодействие между объектами с Rigidbody2D?

    @Ente
    Unity developer
    Поставь галочку в IsKinematic=true во всех объектах, которые не должны двигаться
    Ответ написан
    Комментировать
  • Как заставить отработать событие OnTriggerExit?

    @Ente
    Unity developer
    Можно перед отключением объекта сдвинуть его на большие координаты, вроде (-99999, 0, 0), тогда функция отработает, как надо. Костыль, но работает.
    Ответ написан
    Комментировать
  • Как исправить ошибку в коде C#?

    @Ente
    Unity developer
    WheelCollider убери
    Ответ написан
    Комментировать
  • Как сделать чтобы Player наносил урон Enemy?

    @Ente
    Unity developer
    Сделай себе два скрипта, первый будет для всех объектов в игре, которые обладают здоровьем, это могут быть персонажи (твой игрок, враги), предметы (двери, стены и т.п.)

    У этих объектов будет скрипт, назовем его Health.cs

    [SerializedField] private int hitpoints = 100;
    public Action<int, int> OnChange;
    
    public void Change(int amount)
    {
               hitpoints += amount;
               OnChange?.Invoke(hitpoints, amount);
    }


    В этом скрипте можно будет менять здоровье через функцию Change, причем в любую сторону, может проходить и урон, так и лечение, все зависит от знака в переданной переменной amount. Также скрипт бросает событие, что здоровье изменилось, чтобы другие скрипты могли подписаться и отреагировать. Например, скрипт, который рисует полосу здоровья или скрипт, который отвечает за смерть персонажа.

    Второй скрипт - Damage.cs. Он будет работать на триггерах в Unity, и когда объекты пересекаются между собой, то происходит вызов функции урона, например, если персонаж встанет в огонь, его затронет пуля или меч. Само собой нужно проставить им триггеры нужного размера, как объекту с уроном, так и тому, кому наносится урон + поставить правильно матрицу коллизий, чтобы OnTriggerEnter2D не затрагивал другие объекты, которые не являются его целью.

    [SerializedField] private int amount = -10;
    public Action<int> OnDamage;
    
    private void OnTriggerEnter2D(Collider2D collider)
    {
          collider.gameObject.GetComponent<Health>().Change(amount);
          OnDamage?.Invoke(amount);
    }
    Ответ написан
    21 комментарий