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

48
1 ププププププププププププ プププププププUnity ププププ CC2 プププ プププププ プププププ ププププ

Upload: igda-japan-sig-audio

Post on 21-Jun-2015

16.625 views

Category:

Documents


4 download

TRANSCRIPT

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

1

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

CC2 開発部 サウンド課 サウンド室 渡邉愉香

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

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 ( 忘れか

け )

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

3

❖目次

1. Unity サウンド概要 for iOS/Android

2. デフォルトで出来ること・出来ないこと

3. サウンドシステムを作ろう

4. Tips

5. 質疑応答

傾向

サウンドデザイナ

寄り

プログラマ寄り

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

4

Unity サウンド概要 for iOS/Android

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

5

スクリプト言語

ビルド環境

❖基本情報

JavaScrip

t

13%

C#

85%Boo

2%

*.ipa *.apkWindows

*.apk

※facebook 「 Unity ユーザー助け合い所」 言語使用率アンケートより

Mac

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

6

サウンドライブラリ

❖基本情報

旧 FMOD Ex Programmer’s API 相当部分のみ

旧 FMOD Designer は使用不可

利用可能な圧縮形式は mp3 のみ

Pro 版の Unity でなくても ( 無償版でも )

エフェクト以外のサウンド機能は全て使用可能

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

7

インポート形式 iOS/Android 形式

❖オーディオデータとして認識される形式

Ogg Vorbis

MP3

WAV

AIFF

MOD

XM

S3M

IT

MP3

WAV

AIFF

MOD

XM

S3M

IT

圧縮オーディオ

無圧縮オーディオ

トラッカーモジュール

ENCODE

ENCODE無圧縮

DECODE

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

8

❖オーディオデータとして認識される形式:補足

トラッカーモジュールとは? 譜面と音源を 1 ファイルにしたもの ( ≒ SMF + 内蔵シンセ )

MOD と総称される MOD 作成ソフトは トラッカー と呼ばれる

Sound Tracker

(.mod)Scream Tracker

(.s3m)

Impulse Tracker

(.it)

Fast Tracker 2

(.xm)

Unity のサポート形式 と トラッカー

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

9

❖エンコード後のデータ

保存場所{UnityProject}\Library\metadata\

判読性のないフォルダ名、ファイル名で格納されている

32 文字 の

ファイル名

2 文字 のフォルダ名

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

10

❖エンコード後のデータ

エンコード後のファイル名1.  波形と同階層にある同名の .meta をテキストエディタで開く

2.   guid の行の 32 文字 がファイル名

3.  保存場所で guid の冒頭 2 文字 のフォルダ名を探す

4.   3. のフォルダの下で guid と同じファイル名 を探す

発見 !!

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

11

mp3 エンコードされたファイルの構造 先頭に Unity のヘッダが付加されただけの mp3

ヘッダを削除すれば Media Player 等で再生可能 ヘッダの削除手順

1. バイナリエディタでファイルを開く2. 拡張子なしファイル名 が格納されている場所を探す3. 2. の近くに mp3 フレームヘッダ (0xFFFB) があるので探す4. 3. より前を削除、拡張子を .mp3 にして保存する

❖エンコード後のデータ

実データ部

拡張子なしファイル名

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

12

❖エンコード後のデータ:補足

.meta ファイル

がない?

?

Editor Settings を確認

Edit -> Project Settings -> Editor

Version Control のMode を Meta Files に設定

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

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

Page 14: SIG-Audio#6 プラグインを書かなくてもここまで出来る!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

波形本体

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

15

デフォルトで出来ること・出来ないこと

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

16

❖デフォルトで出来ること

エフェクト プライオリティ ポーズ ループ ( 部分ループ不可、全ループのみ )

音量 ピッチ LRパン 3D 再生設定

OK

以下は Unity の標準機能として存在する

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

17

AudioListener

AudioClip

AudioSource

Audio*Filter

ReverbZone

エフェクト 全体 単体 パラメータ パラメータ

プライオリティ パラメータ

ポーズ 全体 単体

ループ GaplessLoopingエンコード

ON/OFF

音量 全体 単体

ピッチ パラメータ

LRパン パラメータ

3D 再生 ON/OFF 距離減衰ドップラー

❖デフォルトで出来ること

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

18

❖デフォルトで出来ないこと

1. ループ回数指定

2. フェードアウト

3. ダッキング

4. 同時発音数・再生挙動制御

5. ランダムパラメータ

6. ランダム再生

7. グループ単位のパラメータ制御

8. イントロつきループ BGM

以下は Unity の標準機能としては存在しない

NG

サウンドとして最低限必要な機能

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

19

サウンドシステムを作ろう

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

20

❖はじめに

