К карте
ВЕРФЬ · UNITY · КВЕСТ 3
Охота в глубине
0
Прогресс0 / 5
СДЕЛАЙ ПЕРВЫЙ ХОД

Нажми — и увидишь, что делает команда

Жми кнопки по очереди — это три настоящие команды.
ПЕРЕД СТАРТОМ
⏱ Сколько займёт
30–50 минут, 5 шагов. Каждый шаг заканчивается результатом на экране.
💻 Что нужно
Компьютер с Windows или macOS. Понадобится Unity — бесплатная для учёбы, поставим на первом шаге. С телефона этот квест не проходится.
⏸ Если прервёшься
Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
🎓 Чему научишься
префабы · корутины и спавн · триггеры и теги
ШАГ 1 ИЗ 5 · ВЕРФЬ · UNITY · КВЕСТ 3

Рыба, которая живёт сама

ЧТО ПРОИСХОДИТ
ЭПИЗОД 3Мелководье у верфи

Пустое море — скучное море. Марк высыпает за борт ведро мелкой рыбы.

«Рыба не появляется по одной штуке за раз, когда тебе удобно. Она идёт косяками, сама, пока ты охотишься».

Значит, кто-то должен выпускать рыбу без тебя — раз в пару секунд, снова и снова.

Марк · корабельный мастер верфи
ЧТО ПОЛУЧИТСЯ
ЗАПИСЬ ГОТОВОЙ ИГРЫ
Рыба появляется сама и плывёт своим курсом, а пасть хищника съедает ту, которой коснулась. Хищником управляешь ты — теми скриптами из второго квеста.

Ролик 3D и с готовым счётчиком — он показывает идею охоты. Твоя сцена будет 2D, а улов начнёт считаться в следующем квесте. Сегодня — спавн рыбы и пасть, которая ест.

СНАЧАЛА — ПОСМОТРИ
ЖИВАЯ ЗАПИСЬ ДВИЖКА
Так объекты множат руками: Edit → Duplicate, и копия появляется в Hierarchy. Сегодня эту работу заберёт скрипт — копии будет штамповать спавнер, пока идёт игра.
Марк
Читать текстом
Корабел, одну рыбу мы сделали. Теперь нужно двести, а руками их не расставишь. На верфи для этого есть чертёж, а в Unity — префаб: заготовка, из которой штампуют копии. Правишь заготовку — меняются все разом. Второй секрет: рыба будет появляться сама, по расписанию, через корутину — функцию, которая умеет спать, не останавливая игру. Это родня годотовского await. Сегодня в море заведётся стая, которая живёт без тебя.

Сегодня в море появится жизнь. И её станет можно съесть.

ЗАДАНИЕ 1 · РЫБА ПЛЫВЁТ
FishRotation.csC#
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.

ШАГ 2 ИЗ 5 · ВЕРФЬ · UNITY · КВЕСТ 3

Заготовка, из которой штампуют

НОРА · ВЕДУЩАЯ СТУДИИ
Одну рыбу мы сделали. Теперь нужно двести. Расставлять руками — работа на вечер, а после каждой правки начинать заново. Значит, нужна заготовка.

В Unity она называется префаб. Перетащи объект из Hierarchy в окно Project — и он превратится в заготовку. Меняешь заготовку — меняются все копии сразу.

ЗАДАНИЕ 2 · СПАВНЕР
FishSpawner.csC#
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: иначе спавнер начнёт копировать объект сцены.

Внутри корутины стоит while (true) — бесконечный цикл. Почему игра не зависает?
Unity сам обрывает такие циклы
Из-за yield return: на каждом круге корутина засыпает и отдаёт управление игре
while (true) на самом деле не бесконечный
НАСТОЯЩИЙ ЭКРАН UNITY — КУДА НАЖИМАТЬ
ТВОЙ ЭКРАН UNITY — КУДА НАЖИМАТЬнажми на кружок — покажу место
Окно редактора
  • 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 слишком большой.
Отмечено:0 из 5

Это настоящий экран Unity 6 — такой же, как у тебя. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно. Отмечай пройденное — прогресс сохранится.

ШАГ 3 ИЗ 5 · ВЕРФЬ · UNITY · КВЕСТ 3

Пасть и триггер

ЗАДАНИЕ 3 · ПАСТЬ
ПАСТЬ И ТЕГИ — ЖМИ НА КРУЖОКнажми на кружок — покажу место
FileEditAssetsGameObjectComponentWindowHelpLayout⬡ HierarchySampleSceneMain CameraDirectional LightPlayerBackgroundWaterSurface◈ SceneGame⚙ InspectorPlayerTransformSprite RendererRigidbody 2DBox Collider 2DAdd Component▤ ProjectConsoleAssetsScenesScriptsSprites▶ Game
  • 1Дочерний объект пастиПКМ по Player → Create Empty. Новый объект появится внутри акулы и поедет вместе с ней.
  • 2Add Component → CircleCollider2DИ обязательно поставь галочку Is Trigger — сквозь такой коллайдер проходят, но он замечает гостей.
  • 3Тег объекта — вверху ИнспектораУ рыбы: Tag → Add Tag… → плюс → имя Fish → Save. Ловушка: объект после этого остаётся Untagged — снова открой список Tag и выбери Fish. Тег должен стоять и на префабе, а не только на рыбе в сцене.
  • 4Префаб рыбы — в окне ProjectПеретащи собранную рыбу из Hierarchy в Project. Получится заготовка, из которой игра штампует копии.
