COLLEGE」が開催されました。第14回となる今回のテーマは「ゲーム開発におけるサウンド実装の勘所」。株式会社ヘッドハイ代表取締役の一條貴彰氏が、モバイルゲーム開発におけるサウンドデータの扱い方について解説します。ADX2」を用いたサウンド実装について紹介します。ADX2を使おう一條貴彰氏(以下、一條):ようやく本題です。ADX2」というオーディオ専門のツールを使って、前半で挙げた問題を一挙に解決しようというお話になります。ADX2は、ゲーム向けの総合サウンドミドルウェアになります。音にまつわる演出が組み込まれたライブラリ&ツールで、ゲームに最適化されている音声圧縮形式を内蔵しています。ご覧のように、スマートフォンのゲームではかなり採用されております。冒頭にご紹介した青い「CRIWARE」のロゴをご覧になったこともあるかもしれません。MACHINA』というロボットゲームでも採用されています。ADX2エディションには、ざっくり法人用と個人用があります。法人用は有償版で、モバイルゲームの場合は月額でプロフェッショナルとのサポート契約をするようなスタイルです。LE」という無償版で、個人や小規模な開発者さんが無料で使えて、ゲームを発売してもとくにお金はかからないものです。LEは2月に大型アップデートをして、オーサリングツールがmacOSで動くようになったり、Unity・UE4の各機能がアップデートされています。ADX2については様々なセミナーで紹介していますので、特徴的な機能は既にご存知かもしれません。「ADX2はここが強いよ」とよく言われているものとして、まずは冒頭から申し上げている「Androidで音が遅れる状況」を改善します。音声データを暗号化したり、イントロ付きループ再生が簡単に実行できます。そのあたりは単に「機能」なので、SDKを導入して設定すれば使えるようになるわけですね。最近Qiitaに導入記事を書いたんですけれども、チュートリアルをご覧いただいて、UnityならUnityの環境にADX2を入れてこのあたりの設定をするだけてこれら機能の恩恵を受けることができます。実はADX2の魅力はそういった性能面だけではなく、ツールを使ったワークフローの改善にこそあります。今回はそこをご紹介していきたいと思います。ボイスデータの管理について。Craft」というツールを使って管理が可能になっています。Craftのセットになっています。Unity標準とADX2導入時のワークフローの違いまずは、Unityの標準とADX2導入時のワークフローの違いをお話しします。Unityの標準サウンド機能では、WAVファイルをUnityエディタにポーンと入れるとAudioClipになるので、それに対してスクリプトでガリガリ演出を書いていきます。AudioClipはビルドしたときに実行ファイルに含まれていたり、AssetBundleに入れてサーバから配信したりします。Craft」という専用のツールに食わせます。この中で、音に対する演出を音単位でツールの中で組んでいくんですね。それをパックファイルとしてビルドして、Unityエディタの中にデータを入れます。Craftというツールの中で、音に対する設定付けを先に行ってしまいます。「このBGMは、フェードインして、フェードアウトして、最大で2本までしか鳴らないです」のように、音を鳴らす単位の中に、「どのように鳴らされるか?」という設定を埋め込みます。Unityのスクリプトでは「鳴らすだけ」でこうした演出が実行できる仕組みです。デモでは、少しデモをやりましょう。Craft」を使って流していました。いま、鳴らせるかな?(音楽が流れる)鳴りますね。基本的に、このツールの中で「この音はどのように再生されるか」というパラメータをどんどん埋め込んでいきます。Unityあるいはゲームエンジン側では、その音......ツールの中では1つの音の単位を「キュー」と呼んでいますけれども、そのキューを読み込む、あるいはキューを指定して再生する処理だけ書いてあればOKです。これは開発中のものなので、あまり写真を撮ってほしくないのですが(笑)、現在執筆中の書籍のために作っているデモになります。本に収録されるときにはイラストレーターさんに描いてもらうかわいい女の子のイラストに差し変わりますので、ご期待ください。これはどういうデモかというと、縦持ちのソーシャルゲームを意識して作っているものです。アドベンチャーパートを模したシーンが入ります。いまBGMが鳴っていて、「ユニティちゃん」のセリフデータが再生されます。(キャラクターボイスが流れる)このように、セリフが流れる時はBGMの音量が下がって、終わったら自然に元に戻る。この設定をダッキングと言ったりしますが、ADX2では、ツールの上で「このBGMが鳴っているときに、このボイスデータが流れたら、BGMの音量を下げる」という設定をデータに埋め込んでいます。Unityのスクリプト側では、「このボイスを鳴らします」「このBGMを鳴らします」という処理だけになっています。このシーン終わるとバトル画面のようなものになります。BGMがクロスフェードして鳴っています。(スライドを指して)下の絵のところは、ソーシャルゲームにおけるカード絵だと思ってください。(効果音が流れる)タップするとかけ声が再生されて攻撃を出して、それから敵が倒されます。ここからシーンが洞窟になりますが、いまの状態だとボイスに残響音が入っているんですね。ボスがいて、倒すと、「やっ!」とか「やぁーっ!」みたいな声がランダムで再生されているところにも注目してください。いまお見せしたデモのデータが、ツールではどういう設定をしているかお話をします。Craft」には、素材のボイスデータとBGMデータはWAVファイルで入っています。それに対して、Unityの中で鳴らす音は、先ほどご紹介したように、キューという単位を使って作っていきます。Craftでのデータの中身は(スライドを指して)こうなっています。0」と書いてある部分が「キュー」と呼ばれる1つ音の単位になっていまして、テスト再生すると。0」は3種類の音からランダムに選ばれて再生されている様子がわかると思います。0というキューの中には3つの音が含まれていて、その音の中からランダムに鳴らすという設定を埋め込んでいるんですね。おもしろいところでいうと、バトルのシーンで足音の効果音が流れていたと思いますが、この足音は......。(足音が流れる)奥に進んでいくシーンで足音が鳴っているんですけれども、実はこの音の元データは非常に短い素材です。(元データの音が流れる)この「トン」というごく短い音だけです。これを使って、ツールの中で連続して聞こえる足音になるように配置をしていきます。最初の2つのトントンという足音、次のトントンという足音は、それぞれピッチ、音の高さがランダムで変わるように設定されています。(エフェクト付きの足音が流れる)アプリには非常に短い音声データしか含まれないのですが、ツールの中で再生されるバリエーションを作ることができます。「キュー」で再生設定を創り込んで、呼び出すといったワークフローになっているのが、ADX2です。ほかにもいろいろ演出を組み込んでいるのですが、説明した「ダッキング」ももちろん組み込まれています。BGMが再生されて、そこにボイスが入ります。(BGM再生中に、ボイスが流れる)この部分は、同じようにツールの中で「BGMが再生されているときにボイスが鳴ると、BGMのボリュームを落とす」といった設定がされているわけです。色が見づらいかもしれないんですけれども、ダッキングは「変化カテゴリ」でに指定されたっキューの音量が変化します。「トリガーカテゴリー」というのは変化のトリガーになる音で、この音が鳴らされたときにBGMが落ちます、といった設定になっています。Craftというツールを使うと楽になります。ボイスに「どういう場面で使うのか」みたいなコメントを付けておいたり、ツール内のコメントだけではなく、Unityのエディタから取れるデータとして文字情報を埋め込んでおいたりできます。Craftの中でセリフとBGMが重なったときの聞こえ方が確認できます。たくさんのボイスデータがある中で、プログラマさん以外の方にもボリュームの調整をやっていただけるということです。ほかにも、スマートフォン実機上でゲームを実行させつつ、先ほどツールでお見せしたようなボリュームやピッチの設定を変えていくモードもあったりします。サウンド演出の設定に関しては、音量調整のほかにも、ピッチを変更させるピッチシフトや、今日は時間がないので飛ばしますけれども、多重再生を防止する機能もあります。キャラクターがしゃべっているときに、そのキャラのバトルのかけ声が同時に入ってくると不自然なので、「このキャラクターのボイスはプログラム側からコールされても、最大1音しか鳴りません」といった制限もツール側で管理できます。申し上げていますけれども、Unityのスクリプト側は「キュー」を再生するだけというのが基本です。スクリプト側からパラメータを渡すこともあるんですけれども、こういった短いスクリプトで多彩なサウンド表現ができるようになるというところが大事になります。このあたりも、後ほど資料をご覧いただくかたちになりますね。良いゲームオーディオを作るためにまとめです。ゲームオーディオは、考えることがたくさんあります。冒頭で申し上げたように、全てを往路グラマーさんが自作できなくもないけれども、いろいろなシュチュエーションが重なってきたときに管理するのが大変になります。ADX2の無償試用を触ってみるといいかなと思います。Craftが得意とするところです。ボリューム調整の仕事もプランナーさん分担できるようになりますし、なにより「ボイス管理のエクセルのリストから脱出できる」というのが大きなポイントです。話の濃度がバラバラになってしまいましたけれども、今回の講演は以上になります。ご清聴、ありがとうございました。(会場拍手)司会者:ありがとうございました。質疑応答になりますが、質問があればこの場でご質問いただき、もしなければ、お話しし切れなかったところの続きをお願いできればと思っています。ご質問のある方はいらっしゃいますでしょうか?空間音響系の機能について質問者1:空間音響系の機能は、何か出ていますか?一條:空間音響というと、どんな使用シチュエーションですか?質問者1:HoloLensで考えていて、その空間音響系のものは、音声データとして読み込めるんですかね?一條:HoloLensからどういうデータが取得できるかにもよるんですけれども、一応擬似的なものとして、空間のシチュエーションに合わせたリバーブエフェクトがありますね。質問者1:そういう感じなんですね。フロアの素材によってはできる......。一條:仮に部屋の広さなどが取れるようなデバイスであれば、それに近似したエフェクトをかける機能があるので、それを使うとより臨場感が増すと思います。先ほど簡単にご紹介したデモの中で、森のシーンと洞窟のシーンで、洞窟のシーンでは残響(の効果)がかかりますというお話をしました。仕組みはUnityのAudioMixerと同じで、ADX2では「DSPバス」という処理部分を使っていて洞窟に入っているときにリバーブエフェクトをかけています。(残響付きの音声が流れる)森のときは、とくにエフェクトはかかりません。(残響なしの音声が流れる)ADX2には「I3DL2リバーブ」というリバーブエフェクトがあって空間のシチュエーションに合わせた設定ができるんですね。プリセットを使った設定と、手動での設定ができます。「このくらいの広さの部屋ですよ」、あるいは「劇場みたいな部屋です」といったことを適用するエフェクトがあるので、それを使うのがHoloLensにはいいのかなと思います。質問者1:それを楽にできる方法とかは......。一條:たぶん、ツール側としては、プリセットから近いものを選ぶのが一番早いのかなと思います。質問者1:逆に、音色やそのサウンド自身も含めて、生成系の何か......エンジンなりなんなりといったところが知りたいです。一條:ADX2自体には、オーディオの素材を生成する機能はないです。WAVファイルがあって、そのWAVファイルが加工された状態で、先ほどお見せしたような鳴らし方の組み合わせができるものになります。私が知っている中では、Tsugi社という、新潟にある会社が販売している「GameSynth」という製品があります。これは、効果音を生成してWAVファイルに出せるんですけれども、ADX2と組み合わせて音を再生するエンジンを、プロシージャルアプローチで作るようなシステムがあるらしいです。質問者1:要するに、これは事前生成でしょうか?一條:いえ、事前ではないです。質問者1:それはすごいな。一條:ライブラリファイルみたいなものを端末側に持っていて、それをもとにパラメータ情報があり......。質問者1:生成したものをさわるということですね。そのパラメータも、ランダム性を持たせたり......僕はGameSynthをまだ半分ぐらいしか触ってないので、まだお話はできません。これはこれで、別に紹介の機会を設けたいですね。このツール自体も、先ほどのADX2とある程度連携できたと思います。このような手段がありますね。CPUへの負荷について質問者2:エディタで行った加工みたいものを、ランダムで再現してくれるというイメージでよいでしょうか?一條:はい、そうなります。加工というか、パラメータの埋め込みですね。普通にオーディオを出したときと比べて......たぶん、設定ファイルみたいなものが中まで入るんだと思うんですけど、そこは別にほぼ影響ないというか、誤差に近いデータ容量の大きさでしかないですかね?一條:そうですね。今日は説明を省いたんですけれども、ADX2の場合はOggやmp3ではなく、自社開発のHCAというコーデックを使って、内部で音声圧縮されます。圧縮率は、Oggやmp3とだいたい一緒です。違うのは、ゲーム用に開発されたコーデックなので、デコードしたときの負荷が急激に上がるといった部分は避けています。それから、メモリの使用量を小さくする設計になっていますね。これは人間の感応的な部分なんですけれども、HCAコーデックだと、女性の声がとくに強いという話があります。Oggやmp3と比べて、女の子の高音域が削れないようになっているという話を、なにかのインタビューで見たことがあります。そのあたりの音質を聴き比べながらやると、Oggなどよりも小さいデータで済む可能性があります。いうところがあるから、CPU(の負荷)もそこまでではない?一條:そうですね。CPU負荷に関するところでお話しします。HCAコーデックには、HCA-MXコーデックという特殊モードのコーデックがあります。20個同時に音が鳴っているときでも、処理が20倍になりません。音が鳴っているときに、音のデコード負荷を下げるような特殊な再生方法があります。通常、音は圧縮データがあって、それをデコードしてミックスするというかたちなんですけれども、デコードする前にミックスして展開するみたいに、処理の順序を工夫することによって再生負荷をかなり抑えているのがHCA-MXです。モバイルだと、音の処理の重さみたいなところが問題になりますか?質問者2:僕は、Unityでゲーム開発をやっているわけではないので、あんまり知見はありません。一條:とくに、非力なスマートフォン端末だと、音が20~30個も鳴りますみたいな場合は、そのあたりのシステムを使います。あとは、ゲームハードウェアですね。いまご紹介したシステムが使われているタイトルもあります。質問者2:ありがとうございます。司会者:ありがとうございます。ご質問や情報交換等をしたい方は、このあとのミートアップのお時間でもお話しできるかと思いので、そのときによろしくお願いします。拍手をお送りください。一條:ありがとうございます。カレッジ)は「渋谷でちょっといい人呼んでゲーム勉強会」をテーマに、エンジニアのための活動しています。