作るもの 昔ながらのコンシューマ系サウンドシステム の簡易版

データ管理:バンク方式 出力管理:バス方式

必要なもの VBA の知識

ネットで拾える情報の組み合わせレベル Unity プログラムの知識

普通に Unity でスクリプトが書ければ OK iOS/Android の深い知識は不要

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

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

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

22

実際の信号ルーティングは行わない 下記のような一般的なバス機能を仮想実装

エフェクト情報 エフェクトタイプ エフェクト ID

サウンドオブジェクトタイプ動的生成 / 静的生成

カテゴリ Master / BGM / SE / Voice

ピッチ 音量バス名

❖システム概要:バス

Chorus

Static

SE

FX Type

Object Type

Category

Pitch

Volume

UI

0FX ID

Bus Name

※後述

※画像はイメージです

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

23

iOS

❖システム概要:階層

  Android OS

Unity

Application

Sound Manager

 

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

24

Unity

❖システム概要:構成

パラメータシート

パラメータテーブル

c# サウンド

マネージャ

c#

解釈

確認

サウンドテスト

生成

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

25

随時 毎フレーム

❖サウンドマネージャ:処理概要

再生・パラメータテーブル参照・パラメータ設定・同時発音数制御

停止・通常停止

フェード情報更新・フェードパラメータ計算・目標値到達チェック

制御情報更新・音源座標更新・各種パラメータ更新・停止済リソース破棄・ループ制御・ステータス管理・ダッキングトリガチェック

フェードアウト・フェード設定

ループ終了・ループフラグ OFF

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

26

❖デフォルトで出来ないこと

1. ループ回数指定

2. フェードアウト

3. ダッキング

4. 同時発音数・再生挙動制御

5. ランダムパラメータ

6. ランダム再生

7. グループ単位のパラメータ制御

8. イントロつきループ BGM

以下は Unity の標準機能としては存在しない

NG

サウンドとして最低限必要な機能

これらの実装方法を

この吹き出しで示します !

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

27

随時 毎フレーム

❖サウンドマネージャ:制御情報更新

再生・パラメータテーブル参照・パラメータ設定・同時発音数制御

停止・通常停止

フェードアウト・フェード設定

ループ終了・ループフラグ OFF

フェード情報更新・フェードパラメータ計算・目標値到達チェック

制御情報更新・音源座標更新・各種パラメータ更新・停止済リソース破棄・ループ制御・ステータス管理・ダッキングトリガチェック

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

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

: … : : : : : :

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

29

ステータス処理

停止済

❖サウンドマネージャ:制御情報更新

停止中

再生待ち

停止待ち

再生

停止

ワンショッ

ト再生終了

ループ再生終了

再生中音源座標更新

パラメータ更新

バス情報反映

リソース破棄

ダッキング解除チェック

1ループ回数指定

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

30

毎フレーム

制御情報更新・音源座標更新・各種パラメータ更新・停止済リソース破棄・ループ制御・ステータス管理・ダッキングトリガチェック

随時

❖サウンドマネージャ:フェード情報更新

再生・パラメータテーブル参照・パラメータ設定・同時発音数制御

停止・通常停止

フェードアウト・フェード設定

ループ終了・ループフラグ OFF

フェード情報更新・フェードパラメータ計算・目標値到達チェック

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

31

要素の組み合わせで機能が変化

処理ターゲット

値のタイプ

目標値到達時の挙動

サウンド 音量 停止

バス ピッチ 再生継続

パン

❖サウンドマネージャ:フェード情報更新

現在値 += ( ( 目標値 - 開始値 ) / フェード時間 )

基本計算式

・ターゲット   = バス・タイプ     = 音量・目標値到達時  = 再生継続

・ターゲット   = サウンド・タイプ     = 音量・目標値到達時  = 停止

2フェードアウト

3ダッキング

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

32

毎フレーム

制御情報更新・音源座標更新・各種パラメータ更新・停止済リソース破棄・ループ制御・ステータス管理・ダッキングトリガチェック

随時

❖サウンドマネージャ:再生

停止・通常停止

フェードアウト・フェード設定

ループ終了・ループフラグ OFF

フェード情報更新・フェードパラメータ計算・目標値到達チェック

再生・パラメータテーブル参照・パラメータ設定・同時発音数制御

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

33

❖サウンドマネージャ:再生

サウンドオブジェクト AudioSource をアタッチするための GameObject

音源オブジェクトには直接アタッチせず、座標のみを参照 定期的に音源座標をサウンドオブジェクトに反映

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

34

❖サウンドマネージャ:再生

音も破棄されてしまう !

滝 SE の減衰が完了する前に滝オブジェクトが破棄されてしまうことがある