Отмечено:0 из 4

Is Trigger — коллайдер-наблюдатель: сквозь него проходят насквозь, но он замечает гостей и зовёт твой код. Если проходил Godot: та же идея, что Area2D.

ЗАДАНИЕ 4 · ОХОТА
PlayerMouth.csC#
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 просто нечем заметить касание.

Почему проверяют CompareTag("Fish"), а не имя объекта?
Копии префаба получают имена вроде Fish(Clone), Fish(Clone)(1) — по имени их не поймать
У объектов в Unity нет имён
Так короче писать
ЭКСКУРС
КАК В НАСТОЯЩИХ ИГРАХ

Мир, который живёт без тебя

В играх есть слово спавн — появление. Рыба, монстры, машины, ящики появляются сами, по расписанию, пока игрок занят другим.

Дизайнеры следят за плотностью: слишком часто — экран превращается в кашу, слишком редко — мир кажется пустым и мёртвым.

В открытых мирах спавн ещё и прячут: врага никогда не создают у игрока на виду — только за спиной, за поворотом, в тумане.

ШАГ 4 ИЗ 5 · ВЕРФЬ · UNITY · КВЕСТ 3

Уборка за собой

ЗАДАНИЕ 5 · УБОРКА
DestroyAfter.csC#
using UnityEngine;

public class DestroyAfter : MonoBehaviour
{
    [SerializeField] private float lifetime = 20f;

    private void Start()
    {
        Destroy(gameObject, lifetime);   // удалить себя через 20 секунд
    }
}
У Destroy есть второй аргумент — задержка. Одна строка вместо целой корутины. Повесь скрипт на префаб рыбы.

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

СОБЕРИ ПОРЯДОК
КАК СДЕЛАТЬ ПРЕФАБ И ЗАПУСТИТЬ СПАВН
Перетащить префаб в поле fish в Инспекторе
Перетащить её в окно Project — получился префаб
Нажать Play — рыбы появляются сами
Собрать одну рыбу: спрайт, коллайдер, скрипт движения, уборка
Удалить рыбу со сцены: оригинал больше не нужен
Создать пустой объект Spawner со скриптом
ШАГ 5 ИЗ 5 · ВЕРФЬ · UNITY · КВЕСТ 3

Своя стая

ЗАДАНИЕ 6 · ФИНАЛЬНОЕ
1
Сделай второй вид рыбы
Другая картинка, другая скорость. Отдельный префаб — и второй спавнер с другими границами.
2
Мелкая и быстрая, крупная и медленная
Разница в поведении важнее разницы в картинке.
3
Поставь редкую золотую рыбу
Спавн раз в двадцать секунд. Пока счёта нет, вся разница — в виде: другой цвет и размер. Цену золотой рыбе назначишь в следующем квесте, когда появится улов.
4
Проверь баланс
Слишком много рыбы — скучно, слишком мало — раздражает. Играй и подкручивай spawnTime.

Ты только что спроектировал экономику игры: сколько добычи, как часто, насколько ценной.

НОРА · ВЕДУЩАЯ СТУДИИ
В море живёт стая, рыба плывёт своим курсом, охота работает, мусор убирается. Экспедиция «Первый спуск на воду» закрыта — у тебя на руках играбельный прототип.
Марк
Читать текстом
Экспедиция «Первый спуск на воду» закрыта: у тебя на руках играбельный прототип. Стая живёт сама, охота работает, мусор убирается. И ты выучил правило, одинаковое во всех движках: всё, что появляется во время игры, обязано уметь исчезать. Дальше игра начнёт считать — улов, очки и рекорд, который переживёт выход.

Задание студии: сделай, чтобы рыба убегала от акулы, когда та близко. Подсказка: в скрипте рыбы найди расстояние через Vector3.Distance и, если оно меньше пяти, разверни рыбу в противоположную сторону.

Поднимай флаг.

Экспедиция закрыта!

Море заселено, охота работает, префабы и корутины освоены. Грейд ДЖУНИОР-РАЗРАБОТЧИК.

Что дальше. На причале висит доска, и на ней мелом — чей улов больше. Половина доски стёрта.

🏅 Забрать диплом Следующий квест: Улов и рекорд Следующая экспедиция: Глубина
🔒

Этот остров ещё закрыт

Сначала пройди предыдущий квест — хотя бы просмотри все шаги.

⚑ Экспедиционный режим