Comments
Description
Transcript
ADX2LE_WS_130124(21.9MB)
ADX2 LE ワークショップ GGJ2013向け 2013-01-24 田中孝 1 このワークショップについて • ADX2 LEをGGJで導入する紹介になります。 • 後半のアラカルトでADX2の機能を紹介します。 資料に先に目を通しておいてください。 2 レジュメ • おいしいところ/落とし穴 • ADX2 LEダウンロード/インストール(紹介のみ) • ツール紹介 • Unityプラグイン紹介 • 基本ワークフロー紹介 • 自由課題(アラカルト) 3 ADX2 LEおいしいところ 4 何がおいしいのか? • 圧縮波形でサイズ小さく起動も速く • BGMループが楽 • 効果音が多くなっても管理が楽 • エフェクトで手軽に豪華に • 他にも便利機能いろいろ 5 落とし穴 • Unity Webプレーヤで動かない →バウンス(波形出力)でWeb版、 本気はPCまたはMac版として • Windowsのツールしかない →MacのUnityでランタイムライブラリは動く →Parallelsで問題ない Macの人は仮想環境があると便利 6 ADX2 LEをダウンロード ※本ワークショップでは既にインストール済なので紹介だけ 7 ADX2 LEのダウンロード GGJ会場WEBサイト CRI GGJ特設サイト GGJ特設サイトのリンク先から ダウンロード 8 ADX2 LEのインストール • zipファイルを展開し、展開したcriフォルダを C:/ADX2LE_Workshop/に置いてください。 (windowsの場合パス名に日本語が含まれていると正しく動作しない場合があります。) • Macの場合は、Unityのプラグインだけ使用しますので好きなところに展開して 下さい。 9 ツールを紹介 10 ツール紹介 • • • CRI Atom Craft は、波形を登録し音を管理する。 音リクエスト(プログラムからのコール)をキューと呼ぶ 複数キューをパッキングしたものをキューシートとよび、 キューシートをACB出力する。 波形エディタ CRI Atom Craft 元波形 キューシート ACB 11 ACBとは何か? • CRI Atom Cuesheet Binary Atomキューシートバイナリ • 圧縮された波形(1/4 1/12)と 設定(音の鳴らし方)をパッキングしたファイル • これをメモリに読み込んで再生する 12 ツールを起動 13 起動 • CRI Atom Craft アイコンをダブルク リックで起動。 ※本ワークショップではデスクトップにショートカットがあります 14 Undoできます • ツール操作のUndo 15 プロジェクトを作成し波形を登録 16 プロジェクト作成 17 プロジェクト名をつける 18 プロジェクトをとりあえず保存 19 登録する波形をダウンロード ※本ワークショップでは既にダウンロード済なので紹介だけ 20 デモプロジェクトのあるサイトへアクセス 21 フリー波形素材をダウンロード 22 任意のフォルダに展開 ※本ワークショップではデスクトップにショートカットがあります そこからアクセスして下さい。 23 参考:他に素材を手に入れたい場合 SoundIcons http://www.brainstorm-inc.jp/ 24 波形を登録して、ACBビルド (単純に圧縮のみ) 25 波形をキューシートへドロップ なお、Windows7などセキュリティレベルの関係で デスクトップからのD&Dがうまくいかない場合は適宜変更して下さい。 26 キューシートを選択し ビルドダイアログを開く ② ① 27 チェックを確認し、ビルド 28 ACB出力した音を確認 (圧縮音声の品質確認) 29 初回再生時に警告がでたら • セキュリティ関連のダイアログが出た時は「ブロックを解除する」 を選択してください。 プレビューでアプリケーション間の通信処理を行うため、 ブロックを解除する必要があります。 30 キューをプレビュー(再生) F5キーで再生、F6キーで停止 31 圧縮率を変えてみる 32 効果音作成の基本 • 爆発音 • レーザー音 • サイレン音 33 爆発音を作る • • ノイズにトラックオートメーションで ボリュームの変化を表現 ボイスビヘイビアでボイス停止(ボリューム0時) と設定する。 34 レーザー音を作る • sqにトラックオートメーションでピッチの変化を表現 • 右クリックで イベントの追加でシー ケンスエンドを追加 35 サイレン音を作る • TranceにAISACオートモジュレーションでピッチの周期的変化 ① ③ ④ ② • AISAC:キューやトラックに対して条件による音の変化を設定できる 36 キューをバウンス(波形出力)してみる 37 キューをバウンス(波形出力) 自動で再生され 記録開始されます。 F6で音を停止して バウンスを停止します 38 バウンスしたファイルの確認 出力先が開き bounceフォルダ内に キュー名でwavが作成されます。 39 バウンスしたファイルは リネームすると良い 同じ名前のファイルで内容が異なるものがあると 混乱しがちなので、なるべく名前を変更しておき ましょう。 40 波形エディタを登録しておくと便利 キューをバウンス直後にすぐ編集 バウンスを停止してエ ディタを開きます 41 Audacity フリー波形編集ソフト モノラル化、 レート変更、 トリミングなど 42 ツールはとりあえずここまで 43 Unityプラグイン紹介 44 Unityプラグインとは何か? • ランタイムライブラリ(実行時にゲームに 組み込まれて動作するプログラム) • エディタ拡張(Unityエディタ上で動作) • 最小限のスクリプトが含まれています。 45 Unityプロジェクトの準備 46 Unityプロジェクトの作成 • Unityを起動し、空のプロジェクトを作成 デスクトップに ショートカットが あります。 47 レイアウトは2 by 3で 48 シーン作成 • とりあえず保存 名前はtestで。 49 • はじめにUnityプロジェクトに CRIWARE Unity Pluginをインス トールする 50 • Unityプラグインのパッケージは C:/ADX2LE_Workshop/cri/unity/ pluginにあります。 51 パッケージのインポート 52 Assetsフォルダの確認 • 3つフォルダがインストールされます。 53 Unityプロジェクトの準備 • メニューにCRIが追加されます。 初回出てこないときはメニューのどこかを クリックするとでてきます。 54 ADX2で作ったACBファイルを UnityのAssetsへ書き込む 55 CRIメニューから Open CRI Atom Window ... を選択 56 CRI Atom Windowを使って UnityのAssetsに書き込む ① ACB出力先のAssets フォルダを指定 実行 ② 57 実行後のCRI Atom Window 更新されない場合は、一度デスクトップを表示した後に再表示する 58 StreamingAssetsフォルダが作成される ACB 他にもACFファイル(NewProject.acf)と CriAtomProjInfo_Unity.csが追加されている。 59 ACFとは何か? • CRI Atom Config File Atomコンフィグファイル • ACBに含まれない、再生をするために必要な 情報が書き込まれたファイル (DSPエフェクト設定、カテゴリなどの全体設定情報) 60 CriAtomProjInfo_Unity.csとは何か? • Unityエディタ用のC#スクリプト • ADX2で作成した音をUnityが認識するた めの情報。 61 手動でLE側のAssetsフォルダを UnityのAssetsへ書き込む 参考情報 62 CRI Atom Craftツールに戻り ACBをエクスプローラで開く キューシートを右クリック 63 プロジェクト直下の Public/inGamePreview/Assets を UnityのAssetsへ上書きコピー Assetsのある余白のところへドロップ コピーしてペーストでも可 64 すべて上書きをする Macの場合、置き換えになってしまう場合があるので、 Windows側で行うと間違いない 65 Unityのシーン上で音を確認 とりあえずUnity上で音を再生する 66 Initializerを追加 ADX2の初期化処理を行うためのオブジェクトを シーンに追加します。 67 CRIメニューから Create CRIWARE Library Initializer ... を選択 68 CriWareLibraryInitializerが作られる ランタイムライブラリの設定で 発音数、インゲームプレビュー設定、 サーバー周期(FPS)など設定できます。 69 CriAtomSourceを追加 ADX2の音を鳴らすためのオブジェクトを シーンに追加します。 70 CriAtomSourceの追加 ④ 2つオブジェク トが追加される Atom Windowを開き 余白をクリックして ① 選択を解除し ② orchehitを選択 ③ Create GameObject を押す 71 Play On Startをチェック ① ② orchehit(CriAtomSource)の Play On Startをチェック 72 Unityのシーンを再生すると 音が鳴る 73 さらに ボタンを押すと音が鳴るようにする SoundManagerを使う 74 スクリプトを追加して音をならす /samplecode/SoundManager.cs UnityのAssetsに ① SoundManager.csをドロップして追加 ③ ② Assetsの SoundManager(C#)を GameObjectへドロップ Unityで 空のゲームオブジェクトを作る 75 Unityのシーンを再生し ボタンを押すと任意の音が鳴らせます 76 基本的なワークフロー 77 波形を用意、 CRI Atom Craftでキューにして 音を調整、アレンジし ACBをビルドし、UnityのAssetsへ上書き 波形エディタ CRI Atom Craft Unity 元波形 キューシート CriAtomSource ACB スクリプト ACB 最低1つ ACB分割したい場合 複数持てる 最低1つ 個別コントロールしたい場合は複数持てる 1つで複数音鳴らせます 音を調整、アレンジ 78 音の調整とアレンジ 79 ボリューム変更、ピッチ変更 タイムラインでタイミング変更 いろいろできます 80 知ってると得する情報 81 アラカルト スクリプトサンプル 解説 オリジナル音作りたい (ツール紹介でやった内容) 手軽ににぎやかに おすすめ おすすめ ※本ワークショップでは 時間の都合で2つ紹介 SoundManager AISAC基本 ブロック再生基本 効果音作成基本 ランダム基本 コンボシーケンシャル エフェクトの基本 音数制限の基本 REACTの基本 インゲームで調整 82 SoundManager • スクリプトで鳴らす方法 • CriAtomSource管理 • キュー名取得 • 再生 83 サウンドマネージャとは? using UnityEngine; using System.Collections; using System.Collections.Generic; // 配列用 public class SoundManager : MonoBehaviour { } サウンドを管理するゲーム独自のクラスで、 再生や停止、リソース管理などを行う。 ゲームに応じたギミックを埋め込む目的で用意。 サウンドマネージャを作っておくと 後で拡張したり、デバッグしやすくなるので便利です。 84 SoundManagerよりも先に、 CriWareInitializerが動作するように UnityのオブジェクトでAwake()内でCriの関数を呼び出す場合 など Unityのオブジェクトの初期化順番をコントロールする ExecutionOrderを変更しておくと良いです。 85 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 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 DSPバス設定関連 � � � � void Start () {� � ��// DSPバス設定名を指定 � CriAtomEx.AttachDspBusSetting("DspBusSetting_0");� � CriAtom.SetBusAnalyzer(true); // レベルメータを有効化 } � DSPエフェクトを使用する場合に ツールで作成したDspBusSetting_0をセットしておきます。 BusAnalyzerは振幅レベルの測定用です。 これを有効にすると、インゲームプレビュー時にレベルがツー ル側に通知されます。 88 ラップの工夫 �������// キューを再生する関数サンプル � public void PlaybackCue(int index) � { � � atomSourceSe.Play(index); � } ラップ方法も様々な方法がありますが、 この例では単純にラップしただけ、(AtomSourceを隠す) 呼び出し側の引数によって鳴る音が変化します。 � � � � � // ゲームオーバー時の再生関数 public void PlayGameOver() { � atomSourceSe.Play(4); } この例では、ゲームオーバーのイベントに対して、何をするか をこちらで決める事ができます。 合わせて他の音止めたりといった拡張がこちらで可能です。 89 再生状態の取得 � � � � � � � public void ResumeBGM() { �//�再生中かどうかの取得 � CriAtomSource.Status status = atomSourceBgm.status; if ((status == CriAtomSource.Status.Stop) || ����(status == CriAtomSource.Status.PlayEnd)) { � � PlayBGM(); //止まっていた時に再生 � } } 再生状態を取得して、 止まっていたら再生するという例です。 インゲーム等で音が停止された場合に、BGMを復帰する用に Update()内で呼び続ける事で復帰します。 90 ポーズ、レジューム � � � � � � � � public void Pause() { � atomSourceBgm.Pause(true); } public void Resume() { � atomSourceBgm.Pause(false); } ゲームのポーズ時などで、 atomSourceで再生中の音をポーズします。 91 簡易ビューワー � 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 AISAC基本 • 距離減衰カーブ • ヘリコプターの回転数変化音 • エンジン音的なもの 93 AISACとは何か? • Advanced Interactive Sound and Active Controller キューやトラックに対して条件による音の変化を設定できる コントロールタイプ:AISAC動作の仕方 •オフ(手動)… プログラムの関数SetAisac(コントロールID、コントロール値);から トラックオートメーション、3Dポジションの距離減衰やパン角度から •オートモジュレーション(自動)… 再生トリガ同期モジュレーション、 LFOとして、REACTトリガキー同期などで自動化(アニメーション) •ランダム(半自動) … 完全ランダム、またはプログラムから中心値指定 プログラムやタイムライン、再生状態等から操作する目的で、 音色変化を任意の値で抽象化します。 直接パラメータ弄らせないことで、デザインの幅が広がります。 94 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 ブロック再生基本 • インタラクティブミュージックとは? • ブロックのループ設定 • ブロックの分割設定 • 遷移する時のみ再生するトラック • 遷移初回時のみ再生するトラック 96 ブロック再生キューにする • キューの右クリックからブロックの作成を選択する 97 ブロック再生とは何か? • ブロックに分けて連続再生させる仕組み ① ② ③ ブロックのループ回数を-1にすると無限ループ。 ブロック分割数を指定すると、途中で切り替わるポイントが増える。 遷移タイプを「指定分割で」にする。 ※「CRI ブロック再生」で検索すると、Youtube動画があります。 98 ブロック再生をプログラムから指定する � � � � � � � � � � � � � � � � � � � � � � � 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 ランダムの基本 • ピッチ • トラック • 再生確率 100 ピッチのランダムとは何か? • ピッチが再生リクエストのたびに変化する。 スライダにくぼみがあるものは縦にドラッグすると緑の幅が指定 できる。この範囲の中からランダムに設定されて再生される。 ① ② プロパティリストから直接値を入力もできます。 101 トラックのランダムとは何か? • ランダムに音が変わる 0 1 2 0 1 2 1 2 2 キューのシンセタイプをランダムに 0 1 2 1 2 1 キューのシンセタイプをランダムノーリピート 0 1 2 0 1 2 キューのシンセタイプをシーケンシャルに にすると、同じ番号が連続しない すると、順番に切り替わる 102 再生確率とは何か? • 音が鳴ったり、鳴らなかったりする 100%で確実に再生されるが、 50%だと 2回に1回しか鳴らない。 103 コンボシーケンシャル おすすめ • 連続ヒット音について • コンボ間隔設定 • コンボ戻り設定 104 コンボシーケンシャルとは何か? • ① 連続ヒット音 ② 0 1 2 トラックで段々オケもピッ チが上がるように設定 ③ キューのシンセタイプをコンボシーケンシャルに コンボ間隔 … コンボの決まる間隔 コンボ戻り … 最後までいった後どのトラックに戻るか 0 1 2 2 2 0 500msec未満の時のみ次のトラックが再生される。 500msec以上再生間隔が空くと0にリセットされる。 500msec以上 105 エフェクトの基本 • リバーブ • エコーの追加 • バスの仕組み 106 エフェクトとは何か? • DSPバスエフェクトで音を豪華に ① ② バスにエフェクトを追加し、 センドでバス0に戻すようにする。 トラックのバスセンドを上げる と エコーがかかる。 ③ 107 音数制限の基本 • キューリミット • カテゴリによるリミット • ボイスリミットとの関係 108 音数制限とは何か? • 適切な発音数制御をする3つの方法 キュー … その音そのものの発音数 カテゴリ … おおまかな発音数 ボイス … より低レベルでリアルタイムのリソース管理を目的とする キュー カテゴリ ボイス キュー単位で発音数制御 カテゴリで発音数制御。 キュー単位。 ボイスリソース単位 リリース有効 ① リリース有効 リリース無効。(即時 で解放) ② 109 REACTの基本 おすすめ • ダッキング効果について • カテゴリ間の音量作用 • 自動レベル管理 110 REACTとは何か? • • REACT = 反応する カテゴリの発音状態による他のカテゴリ音の変化の自動化 声(Serif)が鳴ったら BGMを下げる。 といった事を設定する。 どれくらいの時間かけて(200msec) どのくらいの値に(0.2) どれくらい時間かけて戻る (1000msec) ・音量制御を自動化します。 ・変化パラメータにAISACを指定する事で、他のパラメータもコントロールできます。(ピッチとか) 111 カテゴリはこんな感じで 112 REACTの確認 BGM再生 声を再生 113 インゲームでさらに調整 114 CriWareLibraryInitializerのUses In Game Previewに チェックを入れる。 115 Unityエディタを実行状態にすると インゲーム用のポート(2002)が開きます。 デバッグ用の備考 IP ポートの確認方法 WinXP: netstat -an Mac: lsof -i -P 116 Unityエディタを実行状態にして、 CRI Atom Craftで【F10キー】でインゲーム接続します。 117 Macの場合は、ツール/プロパティから リモートターゲットIPアドレスをMacのIPにすること で、Unityエディタに接続できます。 118 エラー対応 119 よくあるエラー例① ACFよりACBが先にロードされて問題 →だいたいExecution Orderの設定で直る ※ACFはCriWareInitializerで設定される。 120 CRIWARE Error Handlerを追加すると 何かトラブルがあった時、 Consoleでエラーメッセージが確認できます 121 よくあるエラー例② 音が鳴らない場合や、Nullアクセスが発生する場合 ExecutionOrderが正しく反映していない場合があるようです。 CRI Atom ウィンドウを一度閉じてから 再設定すると直ったりします。 CRI Atom ウィンドウを閉 じる 122 Atom Windowの閉じ方 ACBの差し替え時や シーンを実行時にエラーが起った場合など 開いたままでもし問題が起る場合は閉じておいて下さい。 タブ化している場合はClose Tab ウィンドウ化している場合は Closeボタン 123 エラーは他にもいろいろ起きます バグの可能性もあります ゲームジャム期間中で 何か分からない事や 困った事があれば twitterで@tatmos宛につぶやいて下さい。 多いものから 対処法をまとめたページとか用意するかも… 124 ADX2 LEをよろしくお願いします。 ADX2ユーザー助け合い所 @facebook http://www.facebook.com/groups/adx2userj/ 125