Contenu connexe Similaire à ADX2LE GGJ13向けワークショップ (20) Plus de Takashi Tanaka (10) ADX2LE GGJ13向けワークショップ1. ADX2 LE ワークショップ
GGJ2013向け
2013-01-25 田中孝
この資料は1/22 24に行われたワークショップの資料を元にしています。
1
6. 落とし穴
• Unity Webプレーヤで動かない
→バウンス(波形出力)でWeb版、
本気はPCまたはMac版として
• Windowsのツールしかない
→MacのUnityでランタイムライブラリは動く
→Parallelsで問題ない
Macの人は仮想環境があると便利
6
11. ツール紹介
• CRI Atom Craft は、波形を登録し音を管理する。
• 音リクエスト(プログラムからのコール)をキューと呼ぶ
• 複数キューをパッキングしたものをキューシートとよび、
キューシートをACB出力する。
波形エディタ CRI Atom Craft
元波形 キューシート
ACB
11
12. ACBとは何か?
• CRI Atom Cuesheet Binary
Atomキューシートバイナリ
• 圧縮された波形(1/4 1/12)と
設定(音の鳴らし方)をパッキングしたファイル
• これをメモリに読み込んで再生する
12
14. 起動
• CRI Atom Craft アイコンをダブルク
リックで起動。
※本ワークショップではデスクトップにショートカットがあります
14
26. 波形をキューシートへドロップ
なお、Windows7などセキュリティレベルの関係で
デスクトップからのD&Dがうまくいかない場合は適宜変更して下さい。
26
30. 初回再生時に警告がでたら
• セキュリティ関連のダイアログが出た時は「ブロックを解除する」
を選択してください。
プレビューでアプリケーション間の通信処理を行うため、
ブロックを解除する必要があります。
30
34. 爆発音を作る
• ノイズにトラックオートメーションで
ボリュームの変化を表現
• ボイスビヘイビアでボイス停止(ボリューム0時)
と設定する。
34
35. レーザー音を作る
• sqにトラックオートメーションでピッチの変化を表現
• 右クリックで
イベントの追加でシー
ケンスエンドを追加
35
36. サイレン音を作る
• TranceにAISACオートモジュレーションでピッチの周期的変化
①
③ ④
②
• AISAC:キューやトラックに対して条件による音の変化を設定できる
36
40. バウンスしたファイルは
リネームすると良い
同じ名前のファイルで内容が異なるものがあると
混乱しがちなので、なるべく名前を変更しておき
ましょう。
40
60. ACFとは何か?
• CRI Atom Config File
Atomコンフィグファイル
• ACBに含まれない、再生をするために必要な
情報が書き込まれたファイル
(DSPエフェクト設定、カテゴリなどの全体設定情報)
60
64. プロジェクト直下の
Public/inGamePreview/Assets
を
UnityのAssetsへ上書きコピー
Assetsのある余白のところへドロップ
コピーしてペーストでも可
64
71. CriAtomSourceの追加
④
2つオブジェク
トが追加される
Atom Windowを開き
①余白をクリックして
選択を解除し
② orchehitを選択
③ Create GameObject
を押す
71
75. スクリプトを追加して音をならす
/samplecode/SoundManager.cs
UnityのAssetsに
① SoundManager.csをドロップして追加
Assetsの
③ SoundManager(C#)を
GameObjectへドロップ
② Unityで
空のゲームオブジェクトを作る
75
78. 波形を用意、
CRI Atom Craftでキューにして
音を調整、アレンジし
ACBをビルドし、UnityのAssetsへ上書き
波形エディタ CRI Atom Craft Unity
元波形 キューシート CriAtomSource
ACB
ACB スクリプト
最低1つ
最低1つ
ACB分割したい場合
個別コントロールしたい場合は複数持てる
複数持てる
1つで複数音鳴らせます
音を調整、アレンジ
78
82. ※本ワークショップでは
アラカルト
時間の都合で2つ紹介
スクリプトサンプル
解説
SoundManager
AISAC基本
オリジナル音作りたい
ブロック再生基本
(ツール紹介でやった内容)
効果音作成基本
手軽ににぎやかに ランダム基本
おすすめ コンボシーケンシャル
エフェクトの基本
音数制限の基本
おすすめ REACTの基本
インゲームで調整
82
84. サウンドマネージャとは?
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // 配列用
public class SoundManager : MonoBehaviour {
}
サウンドを管理するゲーム独自のクラスで、
再生や停止、リソース管理などを行う。
ゲームに応じたギミックを埋め込む目的で用意。
サウンドマネージャを作っておくと
後で拡張したり、デバッグしやすくなるので便利です。
84
85. SoundManagerよりも先に、
CriWareInitializerが動作するように
UnityのオブジェクトでAwake()内でCriの関数を呼び出す場合
など
Unityのオブジェクトの初期化順番をコントロールする
ExecutionOrderを変更しておくと良いです。
85
86. CriAtomSource
� private string cueSheetName = "CueSheet_0";��// キューシート名 ����
�������CriAtomSource atomSourceSe;
� CriAtomSource atomSourceBgm;
� void Awake ()
� {
��// CriAtomSourceコンポーネントを追加
� � atomSourceSe = gameObject.AddComponent<CriAtomSource> ();
� � atomSourceSe.cueSheet = cueSheetName;� �
� � // CriAtomSourceコンポーネントを追加
� � atomSourceBgm = gameObject.AddComponent<CriAtomSource> ();
� � atomSourceBgm.cueSheet = cueSheetName;
� }
ここでは、コントロール対象として、おおまかに
SEとBGM用のCriAtomSourceを追加しています。
86
87. ACB情報取得
� private string cueSheetName = "CueSheet_0";��// キューシート名� �
� private List<string> cueNameList = new List<string> (); //キュー名リスト
� void Awake ()
� {
// ACBを取得しキュー情報を得る�
� � CriAtomExAcb acb = CriAtom.GetAcb (cueSheetName);�
� � CriAtomEx.CueInfo[] cueInfoList = acb.GetCueInfoList ();
� � foreach (CriAtomEx.CueInfo cueInfo in cueInfoList) {
� � � cueNameList.Add (cueInfo.name);�
� � }
�������}
デバッグなどでキュー名一覧が欲しい場合はこのように取り出
せます。
名前以外にも様々な情報が取り出せます。
87
88. DSPバス設定関連
� void Start () {� �
��// DSPバス設定名を指定
� � CriAtomEx.AttachDspBusSetting("DspBusSetting_0");� �
� � CriAtom.SetBusAnalyzer(true); // レベルメータを有効化
� }
DSPエフェクトを使用する場合に
ツールで作成したDspBusSetting_0をセットしておきます。
BusAnalyzerは振幅レベルの測定用です。
これを有効にすると、インゲームプレビュー時にレベルがツー
ル側に通知されます。
88
89. ラップの工夫
�������// キューを再生する関数サンプル
� public void PlaybackCue(int index)
� {
� � atomSourceSe.Play(index);
� }
ラップ方法も様々な方法がありますが、
この例では単純にラップしただけ、(AtomSourceを隠す)
呼び出し側の引数によって鳴る音が変化します。
� // ゲームオーバー時の再生関数
� public void PlayGameOver()
� {
� � atomSourceSe.Play(4);
� }
この例では、ゲームオーバーのイベントに対して、何をするか
をこちらで決める事ができます。
合わせて他の音止めたりといった拡張がこちらで可能です。
89
90. 再生状態の取得
�
� public void ResumeBGM()
� {
�//�再生中かどうかの取得
� � CriAtomSource.Status status = atomSourceBgm.status;
if ((status == CriAtomSource.Status.Stop) ||
����(status == CriAtomSource.Status.PlayEnd)) {
� � � PlayBGM(); //止まっていた時に再生
� � }
� }
再生状態を取得して、
止まっていたら再生するという例です。
インゲーム等で音が停止された場合に、BGMを復帰する用に
Update()内で呼び続ける事で復帰します。
90
91. ポーズ、レジューム
� public void Pause()
� {
� � atomSourceBgm.Pause(true);
� }
� public void Resume()
� {
� � atomSourceBgm.Pause(false);
� }
ゲームのポーズ時などで、
atomSourceで再生中の音をポーズします。
91
92. 簡易ビューワー
� private string cueSheetName = "CueSheet_0";
������CriAtomEx.CueInfo[] cueInfoList;�
� void Start ()
� {
� � CriAtomExAcb acb = CriAtom.GetAcb (cueSheetName);�� �
� � cueInfoList = acb.GetCueInfoList ();
� }
������public bool soundDebug = true;
� void OnGUI()
� {
� � if(soundDebug){
� � � foreach (CriAtomEx.CueInfo cueInfo in cueInfoList) {
� � � � if(GUILayout.Button(cueInfo.name)){
� � � � � atomSourceSe.Stop();
� � � � � atomSourceSe.Play(cueInfo.name);� � � �
� � � � }
� � � }
� � }
� }
キューの数だけボタンを生成して音が鳴らせます。
92
94. AISACとは何か?
• Advanced Interactive Sound and Active Controller
キューやトラックに対して条件による音の変化を設定できる
コントロールタイプ:AISAC動作の仕方
•オフ(手動)…
プログラムの関数SetAisac(コントロールID、コントロール値);から
トラックオートメーション、3Dポジションの距離減衰やパン角度から
•オートモジュレーション(自動)… 再生トリガ同期モジュレーション、
LFOとして、REACTトリガキー同期などで自動化(アニメーション)
•ランダム(半自動) … 完全ランダム、またはプログラムから中心値指定
プログラムやタイムライン、再生状態等から操作する目的で、
音色変化を任意の値で抽象化します。
直接パラメータ弄らせないことで、デザインの幅が広がります。
94
95. AISACのスクリプト例
� float lastPlaybackBallTime = 0;
�������// AISACの例
� public void PlaybackBall(int index,float velocity)
� {
� � if(lastPlaybackBallTime+0.25 < Time.timeSinceLevelLoad){
� � � velocity = Mathf.Min(velocity,1.0f);
� � � atomSourceBall.SetAisac(0,velocity);
� � � atomSourceBall.Play(index);
� � � lastPlaybackBallTime = Time.timeSinceLevelLoad;
� � }
� }
AISACを設定しつつ音を鳴らす関数の例です。
atomSource.SetAisac(0,velocity);
AISACコントロールID
AISACコントロール値(0.0 1.0)
95
98. ブロック再生とは何か?
• ブロックに分けて連続再生させる仕組み
①
②
③
ブロックのループ回数を-1にすると無限ループ。
ブロック分割数を指定すると、途中で切り替わるポイントが増える。
遷移タイプを「指定分割で」にする。
※「CRI ブロック再生」で検索すると、Youtube動画があります。
98
99. ブロック再生をプログラムから指定する
� private CriAtomExPlayback playbackBGM;
� CriAtomEx.CueInfo cueInfo;
� public void PlayBGM()
� {
� � bool startFlag = false;
� � CriAtomSource.Status status = atomSourceBgm.status;
� � if ((status == CriAtomSource.Status.Stop) || (status == CriAtomSource.Status.PlayEnd)) {
� � � this.playbackBGM = atomSourceBgm.Play(100);
� � � startFlag = true;
� � }
� �
� � if(startFlag == false){
� � � int cur = this.playbackBGM.GetCurrentBlockIndex();�// 現在のブロックインデックスを得る
� � � CriAtomExAcb acb = CriAtom.GetAcb("PinballMain");
� � � if(acb != null){
� � � � acb.GetCueInfo("BGM",out this.cueInfo);�// キュー情報
� � � � cur++;
� � � � if(this.cueInfo.numBlocks > 0){ //�ブロックがあれば
// ブロックをセットする
� � � � � this.playbackBGM.SetNextBlockIndex(cur % this.cueInfo.numBlocks);
� � � � }
� � � }
� � }
� }
未再生なら再生、再生中ならブロックを次のブロックにすすめる
99
102. トラックのランダムとは何か?
• ランダムに音が変わる
0
1
2
0 1 2 1 2 2 キューのシンセタイプをランダムに
キューのシンセタイプをランダムノーリピート
0 1 2 1 2 1 にすると、同じ番号が連続しない
キューのシンセタイプをシーケンシャルに
0 1 2 0 1 2 すると、順番に切り替わる
102
103. 再生確率とは何か?
• 音が鳴ったり、鳴らなかったりする
100%で確実に再生されるが、
50%だと 2回に1回しか鳴らない。
103
104. コンボシーケンシャル
おすすめ
• 連続ヒット音について
• コンボ間隔設定
• コンボ戻り設定
104
105. コンボシーケンシャルとは何か?
• 連続ヒット音 ①
②
0
1
2 ③
トラックで段々オケもピッ キューのシンセタイプをコンボシーケンシャルに
チが上がるように設定 コンボ間隔 … コンボの決まる間隔
コンボ戻り … 最後までいった後どのトラックに戻るか
500msec未満の時のみ次のトラックが再生される。
0 1 2 2 2 0 500msec以上再生間隔が空くと0にリセットされる。
500msec以上
105
107. エフェクトとは何か?
• DSPバスエフェクトで音を豪華に
①
②
バスにエフェクトを追加し、
センドでバス0に戻すようにする。
トラックのバスセンドを上げる
と
エコーがかかる。
③
107
109. 音数制限とは何か?
• 適切な発音数制御をする3つの方法
キュー … その音そのものの発音数
カテゴリ … おおまかな発音数
ボイス … より低レベルでリアルタイムのリソース管理を目的とする
キュー キュー単位で発音数制御 リリース有効
カテゴリ
カテゴリで発音数制御。
キュー単位。
リリース有効 ①
リリース無効。(即時
ボイス ボイスリソース単位
で解放)
②
109
110. REACTの基本
おすすめ
• ダッキング効果について
• カテゴリ間の音量作用
• 自動レベル管理
110
111. REACTとは何か?
• REACT = 反応する
• カテゴリの発音状態による他のカテゴリ音の変化の自動化
声(Serif)が鳴ったら
BGMを下げる。
といった事を設定する。
どれくらいの時間かけて(200msec)
どのくらいの値に(0.2)
どれくらい時間かけて戻る
(1000msec)
・音量制御を自動化します。
・変化パラメータにAISACを指定する事で、他のパラメータもコントロールできます。(ピッチとか)
111
122. よくあるエラー例②
音が鳴らない場合や、Nullアクセスが発生する場合
ExecutionOrderが正しく反映していない場合があるようです。
CRI Atom ウィンドウを一度閉じてから
再設定すると直ったりします。
CRI Atom ウィンドウを閉
じる
122
123. Atom Windowの閉じ方
ACBの差し替え時や
シーンを実行時にエラーが起った場合など
開いたままでもし問題が起る場合は閉じておいて下さい。
ウィンドウ化している場合は
タブ化している場合はClose Tab Closeボタン
123
124. エラーは他にもいろいろ起きます
バグの可能性もあります
ゲームジャム期間中で
何か分からない事や
困った事があれば
twitterで@tatmos宛につぶやいて下さい。
多いものから
対処法をまとめたページとか用意するかも…
124