Как стать автором
Обновить

Комментарии 16

и, после двойного клика, впервые познакомимся с MonoDevelop в рамках этой серии уроков

Неожиданно рад, что в «Блоге компании Microsoft» знакомят со средой разработки MonoDevelop. Ожидал, что в первом уроке первым пунктом будет «Как подключить среду разработки Visual Studio к Unity».
Хорошие туториалы у вас, продолжайте в том же духе.
Для разнообразия к этой главе было бы неплохо добавить какой-либо визуальный эффект при подборе звезды, например анимировать её улетание к квадрату, всего-то снять триггер с коллайдера и проанимировать координаты, а визуально приятнее.
При «сборе» объектов (в данном случае — звезд) лучше не вызывать Destroy, а деактивировать объект через GameObject.SetActive(false); потому как Destroy() вызывает процесс сборки мусора и на слабых машинах и мобильных устройствах может быть подергивание при работе сборщика, особенно при большом количестве активных объектов в сцене.

Кроме того, логику камеры лучше выполнять в LateUpdate(), т.е. после того, как контроллер о остальные «подвижные» объекты обновили свое положение.
Если просто играетесь с юнити, то ничего страшного)
Если делаете настоящюю игру, то довольно быстро придете к идее пула объектов. Плюсов куча, даже объяснять не буду — все и так разжевано 1000 раз.

Кроме того, функция Destroy() не вызывается мгновенно, а лишь помечает что объект должен быть уничтожен когда-нибудь, когда предоставиться такая возможность так что у него есть все шансы дожить до следующего кадра и скорее всего так и произойдет и он может снова столкнуться с игроком или чем то еще. Тогда мы за одну звезду заработаем 2 очка.
Например у нас сетевая игра и играют 2 персонажа которые почти одновременно подошли к звезде. или мы дергаемся около звезды вправо-влево, так что звезда еще не уничтожилась, а мы успели покинуть пределы коллайдера и снова его пересечь) Вот тут пул тоже здорово поможет
Функция Destroy() гарантирует удаление перед рендерингом кадра, т.е. на следующем Update() его не должно быть. При этом объект не удалится в текущем кадре.
Я не говорю про сетевую игру, не знаю как там устроенно.
Перед рендерингом следуйщего кадра, это конечно хорошо, но вот только физика имеет свой отдельный цикл, не связаный с рендерингом
В этом можно убедиться если заменить OnTriggerEnter() на OnTriggerStay(). звезда подберется несколько раз
Если делаете настоящюю игру, то довольно быстро придете к идее пула объектов. Плюсов куча, даже объяснять не буду — все и так разжевано 1000 раз.

Киньте ссылку, чтоли
Оу, почему в голосовании не чекбоксы!?
Мне кажется, было бы лучше проверять не по имени GameObject, a по наличию компонента Star, в котором заодно можно завести количество очков, получаемых при сборе этой звезды.

Например, так:

class Star: MonoBehaviour { public int score = 100; }

И проверять его наличие так:
var star = col.gameObject.GetComponent<Star>(); if(star != null) { score += star.score; Destroy(star.gameObject); }
Определенно можно :) Забыл добавить дисклеймер о том, что предложенное решение не является единственным возможным или оптимальным :)
Спасибо, отличная статья! Почти все понятно лучше чем в других встреченных мне туториалах.

Непонятно только где должна быть функция отображения гуи? Сама функция простая и понятная, а где она находится — ни слова.

И ещё вопрос, если можно. Мы создали коллайдер, назначили его триггером, поставили на него скрипт с названием dieScript. По логике вещей — это скрипт привязанный именно к этому триггеру. Почему внутри скрипта мы должны ещё раз проверять совпадение имени объекта столкновения? Я бы ещё понял если бы мы там проверяли что наш триггер столкнулся именно с объектом-игроком, а не с каким-то другим. Но получается что все столкновения возможны только с игроком, и мы проверяем что игрок столкнулся именно с этим триггером. Непонятная логика какая-то.
И потом скрипт на звезду — мы создали для объекта звезды свой скрипт? Или мы дописали ещё один иф в dieScript? Если второе — то я вообще не понимаю логики работы скриптов.
Скрипты столкновения, насколько я понял, привязаны к обьекту игрока, а не к триггерам. Поэтому нужна проверка, с чем мы собственнo столкнулись.
В гифке добавляется dieScript к dieCollider, но код на проверку с ним же. Исправить: проверять с именем героя или просто скрипт добавить на героя. Это косяк автора статьи, я ему утром написал, но он ещё не ответил.
Со звездой: можно добавить скрипт как для звезды, так и для героя, просто не перепутать кто с кем сталкивается. Но по смыслу кода, OnGUI и код столкновения со звездой должен быть в коде героя. Там же переменная score.
Да, конечно, никакого dieScript, это моя больная фантазия :) Проверка столкновения вешается на героя и все в порядке.
Спасибо, это всё объясняет.
Ну где там уже следующая статья? :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий