Создание чекпоинта на юнити

Всем привет! В данной статье я хотел бы показать вам как сделать простой и функциональный чекпоинт на движке юнити.

Подготовка

Итак, мы создаем какой-нибудь платформер и нам остро необходимо создать точку сохранения (или чекпоинт) персонажа.

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

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

Но тут возникает проблема. Когда персонаж умирает, сцена перезапускается, и позиция чекпоинта сбрасывается. Для того, чтобы скрипт работал, нам нужно «сохранять» координаты точки сохранения. Делать мы это будем при помощи модификатора static.

Static позволяет сделать какую-либо часть класса «общей». То есть, если говорить простыми словами, переменная будет принадлежать всем классам этого типа, и не уничтожаться при уничтожении экземпляра класса (простите за тавтологию), что нам и нужно. Крайне рекомендую ознакомиться с этой темой. Это очень крутая вещь, если уметь ей пользоваться. Вот ссылка.

Обычный чекпоинт

Я немного затянул с вступлением, поэтому не будем больше терять времени и приступим к написанию кода.

Создадим скрипт с именем Checkpoint и повесим его на персонажа.

В скрипте напишем:

using UnityEngine; public class Checkpoint : MonoBehaviour { static Vector3 lastCheckpointPosition = Vector3.zero; //Позиция последнего чекпоинта //Так как она статическая не будет сбрасываться до выключения игры private void Start() { if (lastCheckpointPosition != Vector3.zero) { transform.position = lastCheckpointPosition; //Будем телепортировать персонажа только если он "собрал" хотя бы один чекпоинт } } private void OnTriggerEnter2D(Collider2D collision) { if (collision.CompareTag("Checkpoint")) { lastCheckpointPosition = collision.transform.position; //Записываем позицию точки сохранения в переменную } } }

В принципе все. Теперь ваш персонаж будет «собирать» точки сохранения и телепортироваться к ним после смерти.

«Продвинутый» чекпоинт

А этот скрипт пригодится, если у вас большие уровни, и персонаж может упасть с одного чекпоинта на друтой.

Он будет телепортировать персонажа (или любой другой обьект на котором скрипт висит) на последний собранный чекпоинт, а если вы соберете уже собранный ранее чекпоинт то он не будет считаться.

Вот скрипт:

using UnityEngine; using System.Collections.Generic; public class Checkpoint : MonoBehaviour { static List<Vector3> collectedCheckpoints = new List<Vector3>(); //Список собранных чекпоинтов private void Start() { if (collectedCheckpoints.Count>0) { //Если был собран хотя бы один чекпоинт, то телепортируем игрока на позицию последнего собранного transform.position = collectedCheckpoints[collectedCheckpoints.Count - 1]; } } private void OnTriggerEnter2D(Collider2D collision) { if (collision.CompareTag("Checkpoint") && !IsCheckpointCollected(collision.gameObject.transform.position)) { //Если это чекпоинт и он не был собран, то добавляем его в список собранных //Иначе просто игнорим collectedCheckpoints.Add(collision.gameObject.transform.position); } bool IsCheckpointCollected(Vector3 checkingCheckpointPosition) { //Функция проверяет, был ли когда-нибудь собран чекпоинт с позицией проверяемого ранее if (collectedCheckpoints.Count>0) { foreach (Vector3 collectedCheckpoint in collectedCheckpoints) { if (checkingCheckpointPosition == collectedCheckpoint) { return true; } } } return false; } } }

Заключение

В этой статье я показал вам как сделать чекпоинт на юнити. Надеюсь эта статья была вам полезна.

Если вы хотите увидеть реализацию какой-нибудь другой механики здесь, то пишите в комментариях. Также буду весьма раз фидбеку.

Всем пока!

22
5 комментариев

переменная будет принадлежать всем классам этого типа, и не уничтожаться при уничтожении классаКлассы не уничтожаются. Уничтожаются экземпляры класса — объекты.
Но тут возникает проблема. Когда персонаж умирает, сцена перезапускается, и позиция чекпоинта сбрасывается.DontDestroyOnLoad вам в помощь.

3
Ответить

Спасибо. Учту при следующих публикациях

2
Ответить

А как это делать?
Расскажите пожалуйста 🥺

Ответить

Делать мы это будем при помощи модификатора static.

3
Ответить

А куда писать координаты в первом случае? (Я новичок)

Ответить