「[ぶん投げRPG] かぶりん!」 でのWwise導入事例

「[ぶん投げ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