Урок 7 из 8 · 25 мин · обновлено

Звук, анимация и сцены: победа и поражение

Как проиграть звук через AudioSource, как устроены Animation и Animator, как переключать сцены через SceneManager и собрать полный игровой цикл: начало, победа, поражение, перезапуск.

Звук

Звук в Unity играет компонент AudioSource, а слышит его Audio Listener — он уже стоит на главной камере. Звуковые файлы (.wav, .mp3, .ogg) просто перетаскивают в окно Project. Бесплатные звуки можно найти, например, на freesound.org, проверяя лицензию каждого файла.

Добавим звук монеты. Повесьте на GameManager компонент AudioSource и дополните скрипт:

C#
[SerializeField] private AudioSource audioSource;
[SerializeField] private AudioClip coinSound;

public void AddCoin()
{
    coins++;
    audioSource.PlayOneShot(coinSound);
    UpdateUI();
}
  • AudioClip — сам звуковой файл, его перетаскивают в поле из Project;
  • PlayOneShot проигрывает звук один раз и не обрывает предыдущий. Если собрать две монеты подряд, прозвучат оба звука.

Для фоновой музыки удобнее отдельный AudioSource с включёнными Play On Awake и Loop: музыка начнётся сама и будет играть по кругу.

Анимация

Анимация в Unity — это запись того, как меняются свойства объекта во времени: позиция, поворот, масштаб, цвет.

  • Окно Animation (Window → Animation → Animation): выбираете объект, создаёте клип, нажимаете запись и в разные моменты времени меняете свойства. Unity плавно достроит промежутки. Так можно сделать, например, монету, которая плавно качается вверх-вниз.
  • Animator — схема состояний: «стоит», «бежит», «прыгает» и стрелки переходов между ними. Переходы срабатывают по параметрам, которые меняет скрипт:
C#
animator.SetBool("IsRunning", true);
animator.SetTrigger("Jump");

Анимации персонажей обычно рисуют художники и аниматоры, а разработчик подключает их и пишет переходы. Готовые модели с анимациями есть в Unity Asset Store, в том числе бесплатные.

Сцены: победа и поражение

Каждый экран игры удобно делать отдельной сценой. Переименуйте SampleScene в Game и создайте ещё две сцены: Win и Lose (File → New Scene). В каждой — Canvas с текстом «Победа!» или «Поражение» и кнопкой «Ещё раз».

Сцены нужно добавить в список сборки: File → Build Profiles → Scene List, перетащите туда все три. Сцена, которая стоит первой, загрузится при запуске игры.

Переключает сцены SceneManager:

C#
using UnityEngine.SceneManagement;

public void AddCoin()
{
    coins++;
    audioSource.PlayOneShot(coinSound);
    UpdateUI();

    if (coins >= coinsToWin)
    {
        SceneManager.LoadScene("Win");
    }
}

public void LoseLife()
{
    lives--;
    UpdateUI();

    if (lives <= 0)
    {
        SceneManager.LoadScene("Lose");
    }
}

При загрузке новой сцены все объекты старой исчезают. Если сцену загрузить заново, все монеты и счётчики вернутся в начальное состояние.

Так получился полный игровой цикл: игра → победа или поражение → «Ещё раз». В любой игре он есть, даже в самой маленькой.

Попробуйте сами. Сделайте кнопку «Ещё раз» на сценах Win и Lose: по нажатию снова загружается сцена Game. Подумайте, как сделать кнопку «Начать заново» прямо во время игры.

Решение

Скрипт MenuButtons повесьте на любой объект в сценах Win и Lose, например на Canvas:

C#
using UnityEngine;
using UnityEngine.SceneManagement;

public class MenuButtons : MonoBehaviour
{
    public void PlayAgain()
    {
        SceneManager.LoadScene("Game");
    }
}

У кнопки в событии On Click нажмите плюс, перетащите объект со скриптом и выберите MenuButtons → PlayAgain.

Для перезапуска во время игры загружают текущую сцену, какой бы она ни была:

C#
public void Restart()
{
    SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Какой компонент воспроизводит звук в сцене?

  2. SceneManager.LoadScene("Win") выдаёт ошибку, хотя сцена Win есть в проекте. В чём дело?

  3. Как перезапустить текущий уровень?

  4. Чем Animator отличается от окна Animation?