Нажми — и увидишь, что делает команда
- ⏱ Сколько займёт
- 30–50 минут, 5 шагов. Каждый шаг заканчивается результатом на экране.
- 💻 Что нужно
- Компьютер с Windows или macOS. Понадобится Unity — бесплатная для учёбы, поставим на первом шаге. С телефона этот квест не проходится.
- ⏸ Если прервёшься
- Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
- 🎓 Чему научишься
- префабы · корутины и спавн · триггеры и теги
Рыба, которая живёт сама
Пустое море — скучное море. Марк высыпает за борт ведро мелкой рыбы.
«Рыба не появляется по одной штуке за раз, когда тебе удобно. Она идёт косяками, сама, пока ты охотишься».
Значит, кто-то должен выпускать рыбу без тебя — раз в пару секунд, снова и снова.
Ролик 3D и с готовым счётчиком — он показывает идею охоты. Твоя сцена будет 2D, а улов начнёт считаться в следующем квесте. Сегодня — спавн рыбы и пасть, которая ест.
Читать текстом
Сегодня в море появится жизнь. И её станет можно съесть.
using UnityEngine; public class FishRotation : MonoBehaviour { [SerializeField] private float rotateTime = 2f; // как часто менять курс [SerializeField] private float speed = 1.5f; // как быстро плывёт private float timer = 0f; private void Update() { transform.position += transform.right * speed * Time.deltaTime; // плывём вперёд timer -= Time.deltaTime; // считаем время вниз if (timer <= 0f) { Vector3 look = Random.insideUnitCircle; // случайное направление look.z = 0f; transform.right = look; timer = rotateTime; // завели заново } } }
Time.deltaTime — время одного кадра. Умножаем на него скорость — и рыба плывёт одинаково на быстром и на медленном компьютере. Первая строка Update двигает рыбу туда, куда смотрит её «право», вторая половина метода этот курс меняет. Random.insideUnitCircle выдаёт случайную точку внутри круга радиусом 1 — удобный способ получить случайное направление.Таймер, который тикает вниз, — самая частая конструкция в играх. Перезарядка, спавн, кулдаун способности — всё устроено так же.
Проверь: повесь скрипт на рыбу и нажми Play — она должна поплыть и примерно раз в две секунды менять курс. Стоит на месте — потерялась строка с transform.position.
Заготовка, из которой штампуют
В Unity она называется префаб. Перетащи объект из Hierarchy в окно Project — и он превратится в заготовку. Меняешь заготовку — меняются все копии сразу.
using UnityEngine; using System.Collections; public class FishSpawner : MonoBehaviour { [SerializeField] private GameObject fish; // сюда перетащи префаб [SerializeField] private float spawnTime = 1.5f; [SerializeField] private float minX = -10f, maxX = 10f; [SerializeField] private float minY = -5f, maxY = 3f; private void Start() { StartCoroutine(SpawnFish()); } private IEnumerator SpawnFish() { while (true) { yield return new WaitForSeconds(spawnTime); float x = Random.Range(minX, maxX); float y = Random.Range(minY, maxY); Instantiate(fish, new Vector3(x, y, 0f), transform.rotation); } } }
yield return new WaitForSeconds(1.5f) — «поспи полторы секунды и продолжи отсюда же». Если проходил Godot: это родственник await. Instantiate создаёт копию префаба.Границы minY и maxY выставь так, чтобы рыба появлялась под водой, а не в небе.
Сам спавнер — пустой объект: ПКМ в Hierarchy → Create Empty, имя Spawner, затем Add Component → Fish Spawner. И перетащи в поле Fish именно префаб из окна Project, а не рыбу из Hierarchy: иначе спавнер начнёт копировать объект сцены.

- 1Hierarchy — собери рыбу и пастьПКМ по пустому месту → Create Empty, назови Fish. А ПКМ по акуле → Create Empty даст дочерний объект Mouth: он поедет вместе с ней.
- 2Tag — самая верхняя строка ИнспектораУ рыбы нажми Tag → Add Tag… → создай тег Fish и поставь его. По тегу код в пасти отличит рыбу от камня.
- 3Детали рыбы и акулыЗдесь добавляют Circle Collider 2D с галочкой Is Trigger — сквозь такой проходят насквозь, но он замечает гостей. Кнопка Add Component — в самом низу Инспектора.
- 4Project — сюда тащат префабПеретащи собранную рыбу из Hierarchy в это окно: получится заготовка. Спавнер штампует из неё копии командой Instantiate.
- 5Play — поохотьсяРыбы должны исчезать от касания ПАСТЬЮ, а не боком и не хвостом. Исчезают отовсюду — коллайдер Mouth слишком большой.
Это настоящий экран Unity 6 — такой же, как у тебя. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно. Отмечай пройденное — прогресс сохранится.
Пасть и триггер
- 1Дочерний объект пастиПКМ по
Player→ Create Empty. Новый объект появится внутри акулы и поедет вместе с ней. - 2Add Component → CircleCollider2DИ обязательно поставь галочку Is Trigger — сквозь такой коллайдер проходят, но он замечает гостей.
- 3Тег объекта — вверху ИнспектораУ рыбы: Tag → Add Tag… → плюс → имя
Fish→ Save. Ловушка: объект после этого остаётся Untagged — снова открой список Tag и выбериFish. Тег должен стоять и на префабе, а не только на рыбе в сцене. - 4Префаб рыбы — в окне ProjectПеретащи собранную рыбу из Hierarchy в Project. Получится заготовка, из которой игра штампует копии.
Is Trigger — коллайдер-наблюдатель: сквозь него проходят насквозь, но он замечает гостей и зовёт твой код. Если проходил Godot: та же идея, что Area2D.
using UnityEngine; public class PlayerMouth : MonoBehaviour { private void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("Fish")) { Destroy(other.gameObject); // рыба съедена } } }
OnTriggerEnter2D Unity вызывает сам, подписываться не надо. CompareTag сравнивает тег — это быстрее и надёжнее, чем сравнивать имена. Destroy убирает объект со сцены насовсем. Если проходил Godot: это его queue_free().Нажми Play и поохоться. Рыбы должны исчезать при касании пастью — но не боком и не хвостом.
Не исчезают? Проверь набор деталей на рыбе: Sprite Renderer + Circle Collider 2D + FishRotation + DestroyAfter + тег Fish. Без коллайдера OnTriggerEnter2D не сработает вообще — Unity просто нечем заметить касание.

Мир, который живёт без тебя
В играх есть слово спавн — появление. Рыба, монстры, машины, ящики появляются сами, по расписанию, пока игрок занят другим.
Дизайнеры следят за плотностью: слишком часто — экран превращается в кашу, слишком редко — мир кажется пустым и мёртвым.
В открытых мирах спавн ещё и прячут: врага никогда не создают у игрока на виду — только за спиной, за поворотом, в тумане.
Уборка за собой
using UnityEngine; public class DestroyAfter : MonoBehaviour { [SerializeField] private float lifetime = 20f; private void Start() { Destroy(gameObject, lifetime); // удалить себя через 20 секунд } }
Destroy есть второй аргумент — задержка. Одна строка вместо целой корутины. Повесь скрипт на префаб рыбы.Без уборки за десять минут игры в сцене окажется четыреста рыб, и телефон начнёт греться. Всё, что появляется во время игры, обязано уметь исчезать — правило, одинаковое во всех движках.
Своя стая
Ты только что спроектировал экономику игры: сколько добычи, как часто, насколько ценной.
Читать текстом
Задание студии: сделай, чтобы рыба убегала от акулы, когда та близко. Подсказка: в скрипте рыбы найди расстояние через Vector3.Distance и, если оно меньше пяти, разверни рыбу в противоположную сторону.
Поднимай флаг.