Как сделать респаун в юнити

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

Вы можете использовать способ, описанный в этой статье в случае, если в вашей игре враги или что вы там спавните не уничтожаются после смерти при помощи GameObject.Destroy(gameObject), а просто выключается gameObject.SetActive(false). Очередь объектов представляет собой список объектов или массив как вам удобнее, который увеличивается или уменьшается в зависимости от текущей ситуации и требований других объектов в игре (например, триггер, который говорит, что тут необходимо заспавнить врага. Так же, если вы уничтожаете объекты после смерти рекомендую это пересмотреть потому, что клонирование объекта из префаба при появлении и потом еще уничтожение занимает время, а включение и выключение объектов занимает меньше времени, хотя, потребуется лишняя оперативная память.

Сразу могу сказать, что пример, который я буду разбирать может совершенно не подойти к вашей игре потому, что к каждой игре нужен свой подход и универсальных методов типа системы спавна не бывает так как у каждой игры на это свои требования, за исключением однотипных игр. Скрипт состоит из списка типа List и нескольких функций для управления процессами, происходящими в классе.

public class PoolItemScript : MonoBehaviour

public bool use = false;
public bool enab = false;
float timeLastActivation;
public bool del = false;

void OnEnable() timeLastActivation = UnityEngine.Time.time;
enab = true;
>

void OnDisable () enab = false;
>

public float GetLastTimeActivation() return timeLastActivation;
>

public bool IsFree() return use == false && enab == false && del == false;
>

public void SetEnab_and_NoUse() gameObject.SetActive (true);
use = false;
>
>

Данный скрипт устанавливается на префаб, который будет в очереди. Скрипт хранит информацию о том включен в данный момент объект или нет. Кто-то спросит зачем мне это, но ответ прост, я в своих играх использую реактивные расширения и так как там не всегда операции идут в базовом потоке, то лучше если информация о рабочем стоянии объекта будет в переменной, которую можно считывать из любого потока. Информацию про использование в данный момент объекта (переменная use), имеется ввиду использование объекта очередью, изменение характеристик или спавн в новом месте. Переменная del, означает будет удален объект в ближайшее время или нет. Объекты удаляются в случае, если оно давно не использовались, поэтому тут мы видим переменную обозначающую время последнего использования.

В этом скрипте работает очередь только для одного объекта. В глобальных переменных есть переменная обозначающая количество секунд в интервалах между проверками очереди, префаб, список скриптов объектов очереди. В функции Update в определенный интервал времени запускается механизм удаления из очереди объектов, которые давно не использовались, например, если у нас игра жанра РПГ, то в пределах мирных зон вполне можно потихоньку отчистить очередь спавна. Так отчистка в данной версии скрипта может спасти игру от ситуации, когда объект где-то затерялся и никак не выключается ну мало ли баг появился и объект не умер или провалился в текстуры; бывают разные ситуации. GetFreeItem – именно это метод будет выдавать скрипту спавна свободные объекты, если таковых нет он их создаст из добавит в очередь. Регулировка количества объектов в очереди у меня возложена скрипт спавна, но в вашем случае она может размещена в скрипте очереди.

Я хочу снова вернуть своего игрока туда, где он начал в начале игры, без уничтожения любого объекта и окончания игры после удара с объектом. У моего игрока три сердца, прежде чем он умрет. Когда мой игрок потеряет сердце (после столкновения с тегом), я хочу снова вернуть своего игрока туда, где он начал в начале игры.

Это код здоровья моего игрока:

И этот сценарий используется на моем объекте, чтобы нанести ему урон (забрать его сердце)

Спасибо, В общем, я хочу вернуть своего игрока обратно туда, где он начал в начале игры после столкновения с моим объектом, я не хочу, чтобы игра возобновлялась после потери сердца, которое я хочу продолжить, пока все сердца не будут проиграл, когда игра перезапустится.

Вам нужно восстановить начальную позицию игрока при запуске, а затем сбросить его, когда он получит урон. Попробуйте что-то подобное в сценарии "Здоровье вашего игрока":

Я надеюсь, что это помогает

Самый простой способ, который я могу себе представить на данный момент, - создать пустой GameObject и поместить его туда, где вы хотите, чтобы ваш игрок появился. Затем, когда игрок получает удар, и вы хотите, чтобы он был респаун, вы можете сделать это с помощью метода respawn():

Это присвоит вашему игроку пустую позицию gameObject. Просто будьте осторожны, чтобы пустой объект находился не в земле, или ваш игрок мог застрять.

Команда Unity3D заботится о рядовых пользователях и разработчиках игр. Поэтому в Unity была введена интересная система, называется она – Character Controller, а по русски – Контроллер Персонажа. Что же она делает и для чего вообще нужна? В основном она используется для управления персонажем от первого или третьего лица без использования физики Rigidbody.


Итак для начала нам следует подготовить сцену. Создадим Terrain, Меню GameObject>3d Object>Terrain

И создадим заготовку нашего персонажа. Для этого опять, Меню GameObject>Create Empty и назовем его Player. Затем делаем нашу камеру дочерней нашему свежесозданному Player.

Теперь добавим плееру компонент Character Controller. Для этого в окне инспектора нажмем кнопку Add Component и в появившемся списке в пункте Physics нажмем на Character Controller.

Когда контроллер персонажа добавлен к нашей заготовке, рассмотрим подробнее поля его настроек.

Slope Limit: этот параметр ограничивает возможность персонажу взбираться на различные препятствия. Например, по умолчанию стоит число 45, это значит, что если угол препятствия больше 45 градусов, то персонаж на него не сможет взобраться.

Step Offset: персонаж будет подниматься по лестнице, только если он ближе к земле, чем указанное значение.

Skin width: 2 коллайдера могут пересечься друг с другом на глубину, равную значению Skin Width.

Min Move Distance: если персонаж пытается переместиться ниже указанного значения, он не будет двигаться вообще.

Center: сдвиг коллайдера контроллера.

Radius: радиус коллайдера контроллера. Определяет, насколько жирный получился персонаж.

Height: высота коллайдера. Ну и, соответственно, высота контроллера. Например, если сделать это значение выше высоты дверных проемов, то персонаж просто застрянет в них.

Пока все значения оставим по умолчанию. В дальнейшем можно поменять их для лучшей работы контроллера. И как, это не странно, подготовка персонажа готова. Нам осталось написать небольшой скрипт управления камерой и нашим контроллером и персонаж будет готов.

Создадим новый скрипт под названием Player. Этот скрипт нам нужен для отдачи команд CharacterController, который и будет их выполнять, двигая и поворачивая персонажа. Для этого выберем в иерархии нашего персонажа и в инспекторе нажмем Add Component. Далее, в конце появившегося списка, нажимаем New Script, в появившемся поле ввода вводим название скрипта, в нашем случае – Player.

Завершающие действие – это кнопка Create and Add. Нажимаем! Отлично, скрипт создан и добавлен к нашему персонажу!

Откроем его, кликнув по его имени два раза.


В этом скрипте нам надо обьявить три переменные. Первая – это ссылка на CharaсterController. Вторая – скорость движения. Третья-скорость поворота. И укажем им значения по умолчанию 1 и 3 соответственно.


В методе Start, который, как мы знаем, вызывается при старте сцены, добавим строку, которая найдет и добавит компонент CharacterController к нашей переменной. Конечно же, при условии, что он присутствует на том же GameObject что и наш скрипт.


Теперь переходим к методу Update. Этот метод вызывается каждый кадр. В него для начала добавим строку, которая поворачивает наш персонаж вокруг оси Y, посредством клавиш leftArrow и RightArrow.


Затем мы задаем, куда нам двигаться. Точнее – вектор направления. Он у нас forward или z.


Затем мы устанавливаем скорость движения. В зависимости от того, какая клавиша нажата, она положительная или отрицательная. То есть вперед и назад.


И наконец, собираем все это вместе и передаем на Character Controller.


Сохраняем наш скрипт и переходим в Unity. На нашем персонаже должно быть два скрипта Charaster Controller и Player.


Жмем Play и стрелочками на клавиатуре двигаем и поворачиваем нашего персонажа. Урааа, побежали!



Для игр, где требуется создавать множество врагов или просто случайно генерировать объекты на сцене очень важна реализация спавна объектов - их создания из скрипта. Давайте рассмотрим, как это сделать.

Первым делом обозначим переменные, которые будем использовать. Это переменная игрового объекта, который надо создать и переменная позиции в 3D или 2D пространстве. В моем примере игра трехмерная.

Vector3 spawn_pos = Vector3.zero;

Теперь создадим объект на сцене с помощью встроенной в Unity функции Instantiate():

Instantiate(prefab, spawn_pos, Quaternion.identity);

Первый арггумент - объект, второй - позиция в виде Vector3, третий - вращение, которое оставлено неизменным.

Читайте также: