Написать пост

Пишем арканоид на Unity. Добавление звуков и новых уровней

Аватар Типичный программист

Мы продолжаем цикл статей о написании простой игры на Unity — классического арканоида. Использовать будем только 2D инструменты, предоставляемые нам движком. В каждой из статей мы затронем один из аспектов написания игры, а в этой добавим звуки, создадим новые уровни и задеплоим игру для различных устройств.

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

  1. Настройка проекта.
  2. Механика мяча и платформы.
  3. Поведение блоков, префабы и дизайн уровней.
  4. Добавление звуков и новых уровней.

Превью результата

Ну и по традиции — посмотрим на игру, которая должна получиться у нас по итогам этой статьи.

Звуковые эффекты и музыка

В нашей первой статье мы импортировали в проект несколько звуковых файлов. Пришло время их использовать. В папке Sounds находятся три файла:

  • hit.wav: используется при каждом ударе шарика;
  • lose.wav: используется, когда игрок теряет жизнь;
  • point.wav: используется, когда игрок получает очки.

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

Итак, выберите объект шарика и добавьте Audio Source (Hierarchy -> Inspector -> Add Component). Обратите внимание — при добавлении компонента вы должны снять флажок Play On Awake, иначе звук автоматически будет проигрываться при запуске игры.

Пишем арканоид на Unity. Добавление звуков и новых уровней 1

Итак, компонент добавлен. Настало время изменить скрипт. Откройте его и создайте новую переменную для звукового файла:

public AudioClip hitSound;

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

			void OnCollisionEnter2D(Collision2D collision){
    if (ballIsActive) {
        audio.PlayOneShot (hitSound);
    }
}
		

Обратите внимание на условие проверки активности шарика. Если мяч не будет в активном состоянии (а это значит, что он будет лежать на платформе), то без этого условия звук проигрывался бы всегда.

Перейдите в редактор и убедитесь, что в компоненте Ball Script есть поле Hit Sound.

Пишем арканоид на Unity. Добавление звуков и новых уровней 2

Перетащите звуковой файл hit.wav из окна Project на поле Hit Sound. После этого вы должны увидеть нечто такое:

Пишем арканоид на Unity. Добавление звуков и новых уровней 3

Нажмите кнопку Play и проверьте, воспроизводится ли звук каждый раз, когда мячик сталкивается с чем-нибудь.

А теперь давайте добавим два других звука. Вставьте новый компонент Audio Source, но теперь уже на объект платформы. Не забудьте снять флажок с пункта Play On Awake.

Откройте скрипт и создайте две одинаковые переменные для звука. Первый будет отвечать за звук, который означает, что игрок заработал некоторое количество очков, а второй — за то, что игрок потерял одну жизнь. Обе переменные, как и в первом случае, будут объявлены публично для того, чтобы их можно было задать из редактора Unity:

public AudioClip pointSound;
public AudioClip lifeSound;

Отлично. А теперь откроем метод addPoints и изменим его. Для единовременного проигрывания звука, вам нужно обратиться к методу PlayOneShot объекта audio:

			void addPoints(int points){
	playerPoints += points;
	audio.PlayOneShot (pointSound);
}
		

Аналогично поступим и с методом TakeLife:

			void TakeLife(){
    playerLives--;
    audio.PlayOneShot (lifeSound);
}
		

Сохраните проделанные изменения и перейдите в основной редактор. У компонента Player Script объекта Player есть два неназначенных поля (это только что созданные нами переменные). Перетащите в каждое из полей по звуковому файлу (point.wav и lose.wav):

Пишем арканоид на Unity. Добавление звуков и новых уровней 4

Запустите игру и удостоверьтесь в том, что все три звуковых эффекта работают правильно.

Фоновая музыка

Несмотря на добавленные нами звуковые эффекты, складывается ощущение, что игра какая-то тихая, пустая. Давайте добавим фоновую музыку — для каждого уровня свою.

Во вкладке Hierarchy найдите объект Background и добавьте Audio Source:

Пишем арканоид на Unity. Добавление звуков и новых уровней 5

Теперь перетащите файл Jaunty Gumption.mp3 из окна Project на поле Audio Clip компонента Audio Source. На этот раз оставьте параметр Play On Awake включенным для того, чтобы фоновая музыка играла сразу при загрузке уровня. Также включите параметр Loop, который позволит музыке начаться заново, если она закончится.

Запустите игру и проверьте работу фоновой музыки.

Уровни

Для того, чтобы игра закончилась, требуется:

  • уничтожить все блоки, после чего игра должна перейти на следующий уровень;
  • потерять все свои жизни, после чего игра должна перезапустить текущий уровень.

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

Чтобы сделать это, вы должны сохранить текущую сцену как другую. Выберите File -> Save Scene as…, назовите новую сцену Level2 и поместите его в папку Levels.

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

Выберите объект Background в окне Hierarchy и посмотрите на вкладку Inspector. У компонента Sprite Renderer есть поле Sprite. Перетащите туда другое изображение — background2.jpg из папки Sprites/Backgrounds.

