[Разработка игр, C#, Unity] Синтезатор на Unity 3D

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
09-Апр-2021 14:31

Учебные материалы для школы программирования. Часть 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 () { // Для уменьшения отклика стоит использовать FixedUpdate
    if (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, для легкого отражения на вертикальных плоскостях, что немного улучшит картинку.

Готово!
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_razrabotka_igr (Разработка игр), #_c#, #_unity, #_unity, #_unity3d, #_unity_uroki (unity уроки), #_unity_tutorial (unity туториал), #_shkola_programmirovanija (школа программирования), #_razrabotka_igr (разработка игр), #_uroki_programmirovanija (уроки программирования), #_dlja_nachinajuschih (для начинающих), #_dlja_chajnikov (для чайников), #_razrabotka_igr (
Разработка игр
)
, #_c#, #_unity
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 25-Ноя 15:44
Часовой пояс: UTC + 5