Учебные материалы для школы программирования. Часть13
Предыдущие уроки можно найти здесь:При тематическом планировании уроков, мы сталкиваемся с интересной задачкой: в нашей группе учатся и мальчишки и девчонки. У них разные вкусы, разные любимые герои, жанры. И если все занятия будут на тему гонок или Silent Hill - ряды девочек на ваших занятиях, - поредеют. Эту ситуацию мы решаем двумя способами:
-
спрашиваем мнение ребят и проводим голосование на уроке. Да-да, только дети смогут сделать вашу программу интересной, поэтому их мнение действительно значимо. Не для галочки. Опрос и обсуждение важно проводить регулярно, ибо все группы разные, темы меняются от возраста к возрасту, меняются в зависимости от того, во что сейчас играют и что смотрят в кино;
-
чередуем и комбинируем. Мы стараемся чередовать "спокойные" и "агрессивные" проекты. Например, в этом месяце мы делаем лабиринт ужасов, но после его защиты - приступаем к созданию острова с лесом и домиком. При комбинировании, мы предлагаем всем ребятам уделить внимание визуальной составляющей (раскрасить, добавить элементов, составить композицию и пр.), и девочки с большим энтузиазмом берутся за такую задачу.
Сегодня мы сделаем проект из категории: спокойный, для девчат. Мальчишкам тоже хорошо заходит - особенно момент, когда в конце урока получается звуковая какофония =)
Рассмотрим следующие темы:
-
выставление вращения объектов в локальной системе координат посредством конверсии из углов Эйлера в кватернионы;
-
события объектов OnMouseEnter и OnMouseExit;
-
метод POW класса Mathf - возведение в степень;
-
парсинг float из имени объекта через системный метод Parse ;
-
стек постэффектов от Unity Technologies;
-
функция движка RequireComponent.
Особое внимание обратим на:
-
изменение скорости воспроизведения и высоты звука через Pitch;
-
использование аудиомикшера и постэффектов на мастер-канале микшера, в частности, реверберации и эмуляции комнаты.
Порядок выполнения
Создаётся новый проект, импортируется приложенный ассет, открывается сцена
piano (в проекте заранее заготовлена сцена, ключевыми объектами
которой являются клавиши, расположенные на сцене в
"Пианино/Клавиши").
Клавиши пронумерованы в соответствии с полутонами, начиная с ноты
"до" и заканчивается нотой "фа" следующей октавы, т.е. "до", "до
диез", "ре", "ре диез", "ми", "фа" и т.д.
Клавиши расположены с начала октавы в той же последовательности, что и на реальном пианино.
Весь проект умещается в один скрипт. Полный листинг содержит пояснения:
using System.Collections;using System.Collections.Generic;using UnityEngine;using System;[RequireComponent(typeof(AudioSource))] // необходимо для того, чтобы скрипт требовал установленный аудиосорсpublic class Piano : MonoBehaviour {public KeyCode Key; // энумератор для выбора клавиши клавиатуры, на которую реагирует скриптAudioSource src; // Аудиосорс, приват-переменная void Start () {src = GetComponent<AudioSource>(); // получаем аудиосорс src.pitch = Mathf.Pow(1.059462f, float.Parse(name) - 1f); // высота звука равна 1.059462f в степени (имя_клавиши - 1).} void Update () { // Для уменьшения отклика стоит использовать FixedUpdateif (Input.GetKeyDown(Key)) { // если нажали клавишу.playNote(); // играем } if (Input.GetKeyUp(Key)) { // если отпустили клавишу.stopNote(); // не играем }} private void OnMouseEnter() { // если мышь над коллайдером клавиши playNote(); // играем} private void OnMouseExit() { // если мышь вышла из коллайдера клавиши stopNote(); // не играем} private void playNote() { // играемtransform.localRotation = Quaternion.Euler(-3, 0, 0); // ставим локальный угол поворота на -3 градуса по Хsrc.Play(); // Включаем звук с начала} private void stopNote(){ // не играемtransform.localRotation = Quaternion.Euler(0, 0, 0); // ставим локальный угол поворота на 0 градусов по всем осям src.Stop(); // Останавливаем звук }}
Особое внимание стоит уделить строке:
src.pitch = Mathf.Pow(1.059462f, float.Parse(name) - 1f);//высота звука равна 1.059462f в степени (имя_клавиши - 1).
Число1.059462высчитано математически и является простой заменой логарифмической функции, делящей одну октаву на 12 полутонов. Таким образом, каждый последующий полутон в 1.059462 раза выше предыдущего по частоте, что при количестве 12 полутонов даёт умножение частоты на 2 с ошибкой в 0.00003 Гц на октаву. С учётом того, что динамический диапазон нашего пианино не превышает полторы октавы, звук практически не искажается.
Тем не менее, звуки пианино плохо ложатся в микс, при отпускании клавиши отсутствует затухание, потому было принято решение немного "размазать" всё реверберацией с небольшой задержкой и эмуляцией большой комнаты, которая добавит "хвостов" затухания резко прерывающимся звукам.
Создана новая группа аудиомикшера, на мастер-канал которой установлена реверберация со следующими параметрами.
А всем аудиосорсам в качестве output установлен мастер-канал аудиомикшера.
Каждой клавише пианино необходимо вручную выставить необходимую клавишу клавиатуры. Так как мы имеем дело с энумератором, необходимо выбрать из представленных вариантов. Клавиши установлены в следующем порядке:
Далее, немного оформляем сцену и добавляем следующие эффекты:
-
SSAO - подчеркнёт тени между клавишами, добавит глубины картинке.
-
Bloom - высветлит светлые участки ещё сильнее, сделает картинку более приятной на глаз, интенсивность нужно выбрать довольно низкую.
-
Антиалиасинг, чтобы убрать пикселизацию.
-
Винетка, чтобы затенить края, выделив основной объект.
Можно добавить SSR, для легкого отражения на вертикальных плоскостях, что немного улучшит картинку.
Готово!