Пишем арканоид на Unity. Добавление звуков и новых уровней 6

Чтобы изменить фоновую музыку, вам достаточно перенести на поле Audio Clip новую музыку. Используйте файл Monkeys Spinning Monkeys.mp3.

Если вы нажмете на кнопку Play, то сможете потестировать новый уровень: он работает точно так же, как и первый, но с другими фоновыми картинкой и музыкой. Итак, второй уровень готов.

Откройте скрипт платформы и добавьте новый метод WinLose. Здесь мы будем проверять, потерял ли все свои жизни игрок. Если переменная playerLives будет равна 0, мы попросту вызовем метод Application.LoadLevel и перезапустим текущий уровень.

			void WinLose(){
    // перезапускаем уровень
    if (playerLives == 0) {
		Application.LoadLevel("Level1");        
    }
}
		

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

Кстати, т.к. у нас всего лишь два уровня, то если игрок прошел второй — мы попросту выйдем из игры, вызвав метод Application.Quit:

			void WinLose(){
    // перезапускаем уровень
    if (playerLives == 0) {
        Application.LoadLevel("Level1");        
    }
 
    // все блоки уничтожены
    if ((GameObject.FindGameObjectsWithTag ("Block")).Length == 0) {
        // проверяем текущий уровень
        if (Application.loadedLevelName == "Level1") {
            Application.LoadLevel("Level2");
        } else {
            Application.Quit();
        }
    }
}
		

Вызывать данный метод мы будем в функции Update:

			void Update () {
	// горизонтальное движение
	playerPosition.x += Input.GetAxis ("Horizontal") * playerVelocity;

	// выход из игры
	if (Input.GetKeyDown(KeyCode.Escape)){
		Application.Quit();
	}

	// обновим позицию платформы
	transform.position = playerPosition;
	
	// проверка выхода за границы
	if (playerPosition.x < -boundary) {
		transform.position = new Vector3 (-boundary, playerPosition.y, playerPosition.z);
	} 
	if (playerPosition.x > boundary) {
		transform.position = new Vector3(boundary, playerPosition.y, playerPosition.z);     
	}
	
	//проверка состояния игры
	WinLose();
}
		

Вернитесь обратно в редактор Unity. Для того, чтобы метод WinLose работал правильно, нам надо пометить блоки тегом. Перейдите в окно Project, откройте папку Prefabs и выберите блок. Сейчас нет тега Block, поэтому вы должны кликнуть на кнопку Tag и выбрать Add Tag. Добавьте новый тег под названием Block:

Пишем арканоид на Unity. Добавление звуков и новых уровней 7
Пишем арканоид на Unity. Добавление звуков и новых уровней 8

Запустите игру и протестируйте, работают ли переходы между уровнями.

Компиляция и развертывание

Итак, мы подошли к последней стадии в разработке нашей маленькой игры. Нажмите File -> Build Settings. Появится новое окно, где, скорее всего, Scenes In Build будет пустым, как здесь:

Пишем арканоид на Unity. Добавление звуков и новых уровней 9

Если у вас это окно выглядит также, то вы должны добавить ваши сцены в сборку. Нажмите Add Current и добавится текущая.

Пишем арканоид на Unity. Добавление звуков и новых уровней 10

Закройте это окно и откройте в редакторе второй уровень. Затем аналогичным образом добавьте сцену в сборку.

Пишем арканоид на Unity. Добавление звуков и новых уровней 11

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

А теперь нажмите на кнопку Build and Run, и вы должны увидеть окончательную версию вашей игры.

Как вы могли заметить, Unity поддерживает множество платформ:

  • Веб-браузеры
  • Windows, Mac, Linux
  • iOS, Android, Blackberry, Windows Phone 8
  • Google Native Client
  • Xbox 360, PS3, Wii
  • Windows Store

Большим преимуществом этого движка является то, что написав код однажды, вы можете развернуть ваше приложение на любой из вышеупомянутых платформах. Тем не менее, ограничения, все же, имеются. Например, вы не сможете установить ваше приложение на iOS, если у вас нет компьютера на Mac OS и лицензии iOS-разработчика. Из-за отсутствия лицензии разработчика развернуть приложения для консолей вы также не сможете.

Задачи

Теперь вы готовы для того, что начать разработку игр на Unity самостоятельно. Мы можем вам предложить несколько задач, процесс решения которых поможет вам освоить новые знания. Итак:

  1. Добавьте еще больше блоков. Таких, которые бы различались количеством ударов, от которых они ломаются, и очков, которые зарабатывает игрок при уничтожении блока.
  2. Создайте совершенно другой, оригинальный уровень. Чтобы различались не только фон и музыка, но и расположение и количество блоков.
  3. Реализуйте многопользовательский режим.

Вывод

А на этом все! Наш цикл уроков подошел к концу, а вы теперь знаете чуточку больше и способны начать разрабатывать свою собственную 2D игру на Unity.

Перевод статьи «Build Arkanoid With Unity: Audio, New Levels, and Deployment»

Разработка игр
Unity
14651