「[ぶん投げRPG] かぶりん!」 でのWwise導入事例 2014.6.25 © KLab Inc. All Rights Reserved. 自己紹介 杉山直樹 磯田泰寛 (Sugiyama Naoki) (Isoda Yasuhiro) ! ! ! ! Engineer Lead Sound Designer かぶりん!プロジェクトでは かぶりん!プロジェクトでは かぶりん! かぶりん! ! ! クライアント開発を担当 SEの作成とWwise実装を担当 2* 3* 本日の概要 Wwise導入で目指した到着点 導入前に難儀していた点 『かぶりん!』のサウンド概要 Unity×Wwise 実現できた演出 今後にむけて 5* Wwise導入で 目指した到着点 6* Wwise導入で目指した到着点 そんなことはともかく、 ぶっちゃけWwiseを使いたかった UIがとてもかっこいいから ! ! ! 7 * UIがとてもかっこいい 8 * UIがとてもかっこいい 9 * © KLab Inc. All Rights Reserved. UIがとてもかっこいい 10 * UIがとてもかっこいい 当然、それだけでは 導入が決定するはずもなく。 11 * Wwise導入で目指した到着点 これまでのような モバイル向けゲーム開発からの脱却 ・クオリティ面の改革 ! コンシューマタイトルと同レベルの サウンド演出を実現する ! 12 * Wwise導入で目指した到着点 これまでのような モバイル向けゲーム開発からの脱却 ・フローの効率化 ! サウンドチームがイメージした演出を よりスムーズにゲームに反映させる 13 * Wwise導入で目指した到着点 ! なぜWwiseなのか? ・細かい部分まで調整ができる ・開発予算に合わせたライセンス形態があった ・使用経験があった 14 * Wwise導入前に 難儀していた点 15 * Wwise導入前に難儀していた点 開発側で実装が容易な機能 ・再生、停止 ・ファイル単体のループ再生 ・音量 ・左右Panの設定 Wwise導入前に難儀していた点 開発側で実装が難しい機能 ・ループ回数指定 ・同時発音数・再生挙動制御 ・イントロ付きループBGM ・フェードイン/アウト ・ダッキング ・ランダム再生処理 など Wwise導入前に難儀していた点 「BGM停止時にフェードアウトして下さい。だいた い3秒かけて音量0にして下さい。」 「このページに遷移する時はBGMフェードインでお 願いします。1秒くらいでふわっと。」 ! 「特定SE鳴らす時はBGMの音量50%下げて下さ い。あ、このジングルとかは100%で。あっ、鳴り 終わったら0.5秒で元に戻して。」 18 * Wwise導入前に難儀していた点 ゲームエンジン側のサウンド機能が 初期状態では制限が多い もしWwise無しのまま進んでいたら… 新規機能 詰む… 開発で 19 * でも…! ゲームエンジンの拡張は必要なし! サウンドチームが欲しがる機能は・・・ Wwiseですべて解決!! Wwise導入で 助かった! 20 * Wwise導入前に難儀していた点 複雑な演出を組もうとするほど 開発とサウンド間での伝達コストが増える もしWwise無しのまま進んでいたら… リテイクが ヤバイ… 21 * でも…! サウンドチームが考えた演出を Wwise上に自ら実装することによって、 伝達コストを削減することだけでなく、 齟齬から生まれる悲しみを防ぐことができた! Wwise導入で 助かった!! 22 * Wwise導入前に難儀していた点 オーディオファイル管理の煩雑さ もしWwise無しのまま進んでいたら… 差分が ひどい… 23 * でも…! 大量のオーディオ差分を用意したり、 詳細情報まで書いたリストを共有したり、、 そんな時代は、もう終わった! Wwise導入で 助かった!!! 24 * 『かぶりん!』の サウンド概要 25 * 『かぶりん!』のサウンド概要 ♪♪ゲームエンジン:Unity 但しUnity側のサウンド機能は未使用 ♪♪ BGM: 最大2ストリーム ! ! ♪♪ SE:229点(Event数) Audioは400点程度 当社比4倍 26 * 『かぶりん!』のサウンド概要 ♪♪ Wwise内蔵エフェクトの使用: Reverb(Sends・Insert) Gain Delay PitchShift など ♪♪ メモリ: サウンド全合計で約18.2MB ♪♪ 音声コーデック:Vorbis圧縮 80~128kbpsで圧縮 (Conversion Settings Quality 6∼8) 27 * Unity×Wwise 実現できた演出 28 * Unity×Wwise 実現できた演出 基本フロー ■サウンドチーム ① WwiseでEventを発行する ② Bank(Generated SoundBanks)を開発にわたす ■開発チーム ① 受け取ったBankとEventリストをUnityに追加する ② SoundManagerにEventを追加する ③ 指定のタイミングでEventを再生する 29 * Unity×Wwise 実現できた演出 基本的には、 SoundManagerというシングルトンのクラスでWwiseの実装 をラップしていて、ゲームシーン内のスクリプトからは ! // ! クエストBGMの再生! ! SoundManager.Instance.PlayQuestBattleBgm(); ! という感じで呼び出してます。 30 * Unity×Wwise 実現できた演出 /// <summary>! /// クエストBGMを再生する! /// </summary>! public void PlayQuestBattleBgm()! {! bankIdBgm = AkSoundEngine.PostEvent(AK.EVENTS.BGM_9301_PLAY,! gameObject);! } Unity×Wwise 実現できた演出 /// <summary>! /// クエストBGMを再生する! /// </summary>! public void PlayQuestBattleBgm()! この部分がサウンド側で作成したイベント名! ↓ {! bankIdBgm = AkSoundEngine.PostEvent(AK.EVENTS.BGM_9301_PLAY,! gameObject);! } 32 * Unity×Wwise 実現できた演出 ! このように、 サウンド側で発行したイベント名を ソースに記述するだけ。 ! 33 * Unity×Wwise 実現できた演出 インタラクティブな音響変化 【ステージ切替に伴う環境音の変化】 BGMのみ BGM+環境音A Ambient SE:Switch Container 34 * BGM+環境音B Unity×Wwise 実現できた演出 ! ちなみに、 サウンド側で発行したイベント名を ソースに記述するだけ。 ! 36 * Unity×Wwise 実現できた演出 RTPC (Real Time Parameter Control) Unity×Wwise 実現できた演出 インタラクティブな音響変化 【タイムアップ&ゲームオーバー時のBGM変化】 Tempo.Mid Tempo.High Tempo.Ultra 通常時 残り時間10秒 残り時間5秒 BGM pitch=50 BGM pitch=75 BGM pitch=100 ! ! BGM Pitch:Game Parameter RTPC 38 * ※Game over = 25 ■Wwise側のRTPC設定■ Unity×Wwise (タイムアップへのBGM変化部分) インタラクティブな音響変化 【タイムアップ&ゲームオーバー時のBGM変化】 40 * ■Wwise側のRTPC設定■ Unity×Wwise (タイムアップへのBGM変化部分) インタラクティブな音響変化 【タイムアップ&ゲームオーバー時のBGM変化】 Tempo.Ultra Tempo.High Tempo.Mid 41 * ■開発側の実装部分■ Unity×Wwise (タイムアップへのBGM変化部分) 開発側では Timekeeper(時間管理クラス)から、ゲーム内時 間に応じてBGMのピッチ量をWwise側に転送して いる。 実際のスクリプトを見ると・・ 42 * ■開発側の実装部分■ Unity×Wwise (タイムアップへのBGM変化部分) /// <summary>! /// BGMのRTPC (Real Time Parameter Controls) 値を調整する /// </summary> こん な感 void AdjustBgmRtpcValue()! じ { if (this.RemainTime <= 5.0f) { // 5秒前 SoundManager.Instance.SetQuestBattleRtpcValue(Tempo.Ultra); } else if (this.RemainTime <= 10.0f) { // 10秒前 SoundManager.Instance.SetQuestBattleRtpcValue(Tempo.High); } else { SoundManager.Instance.SetQuestBattleRtpcValue(Tempo.Mid); } } 43 * ■開発側の実装部分■ Unity×Wwise (タイムアップへのBGM変化部分) /// <summary>! /// BGMのRTPC (Real Time Parameter Controls) 値を調整する /// </summary> void AdjustBgmRtpcValue()! { ピッチ量! if (this.RemainTime <= 5.0f) { // 5秒前 ↓ SoundManager.Instance.SetQuestBattleRtpcValue(Tempo.Ultra); } else if (this.RemainTime <= 10.0f) { // 10秒前 SoundManager.Instance.SetQuestBattleRtpcValue(Tempo.High); } else { SoundManager.Instance.SetQuestBattleRtpcValue(Tempo.Mid); } } 44 * ■開発側の実装部分■ Unity×Wwise (タイムアップへのBGM変化部分) /// <summary>! /// クエストバトルBGMのRTPC (Real Time Parameter Controls) 値を調整する! /// </summary> public void SetQuestBattleRtpcValue(Tempo tempo)! {! float value = GetTempoByEnum(tempo);! じ 感 な ん こ AkSoundEngine.SetRTPCValue(AK.GAME_PARAMETERS.BGM9301_PITCH,! value,! gameObject);! } ■Wwise側のRTPC設定■ Unity×Wwise (フィーバーShot SEの変化部分) インタラクティブな音響変化 【フィーバーモードでのSEとピッチの切り替え】 「フィーバーモード」 かぶりんの発射音が特殊なものに変化。 音階もモード終了まで断続的に上昇。 ①フィーバーモード用のショットSEに変化 SE Gain :Set Game Parameter (RTPC) ! ②ショットSEのピッチ上昇 SE Pitch:Set Game Parameter (RTPC) 46 * Unity×Wwise ■開発側の実装部分■ (フィーバーShotSE変化部分) 開発側では何をやっているの? ① フィーバー開始SEイベントを再生 ② 通常時と同じショットSEイベントを再生 ③ フィーバー終了イベントを再生 以上 Unity×Wwise ■開発側の実装部分■ (フィーバーShotSE変化部分) /// <summary>! /// フィーバー開始音を再生する! /// </summary>! public void PlayFeverOnSe()! {! AkSoundEngine.PostEvent(AK.EVENTS.SE_FEVER_ON, gameObject);! } Unity×Wwise ■開発側の実装部分■ (フィーバーShotSE変化部分) /// <summary>! /// 通常ショット音を再生する! /// </summary>! public void PlayShotSe()! {! AkSoundEngine.PostEvent(AK.EVENTS.SE_3034_SHOT, gameObject);! } Unity×Wwise ■開発側の実装部分■ (フィーバーShotSE変化部分) /// <summary>! /// フィーバー終了イベント(フィーバー時間終了時、ゲームオーバー時、クリア時など)! /// </summary>! public void StopFever()! {! AkSoundEngine.PostEvent(AK.EVENTS.MUTE_FEVERSTAR, gameObject);! } ■開発側の実装部分■ Unity×Wwise (フィーバーShotSE変化部分) ! どうやってギミックを再現しているの? 実はフィーバー開始時に再生しているイベントにヒミツが AK.EVENTS.SE_FEVER_ON このイベントを再生すると Wwise側では2つの処理が行われます。 ①フィーバー開始音を再生 ②ミュートだったフィーバー用ショットSEがONに! つまりフィーバー用のSEは最初から入っていた…! 52 * ■Wwise側のRTPC設定■ Unity×Wwise (フィーバーShot SEの変化部分) インタラクティブな音響変化 【フィーバーモードでのSEとピッチの切り替え】 「フィーバーモード」 ! かぶりんの発射音が特殊なものに変化。 1つのイベント内に 音階もモード終了まで断続的に上昇。 複数のActionsをセット ①フィーバーモード用のショットSEに変化 SE Gain :Set Game Parameter (RTPC) ! ②ショット音のピッチ上昇 SE Pitch:Set Game Parameter (RTPC) 53 * Unity×Wwise ! ! ■開発側の実装部分■ (フィーバーShotSE変化部分) 開発側では何をやっているの? ① フィーバー開始SEイベントを再生 →同時に、ショットSE内でミュートされていたSEがON (=フィーバー用のショットSEに切り替わる) ! ② 通常時と同じショットSEイベントを再生 ! ! ③ フィーバー終了イベントを再生 →同時に、ショットSEが上昇するギミックも行われる →すべての演出を無に返す 以上 Unity×Wwise 実現できた演出 インタラクティブな音響変化 【バトル中のPause/Resume】 ■ 一時停止ボタンを押すと BGM以外の全てのSEがPauseされる ! Pause All Except 55 Unity×Wwise 実現できた演出 インタラクティブな音響変化 【 Duckingその他RTPCによる演出】 ■チャージショット 一定時間でのピッチ上昇 ! ■ Ducking 特定SE発生時にBGMの音量を下げる 56 * Unity×Wwise 実現できた演出 まとめ Unity×Wwise 実現できた演出 開発側で実装が難しかった機能を振り返っ てみると・・・ ・ループ回数指定 ・同時発音数・再生挙動制御 ・イントロ付きループBGM ・フェードイン/アウト ・ダッキング ・ランダム再生処理 など Unity×Wwise 実現できた演出 開発側で実装が難しかった機能を振り返っ てみると・・・ OK・ループ回数指定 OK・同時発音数・再生挙動制御 OK・イントロ付きループBGM OK ・フェードイン/アウト OK OK・ダッキング OK・ランダム再生処理 など Unity×Wwise 実現できた演出 ただし、問題点も・・・。 ! 開発も知らないうちに複雑な音響変化が実装されてしまい、 ! どんな演出が盛り込まれているのか、 しっかりと共有・管理しておかないと… ! デバッグの際にバグ報告が挙がってしまう例も…!! 今後に向けて 61 * 今後に向けて その1 ! インタラクティブ・ミュージックの導入 ! ゲームの各シーンにおけるBGMを プレイヤーの操作やシーンの移り変わりに伴って 変化させる演出方法 ! ! 62 * 今後に向けて その2 ! BankのAssetBundle化対応(容量削減) データの受け渡し手順の見直し(最適化) ! ! 63 * ご清聴ありがとうございました! 64 * https://www.audiokinetic.com/ http://www.kaburin.com/ 65 * Wwise導入事例 2014.6.25 © KLab Inc. A Reserv
© Copyright 2024 ExpyDoc