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