SIG-Audio#6 プラグインを書かなくてもここまで出来る!Unityサウンド

22,202 views

Published on

0 Comments
40 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
22,202
On SlideShare
0
From Embeds
0
Number of Embeds
9,263
Actions
Shares
0
Downloads
75
Comments
0
Likes
40
Embeds 0
No embeds

No notes for slide

SIG-Audio#6 プラグインを書かなくてもここまで出来る!Unityサウンド

  1. 1. プラグインを書かなくても ここまで出来る! Unityサウンド CC2 開発部 サウンド課 サウンド室 渡邉愉香 1
  2. 2. ❖自己紹介 a) (+2)HHKB[US](使っている) b) (+0)xyzzy(使っている) c) (+0)VisualStudio(使っている) d) (+1)LogicPro(使っている) e) C#の巻き物 f) C++の巻き物 ----------------------------------------------------------------g) Cの巻き物 |.@......D......................................................| @ h) Perlの巻き物 |...M..........V......X......................!..?.....W.........| i) イェンダーの魔除け |.J....................................M.........J..........*.).| =スペースを押してください= |............. U....................U...........J.......X.......| |....................../......U..G..............................| 名前 :渡邉 愉香 |............P.................D.................../............| |..............U.......?..............G.......................G.| 職業 :サウンドプログラマ |.....................P.....................P......V...!........| |..............................!..................*.............| 基本スキル:サウンドプログラム |..........................)............W............=........%.| ----------------------------------------------------------------BGM・SE制作とか色々 特殊スキル:Unity (使用歴1年半くらい) UnrealEngine3 (忘れかけ) 階: 26 金塊: 2013 体力: 12(94) 強さ: 14(17) 守備: 8 経験:11/7640 2
  3. 3. ❖目次 サウンド デザイナ 寄り Unityサウンド概要 for iOS/Android 2. デフォルトで出来ること・出来ないこと 3. サウンドシステムを作ろう 4. 傾 向 1. Tips プログラマ 5. 寄り 質疑応答 3
  4. 4. Unityサウンド概要 for iOS/Android 4
  5. 5. ❖基本情報 ビルド環境 *.apk *.ipa *.apk Mac Windows スクリプト言語 C# JavaScript 85% 13% Boo 2% ※facebook「Unityユーザー助け合い所」 言語使用率アンケートより 5
  6. 6. ❖基本情報 サウンドライブラリ  旧 FMOD Ex Programmer’s API 相当部分のみ  旧 FMOD Designer は使用不可  利用可能な圧縮形式は mp3 のみ  Pro版のUnityでなくても(無償版でも) エフェクト以外のサウンド機能は全て使用可能 6
  7. 7. ❖オーディオデータとして認識される形式 インポート形式 無圧縮 オーディオ 圧縮 オーディオ iOS/Android形式 WAV WAV AIFF AIFF Ogg Vorbis MP3 ENCODE MP3 無圧縮 DECODE ENCODE MOD トラッカー モジュール MOD XM XM S3M S3M IT IT 7
  8. 8. ❖オーディオデータとして認識される形式:補足 トラッカーモジュールとは?  譜面と音源を1ファイルにしたもの ( ≒ SMF + 内蔵シンセ )  MOD と総称される  MOD作成ソフトは トラッカー と呼ばれる Sound Tracker Fast Tracker 2 Scream Tracker Impulse Tracker (.mod) (.xm) (.s3m) (.it) Unityのサポート形式 と トラッカー 8
  9. 9. ❖エンコード後のデータ 保存場所 {UnityProject}Librarymetadata 2文字 の フォルダ名 32文字 の ファイル名 判読性のないフォルダ名、ファイル名で格納されている 9
  10. 10. ❖エンコード後のデータ エンコード後のファイル名 1. 波形と同階層にある同名の .meta をテキストエディタで開く 2. guidの行の32文字 がファイル名 3. 保存場所で guid の冒頭2文字 のフォルダ名を探す 4. 3. のフォルダの下で guid と同じファイル名 を探す 発見!! 10
  11. 11. ❖エンコード後のデータ mp3エンコードされたファイルの構造  先頭にUnityのヘッダが付加されただけのmp3  ヘッダを削除すればMedia Player等で再生可能  ヘッダの削除手順 2. バイナリエディタでファイルを開く 拡張子なしファイル名 が格納されている場所を探す 3. 2. の近くに mp3フレームヘッダ (0xFFFB) があるので探す 4. 3. より前を削除、拡張子を .mp3 にして保存する 1. 実データ部 11
  12. 12. ❖エンコード後のデータ:補足 .metaファイル がない? Editor Settings を確認 Edit -> Project Settings -> Editor ? Version Control の Mode を Meta Files に設定 12
  13. 13. ❖エンコード設定 metaファイル経由でインポート設定を変更可能 Unity Audio Format metaファイル Native (WAV) Inspector format Native Compressed 3D Sound -1 0 Force to mono Load type Compressed in memory Inspector stream Decompress on load Compressed in memory Gapless looping Compression (kbps) 1 Stream from disc Hardware decoding 0 2 128 quality (Compression (kbps) – 56) / 200 ※実際のエンコード処理を行うのはUnity fileFormatVersion: 2 guid: abcdefghijklmn … AudioImporter: serializedVersion: 4 format: 0 quality: .360000014 stream: 1 3D: 0 forceToMono: 0 useHardware: 0 loopable: 0 userData: 13
  14. 14. ❖Unityのサウンド要素 ReverbZone AudioListener リバーブ空間 波形以外の再生情報 人間の耳に相当 Camera AudioSource GameObject AudioClip 波形本体 Audio*Filter Audio*Filter エフェクト エフェクト (1) Reverb Filter (4) Distortion Filter (2) Chorus Filter (5) Low Pass Filter (3) Echo Filter (6) High Pass Filter 14
  15. 15. デフォルトで出来ること・出来ないこと 15
  16. 16. ❖デフォルトで出来ること 以下はUnityの標準機能として存在する  エフェクト  プライオリティ  ポーズ OK  ループ (部分ループ不可、全ループのみ)  音量  ピッチ  LRパン  3D再生設定 16
  17. 17. ❖デフォルトで出来ること Audio Listener エフェクト Audio Clip プライオリティ ポーズ Reverb Zone パラメータ パラメータ パラメータ 全体 単体 GaplessLooping エンコード ループ 音量 Audio *Filter 単体 全体 Audio Source 全体 ON/OFF 単体 ピッチ パラメータ LRパン パラメータ 3D再生 ON/OFF 距離減衰 ドップラー 17
  18. 18. ❖デフォルトで出来ないこと 以下はUnityの標準機能としては存在しない 1. 2. フェードアウト 3. ダッキング 4. 同時発音数・再生挙動制御 5. ランダムパラメータ 6. ランダム再生 7. グループ単位のパラメータ制御 8. NG ループ回数指定 イントロつきループBGM サウンドとして最低限必要な機能 18
  19. 19. サウンドシステムを作ろう 19
  20. 20. ❖はじめに 作るもの  昔ながらのコンシューマ系サウンドシステム の簡易版  データ管理:バンク方式  出力管理:バス方式 必要なもの  VBAの知識  ネットで拾える情報の組み合わせレベル  Unityプログラムの知識  普通にUnityでスクリプトが書ければOK  iOS/Androidの深い知識は不要 20
  21. 21. ❖システム概要:イメージ こういうものを作ります Enemy Data SE0 Stage Data SE1 SE Bus[1] SE2 Voice0 Voice0 Bus[2] Common Data BGM0 … Voice1 …… Bus[0] Bus[n-1] Voice1 BGM1 BGM Sub Bus Bus[n] Master Bus 21
  22. 22. ❖システム概要:バス 実際の信号ルーティングは行わない  下記のような一般的なバス機能を仮想実装  エフェクト情報   Chorus 0 Static エフェクトID サウンドオブジェクトタイプ   FX ID Object Type エフェクトタイプ  FX Type Category ※後述 Pitch 動的生成 / 静的生成 Volume カテゴリ  SE Master / BGM / SE / Voice  ピッチ  音量  バス名 ※画像はイメージです Bus Name UI 22
  23. 23. ❖システム概要:階層 Application Sound Manager Unity Android OS iOS 23
  24. 24. ❖システム概要:構成 生 成 パラメータ シート c# c# 解 釈 パラメータ テーブル サウンド マネージャ 確 認 サウンド テスト Unity 24
  25. 25. ❖サウンドマネージャ:処理概要 随時 毎フレーム 再生 フェード情報更新 ・パラメータテーブル参照 ・パラメータ設定 ・同時発音数制御 停止 ・通常停止 フェードアウト ・フェード設定 ループ終了 ・ループフラグOFF ・フェードパラメータ計算 ・目標値到達チェック 制御情報更新 ・音源座標更新 ・各種パラメータ更新 ・停止済リソース破棄 ・ループ制御 ・ステータス管理 ・ダッキングトリガチェック 25
  26. 26. ❖デフォルトで出来ないこと 以下はUnityの標準機能としては存在しない 1. ループ回数指定 これらの 実装方法を 2. フェードアウト 3. ダッキング NG 4. 同時発音数・再生挙動制御 5. ランダムパラメータ この吹き出しで 示します! 6. ランダム再生 7. グループ単位のパラメータ制御 8. イントロつきループBGM サウンドとして最低限必要な機能 26
  27. 27. ❖サウンドマネージャ:制御情報更新 随時 毎フレーム 再生 フェード情報更新 ・パラメータテーブル参照 ・パラメータ設定 ・同時発音数制御 停止 ・通常停止 フェードアウト ・フェード設定 ループ終了 ・ループフラグOFF ・フェードパラメータ計算 ・目標値到達チェック 制御情報更新 ・音源座標更新 ・各種パラメータ更新 ・停止済リソース破棄 ・ループ制御 ・ステータス管理 ・ダッキングトリガチェック 27
  28. 28. ❖サウンドマネージャ:制御情報更新 全サウンドの状態を常に把握  鳴らしっぱなしにしない  全てのサウンドの再生状況を ステータス によって管理 サウンド ラベル 再生中の波形 … ステータス 音源 ループ 回数 再生 音量 再生 ピッチ 再生 パン SE01 se_ene_atk01 … PRESTOP Enemy01 0 0.8 1.1 0.0 BGM00 bgm_btl00 … PLAYING - 5 0.6 1.0 0.0 … : : : : : : : 28
  29. 29. ❖サウンドマネージャ:制御情報更新 処理 ステータス 再生 再生待ち 音源座標更新 再生中 ル ー プ 再 生 終 了 1 ループ回数 指定 パラメータ更新 バス情報反映 停止 ダッキング解除 チェック リソース破棄 停止待ち 停止中 ワ ン シ ョ ッ ト 再 生 終 了 停止済 29
  30. 30. ❖サウンドマネージャ:フェード情報更新 随時 毎フレーム 再生 フェード情報更新 ・パラメータテーブル参照 ・パラメータ設定 ・同時発音数制御 停止 ・通常停止 フェードアウト ・フェード設定 ループ終了 ・ループフラグOFF ・フェードパラメータ計算 ・目標値到達チェック 制御情報更新 ・音源座標更新 ・各種パラメータ更新 ・停止済リソース破棄 ・ループ制御 ・ステータス管理 ・ダッキングトリガチェック 30
  31. 31. ❖サウンドマネージャ:フェード情報更新 基本計算式 現在値 += ( ( 目標値 - 開始値 ) / フェード時間 ) 要素の組み合わせで機能が変化 処理 ターゲット 値の タイプ 目標値到達時 の挙動 サウンド 音量 ピッチ 再生継続 フェードアウト ・ターゲット = バス ・タイプ = 音量 ・目標値到達時 = 再生継続 ダッキング 停止 バス パン 2 3 ・ターゲット = サウンド ・タイプ = 音量 ・目標値到達時 = 停止 31
  32. 32. ❖サウンドマネージャ:再生 随時 毎フレーム 再生 フェード情報更新 ・パラメータテーブル参照 ・パラメータ設定 ・同時発音数制御 停止 ・通常停止 フェードアウト ・フェード設定 ループ終了 ・ループフラグOFF ・フェードパラメータ計算 ・目標値到達チェック 制御情報更新 ・音源座標更新 ・各種パラメータ更新 ・停止済リソース破棄 ・ループ制御 ・ステータス管理 ・ダッキングトリガチェック 32
  33. 33. ❖サウンドマネージャ:再生 サウンドオブジェクト  AudioSource をアタッチするための GameObject  音源オブジェクトには直接アタッチせず、座標のみを参照  定期的に音源座標をサウンドオブジェクトに反映 33
  34. 34. ❖サウンドマネージャ:再生 滝の横を走り抜ける 滝SEの減衰が完了する前に 滝オブジェクトが 破棄されてしまうことがある 画面外のマップを破棄 音も破棄されてしまう! ©2013 CyberConnect2 34
  35. 35. ❖サウンドマネージャ:再生 サウンドオブジェクト  動的生成・静的生成の2種類を用意  通常は再生時に動的に生成  レイテンシが重要なSEやBGMなどは静的オブジェクトを使用   初期化時に一定数の GameObject を予め作成しておく 動的生成だとUIなどのタップSEの反応が良くないため  GameObject の new は結構重い 35
  36. 36. ❖サウンドマネージャ:再生 パラメータ取得 制御情報検索 再生制御 4 6 ランダム 再生 同時発音数・ 再生挙動制御 後着優先 先着優先 今回の再生を キャンセル ランダム ランダムに 1つのクリップを選択 BGM 再生中の 最古のものを停止 再生クリップ選択 フェード停止 & 停止完了待ち レイヤ 全クリップ選択 バス情報の反映 パラメータ計算 5 ランダム パラメータ クリップ再生 ランダム レイヤ 全クリップを 同一の遅延設定で再生 7 8 グループ単位の パラメータ制御 バス音量・ピッチ設定 エフェクト設定 サウンドオブジェクト選 択 分割BGM イントロつき ループBGM 分割BGM イントロ部は遅延なし、 ループ部はイントロ部分の 遅延設定で再生 36
  37. 37. ❖サウンドマネージャ:再生 イントロつきループBGMの実装  イントロ部分とループ部分に波形を分割  イントロ波形の尺だけ待ってからループ波形を再生  AudioSource.PlayDelayed(イントロ尺); でOK これじゃ継ぎ目が 目立っちゃう! 再生開始 イントロ部分 delay ループ部分 再生開始 37
  38. 38. ❖サウンドマネージャ:再生 繋ぎ目を目立たせないための対策  イントロ波形の作り方を一工夫  ループに入ってからの余韻まで含んだ状態をイントロとする  イントロとループが重なる部分 を設ける 再生開始 イントロ部分 delay ループ部分 再生開始 38
  39. 39. ❖サウンドマネージャ:再生 mp3ループ再生時 (GaplessLoopingエンコード時) は 再生開始位置を 1,152サンプル ずらして再生する 39
  40. 40. ❖サウンドマネージャ:再生 MP3のデコード処理概要 1,152サンプル の フレーム 単位で処理 0 1 frame frame n-1 … frame frame 最後 n … 波形先頭 n 番目のフレーム n-1 番目のフレーム frame 波形末尾 をデコードするためには が必要 ループ再生で頭に戻るとき 最初のフレーム 最後のフレーム をデコードするためには が必要 40
  41. 41. ❖サウンドマネージャ:再生 エンコード時 波形先頭にループ処理用の1フレーム を付加 約 0.026 秒 (44.1kHzの場合) ごく短いため、ほとんどのケースでは気にならない が、 波形内容によってはノイズのように聴こえる場合がある。 再生開始を1,152サンプルずらすのは 最初のループ処理用フレームをスキップする ため 41
  42. 42. ❖サウンドマネージャ:停止 随時 毎フレーム 再生 フェード情報更新 ・パラメータテーブル参照 ・パラメータ設定 ・同時発音数制御 停止 ・通常停止 フェードアウト ・フェード設定 ループ終了 ・ループフラグOFF ・フェードパラメータ計算 ・目標値到達チェック 制御情報更新 ・音源座標更新 ・各種パラメータ更新 ・停止済リソース破棄 ・ループ制御 ・ステータス管理 ・ダッキングトリガチェック 42
  43. 43. ❖サウンドマネージャ:停止 3種類の停止系処理 即停止 フェード停止 ループ終了 通常の停止処理 フェードアウト後、 音量0になったら即停止 波形の最後まで再生したら 繰り返さず再生を終了 いきなり AudioSource.Stop() を呼ばない 停止ノイズが発生することがあるため、段階的に処理する 1. サウンドの音量を 0 にする 2. 音量が反映されてから AudioSource.Stop() を呼ぶ  ステータスを「停止準備中」にして更新処理で制御 43
  44. 44. ❖最後に プラグインを書かなければ対応できないこと  波形の部分ループ  mp3以外の圧縮フォーマットの使用  オリジナルエフェクトの使用 こういったことに対応したい場合、 またはもっと精密な制御が必要な場合は CRI・ミドルウェア様に御相談すると 幸せになれると思います! 44
  45. 45. Tips 45
  46. 46. ❖Tips AudioFiler は単一の AudioSource にしか適用できない  複数の AudioSouce を単一の GameObject に付加した場合、 AudioSource に対する AudioFilter の効果が不安定になる GameObject GameObject AudioSource AudioSource AudioSource Audio*Filter … Audio*Filter 46
  47. 47. ❖Tips Android端末でオンメモリ再生時に音飛びが発生する  Unity 4.1 以前  GCでオーディオスレッドが止められていたため、 GCが原因の場合は 4.2 へのアップデートで改善される可能性あり  Unity 4.2 以降  「特定端末における既知の不具合」の可能性あり  REGZA Phone, Galaxy Nexus など  頻度は 5~15分 に 1回 程度 (体感的にはそれほど高くない) Android端末でのBGMのオーバーライド  iOSの「Override iPod Music」のAndroid版は?  Unityの機能としては存在しない  プラグインを書けば実装可能 47
  48. 48. 御清聴ありがとうございました 48

×