滝の横を走り抜ける

画面外のマップを破棄

©2013 CyberConnect2

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

35

❖サウンドマネージャ:再生

サウンドオブジェクト 動的生成・静的生成の 2種類を用意

通常は再生時に動的に生成レイテンシが重要な SEや BGM などは静的オブジェクトを使用

初期化時に一定数の GameObject を予め作成しておく動的生成だと UI などのタップ SE の反応が良くないため

GameObject の new は結構重い

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

36

クリップ再生

再生制御

❖サウンドマネージャ:再生

パラメータ取得

サウンドオブジェクト選択

再生クリップ選択

  バス情報の反映

制御情報検索

パラメータ計算

バス音量・ピッチ設定

エフェクト設定

後着優先 先着優先 BGM

再生中の最古のものを停止

今回の再生をキャンセル

フェード停止&停止完了待ち

ランダム レイヤ 分割BGM

ランダムに1つのクリップを選択

全クリップ選択

ランダム レイヤ 分割 BGM

全クリップを同一の遅延設定で再生

イントロ部は遅延なし、

ループ部はイントロ部分

遅延設定で再生

4同時発音数・再生挙動制御

5ランダムパラメータ

6ランダム再生

7グループ単位のパラメータ制御

8イントロつきループ BGM

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

37

イントロつきループ BGM の実装 イントロ部分とループ部分に波形を分割 イントロ波形の尺だけ待ってからループ波形を再生

AudioSource.PlayDelayed( イントロ尺 ); で OK

これじゃ継ぎ目が目立っちゃう !

❖サウンドマネージャ:再生

イントロ部分

ループ部分

再生開始

再生開始

delay

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

38

ループに入ってからの余韻まで含んだ状態をイントロとする イントロとループが重なる部分 を設ける

❖サウンドマネージャ:再生

イントロ部分

再生開始

再生開始

ループ部分delay

繋ぎ目を目立たせないための対策 イントロ波形の作り方を一工夫

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

39

❖サウンドマネージャ:再生

mp3 ループ再生時 (GaplessLooping エンコード時 )

再生開始位置を 1,152 サンプル ずらして再生する

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

40

MP3 のデコード処理概要 1,152 サンプル の フレーム 単位で処理

❖サウンドマネージャ:再生

frame frame frame frame

0 1 n-1 n

最後

波形先頭 波形末尾

frameframe frame

をデコードするためにはが必要

n 番目のフレーム

n-1 番目のフレーム

をデコードするためにはが必要

最初のフレーム最後のフレーム

frameframe

ループ再生で頭に戻るとき

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

41

❖サウンドマネージャ:再生

エンコード時 波形先頭にループ処理用の 1 フレーム を付加

再生開始を 1,152 サンプルずらすのは

最初のループ処理用フレームをスキップする ため

ごく短いため、ほとんどのケースでは気にならない が、

波形内容によってはノイズのように聴こえる場合がある。

約 0.026 秒(44.1kHz の場合 )

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

42

毎フレーム

制御情報更新・音源座標更新・各種パラメータ更新・停止済リソース破棄・ループ制御・ステータス管理・ダッキングトリガチェック

随時

❖サウンドマネージャ:停止

フェード情報更新・フェードパラメータ計算・目標値到達チェック

再生・パラメータテーブル参照・パラメータ設定・同時発音数制御

停止・通常停止

フェードアウト・フェード設定

ループ終了・ループフラグ OFF

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

43

❖サウンドマネージャ:停止

3種類の停止系処理即停止 フェード停止 ループ終了

通常の停止処理 フェードアウト後、音量 0 になったら即停止

波形の最後まで再生したら繰り返さず再生を終了

いきなり AudioSource.Stop() を呼ばない停止ノイズが発生することがあるため、段階的に処理する

1. サウンドの音量を 0 にする

2. 音量が反映されてから AudioSource.Stop() を呼ぶ ステータスを「停止準備中」にして更新処理で制御

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

44

❖最後に

プラグインを書かなければ対応できないこと 波形の部分ループ mp3 以外の圧縮フォーマットの使用 オリジナルエフェクトの使用

こういったことに対応したい場合、またはもっと精密な制御が必要な場合はCRI ・ミドルウェア様に御相談すると

幸せになれると思います!

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

45

Tips

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

46

❖Tips

AudioFiler は単一の AudioSource にしか適用できない 複数の AudioSouce を単一の GameObject に付加した場合、

AudioSource に対する AudioFilter の効果が不安定になる

AudioSource

Audio*Filter

AudioSource

GameObject

AudioSource

Audio*Filter

GameObject

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

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 の機能としては存在しない プラグインを書けば実装可能

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

48

御清聴ありがとうございました