ゲーム開発
Unity
UnrealEngine
C++
Blender
Houdini
ゲーム数学
ゲームAI
グラフィックス
サウンド
アニメーション
GBDK
制作日記
IT関連
ツール開発
フロントエンド関連
サーバサイド関連
WordPress関連
ソフトウェア設計
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
ラーメン日記
四コマ漫画
その他
おすすめアイテム
おもしろコラム
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • Blender
    • Houdini
    • ゲーム数学
    • ゲームAI
    • グラフィックス
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • IT関連
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • WordPress関連
    • ソフトウェア設計
    • おすすめ技術書
  • 音楽
    • DTM
    • 楽器・機材
    • ピアノ
  • ラーメン日記
    • 四コマ漫画
      • その他
        • おすすめアイテム
        • おもしろコラム
      1. ホーム
      2. 20240330_01_unity_wwise_basic

      【Unity】第一回 Wwiseを使用したサウンド制御 〜基本動作編〜

      サウンドUnityWwise
      2024-03-30

      マイケル
      マイケル
      みなさんこんにちは! マイケルです!
      エレキベア
      エレキベア
      こんにちクマ〜〜〜
      【Unity】サウンドミドルウェアに依存しない設計を考える【CRI ADX・Wwise】
      2024-03-27
      マイケル
      マイケル
      以前の記事にて、UnityAudio、CRIADX、Wwiseで切り替え可能なサンプルプロジェクトを作成しました。 今回はその中でも「Wwiseを使用した基本動作の実装方法」について紹介していきます! 具体的には下記のような再生サンプルの実装方法になります。
      20240327_01_unity-multi_audio_03
      ▲サンプル1:基本機能

      エレキベア
      エレキベア
      UnityAudioやCRIADXで実装した内容と比較すると違いが分かりやすそうクマね
      【Unity】第一回 UnityAudioを使いこなす 〜サウンド再生処理編〜
      2024-01-22
      【Unity】第二回 UnityAudioを使いこなす 〜AudioMixer活用編〜
      2024-01-22
      【Unity】第一回 CRI ADXを使用したサウンド制御 〜基本動作、周波数解析編〜
      2024-03-28
      【Unity】第二回 CRI ADXを使用したサウンド制御 〜インタラクティブミュージック編〜
      2024-03-28
      【Unity】サウンドミドルウェアに依存しない設計を考える【CRI ADX・Wwise】
      2024-03-27
      マイケル
      マイケル
      作成したサンプルのリポジトリと、Wwise関連処理は下記になります! こちらも合わせてご参照ください!

      GitHub - unity-multi-audio

      ▲サンプルプロジェクト

      フォルダ
      内容
      Wwiseプロジェクト
      APIを実行する処理
      サンプルゲーム固有のオーディオ関連処理
      サンプルゲームに関する処理
      Wwiseプロジェクトから出力したサウンドデータ
      エレキベア
      エレキベア
      中々ボリュームのあるサンプルクマ

      参考書籍

      マイケル
      マイケル
      今回実装するにあたり、下記書籍を参考にさせていただきました!

      Unityサウンド エキスパート養成講座

      マイケル
      マイケル
      Wwiseには触れていませんが、UnityAudioとCRIADXを使用した実装について紹介されているためサウンドミドルウェアを使用するイメージが掴めると思います!
      エレキベア
      エレキベア
      Unityでのサウンド実装について幅広く知れる一冊クマね

      Wwise、Unityの基本設定

      マイケル
      マイケル
      まずは基本となるWwiseとUnityでの使用方法について簡単な流れを記載します。 詳細については公式サイトのチュートリアルやマニュアルをご参照ください!

      Wwise - Wwiseを学ぶ

      20240330_01_unity_wwise_basic_01
      エレキベア
      エレキベア
      Wwiseのチュートリアルは 101、301とかいろいろあるクマね

      Wwise側

      マイケル
      マイケル
      まずはWwise側で音源を取り込み、Soundbank、Eventというものを作成します。 Eventが実際にゲーム側から指定して再生する単位で、SoundbankはEventをまとまりごとに管理するものになります。

      参考:Wwise 101 - レッスン 1:クイックスタート - サイレンスからサウンドへ

      20240330_01_unity_wwise_basic_02
      ▲Soundbank、Eventを作成して使用する

      マイケル
      マイケル
      そして作成したSoundbank等の情報を書き出し、それをUnity側で読み込んで使用する流れになります。 CRIADXの例にはなりますが、下記のようなイメージです。
      20240328_01_unity_cri_basic_04
      ▲CRIADXの場合のイメージ(公式サイトからの引用)

      マイケル
      マイケル
      データの書き出しはWwiseの画面上からGenerateボタン押下で行えます。
      20240330_01_unity_wwise_basic_03
      ▲Soundbank情報の書き出し

      エレキベア
      エレキベア
      Wwiseで編集して書き出したものをUnityで使用するクマね

      Unity側

      マイケル
      マイケル
      UnityにWwise環境を導入すると、WwisePickerというSoundbank等の一覧が参照できるウィンドウが開けるようになります。
      20240330_01_unity_wwise_basic_04
      ▲Window > WwisePickerからEvent等の一覧を開ける

      マイケル
      マイケル
      そしてCRIの時と同様にScene上にグローバルオブジェクトを配置し、それとは別にSoundbank、Event用のオブジェクトも作成しておきます。 各オブジェクトに対してWwisePickerからSoundbank、EventをD&Dすれば、再生できるようになるはずです。

      参考:Wwise 301 - レッスン 1: サウンドを追加する

      20240330_01_unity_wwise_basic_07
      ▲グローバルオブジェクトの生成

      20240330_01_unity_wwise_basic_05
      ▲Soundbank、Event用のオブジェクト作成

      20240330_01_unity_wwise_basic_06
      ▲読込タイミング、対象を指定

      エレキベア
      エレキベア
      やっぱり基本的にはコンポーネントを介して制御するクマね
      マイケル
      マイケル
      しかしWwiseでも下記のようにしてスクリプトのみで再生することもできます。 このあたりはリファレンスやAkBankコンポーネント等の実装を見ることで確認できます。
              /// <summary>
              /// Eventの再生
              /// </summary>
              /// <param name="soundBankName">Soundbank名</param>
              /// <param name="eventName">Event名</param>
              /// <returns></returns>
              public uint PlayEvent(string soundBankName, string eventName)
              {
                  return AkSoundEngine.PostEvent(eventName, GetSoundBankObject(soundBankName));
              }
      
              /// <summary>
              /// Eventの停止
              /// </summary>
              /// <param name="soundBankName">Soundbank名</param>
              /// <param name="eventName">Event名</param>
              public void StopEvent(string soundBankName, string eventName)
              {
                  AkSoundEngine.ExecuteActionOnEvent(eventName, AkActionOnEventType.AkActionOnEventType_Stop, GetSoundBankObject(soundBankName));
              }
      
      ▲スクリプトのみでの実装例
      マイケル
      マイケル
      以降で紹介する実装内容についても、基本的にはスクリプト側から制御する方向での内容になります。 ツール側に処理を寄せる方法もあるとは思いますが、ご了承ください。
      エレキベア
      エレキベア
      なるべくスクリプトのみで制御しようとした場合の実装になるクマね

      基本機能のサンプル実装

      マイケル
      マイケル
      では早速サンプルの実装内容について紹介します。 まずは下記の基本機能をまとめたサンプルについてです。
      エレキベア
      エレキベア
      フェード再生からDSPエフェクト、音量調整まで よくある機能がまとまっているクマね

      Soundbankの読込

      マイケル
      マイケル
      最初に行うのはSoundbankの読込です。 先ほどはコンポーネントを配置して読み込みましたが、スクリプト側からも操作することができます。 まずは下記のようなSoundbank情報のクラスを用意しました。
              /// <summary>
              /// SoundBank情報
              /// </summary>
              public class SoundBankInfo
              {
                  /// <summary>
                  /// SoundBank名
                  /// </summary>
                  public string Name;
      
                  /// <summary>
                  /// 初期化時にロードするか?
                  /// </summary>
                  public bool IsLoadOnInitialize;
      
                  /// <summary>
                  /// デコードするか?
                  /// </summary>
                  public bool IsDecodeBank;
      
                  /// <summary>
                  /// デコードして保存するか?
                  /// </summary>
                  public bool IsSaveDecodedBank;
              }
      
      ▲Soundbank情報
      マイケル
      マイケル
      そして AkBankManager.LoadBank で読み込んだ後に AkSoundEngine.RegisterGameObj でWwiseのゲームオブジェクトとして登録することで使用する準備は完了です。
              /// <summary>
              /// SoundBankに対応するオブジェクトのキャッシュ
              /// </summary>
              private readonly Dictionary<string, HashSet<GameObject>> _soundBankObjectCache = new Dictionary<string, HashSet<GameObject>>();
      
      ・・・略・・・
      
              /// <summary>
              /// SoundBankのロード
              /// </summary>
              /// <param name="soundBankInfo"></param>
              public void LoadSoundBank(IWwiseApiService.SoundBankInfo soundBankInfo)
              {
                  var soundBankName = soundBankInfo.Name;
                  AkBankManager.LoadBank(soundBankName, soundBankInfo.IsDecodeBank, soundBankInfo.IsSaveDecodedBank);
      
                  // GameObjectを生成しておく
                  if (!_soundBankObjectCache.ContainsKey(soundBankName))
                  {
                      var soundBankObject = new GameObject(soundBankName);
                      soundBankObject.transform.SetParent(_soundBankRootObject.transform);
                      _soundBankObjectCache.Add(soundBankName, new HashSet<GameObject>{ soundBankObject });
                      AkSoundEngine.RegisterGameObj(soundBankObject); // AkGameObjectとしても登録しておく
      
                      // ボリュームが先に設定されている場合もあるため、GameObjectに反映するため再設定
                      SetSoundBankVolume(soundBankName, GetSoundBankVolume(soundBankName));
                  }
              }
      
      ▲Soundbankの読込
              /// <summary>
              /// SoundBankのアンロード
              /// </summary>
              /// <param name="soundBankName"></param>
              public void UnLoadSoundBank(string soundBankName)
              {
                  AkBankManager.UnloadBank(soundBankName);
      
                  // 生成したGameObjectを破棄する
                  if (_soundBankObjectCache.TryGetValue(soundBankName, out var soundBankObjectList))
                  {
                      Object.Destroy(soundBankObjectList.FirstOrDefault());
                      _soundBankObjectCache.Remove(soundBankName);
                  }
              }
      
      ▲Soundbankのアンロード
      エレキベア
      エレキベア
      これで動的に読み込むことができるようになったクマね
      マイケル
      マイケル
      ちなみにボリュームに関してもSoundbank単位で調整できるようにしています。 これにはSoundbankゲームオブジェクトに対して AkSoundEngine.SetGameObjectOutputBusVolume で設定できます。
              /// <summary>
              /// SoundBankボリュームの設定
              /// </summary>
              /// <param name="soundBankName"></param>
              /// <param name="volume"></param>
              /// <returns></returns>
              public bool SetSoundBankVolume(string soundBankName, float volume)
              {
                  _soundBankVolumeCache[soundBankName] = volume;
      
                  // GameObjectがまだ生成されていない場合、キャッシュのみ行う
                  var mainSoundBankObject = GetMainSoundBankObject(soundBankName);
                  if (mainSoundBankObject == null)
                  {
                      return true;
                  }
      
                  // SoundBankに紐づく全てのオブジェクトに対してボリュームを設定する
                  foreach (var soundBankObject in _soundBankObjectCache[soundBankName])
                  {
                      if (soundBankObject == null)
                      {
                          continue;
                      }
                      var emitterObjectId = AkSoundEngine.GetAkGameObjectID(soundBankObject);
                      var listenerObjectId = AkSoundEngine.GetAkGameObjectID(_listenerObject.gameObject);
                      var result = AkSoundEngine.SetGameObjectOutputBusVolume(emitterObjectId, listenerObjectId, volume * _masterVolume);
                      if (result != AKRESULT.AK_Success)
                      {
                          Debug.LogError($"failed set volume => {soundBankName}: {result}");
                          return false;
                      }
                  }
                  return true;
              }
      
      ▲Soundbankボリュームの設定
      エレキベア
      エレキベア
      Wwiseは基本的にゲームオブジェクト単位で管理するクマね

      BGM再生

      マイケル
      マイケル
      そして基本的なBGM再生については、下記のようにEvent実行の関数を用意することで実装しました。
              /// <summary>
              /// SoundBankに対応するメインオブジェクトの取得
              /// </summary>
              /// <param name="name"></param>
              /// <returns></returns>
              private GameObject GetMainSoundBankObject(string name) => _soundBankObjectCache.ContainsKey(name) ? _soundBankObjectCache[name].FirstOrDefault() : null;
      
              ・・・略・・・
      
              /// <summary>
              /// Eventの再生
              /// </summary>
              /// <param name="soundBankName"></param>
              /// <param name="eventName"></param>
              /// <param name="option"></param>
              /// <returns></returns>
              public uint PlayEvent(string soundBankName, string eventName, IWwiseApiService.SoundPlayOption option = null)
              {
                  return PlayEvent(soundBankName, eventName, GetMainSoundBankObject(soundBankName), option);
              }
      
              /// <summary>
              /// Eventの再生
              /// </summary>
              /// <param name="soundBankName"></param>
              /// <param name="eventName"></param>
              /// <param name="gameObject"></param>
              /// <param name="option"></param>
              /// <returns></returns>
              public uint PlayEvent(string soundBankName, string eventName, GameObject gameObject, IWwiseApiService.SoundPlayOption option = null)
              {
                  if (option != null && option.IsStopOther)
                  {
                      StopAllSoundBank(soundBankName);
                  }
      
      ・・・略・・・
      
                  // Event再生
                  uint playId = 0;
                  if (option?.BeatSyncCallback != null
                      || option?.CustomEventCallback != null)
                  {
      
      ・・・略・・・
      
                  }
                  else
                  {
                      playId = AkSoundEngine.PostEvent(eventName, gameObject);
                  }
      
      ・・・略・・・
      
                  return playId;
              }
      
      ▲Eventの再生
      エレキベア
      エレキベア
      再生するオブジェクトはSoundbank単位で指定しているクマね
      マイケル
      マイケル
      そしてフェード再生は下記のように Pause -> Resume することで実装しました。 今回はスクリプトで制御するために無理やり実装したのですが、制御できないようにしているのを見ると基本的にWwise側でフェード設定する方がよさそうです。
              /// <summary>
              /// Eventの再生
              /// </summary>
              /// <param name="soundBankName"></param>
              /// <param name="eventName"></param>
              /// <param name="gameObject"></param>
              /// <param name="option"></param>
              /// <returns></returns>
              public uint PlayEvent(string soundBankName, string eventName, GameObject gameObject, IWwiseApiService.SoundPlayOption option = null)
              {
      
      ・・・略・・・
      
                  if (option != null && option.FadeTimeMs > 0)
                  {
                      // 再生後の Pause -> Resume による強制フェード
                      // 恐らく想定した使い方ではない...
                      AkSoundEngine.ExecuteActionOnEvent(eventName, AkActionOnEventType.AkActionOnEventType_Pause, gameObject);
                      AkSoundEngine.ExecuteActionOnEvent(eventName, AkActionOnEventType.AkActionOnEventType_Resume, gameObject, option.FadeTimeMs);
                  }
                  return playId;
              }
      
      ▲再生時のフェード指定
      エレキベア
      エレキベア
      スクリプト側で設定できるようにしてくれてもいい気がするクマが・・・

      SEの3D再生

      マイケル
      マイケル
      そして3D位置による再生については、下記のようにゲームオブジェクトを渡して AkSoundEngine.RegisterGameObj で登録することで実装しました。
              /// <summary>
              /// Eventの再生
              /// </summary>
              /// <param name="soundBankName"></param>
              /// <param name="eventName"></param>
              /// <param name="gameObject"></param>
              /// <param name="option"></param>
              /// <returns></returns>
              public uint PlayEvent(string soundBankName, string eventName, GameObject gameObject, IWwiseApiService.SoundPlayOption option = null)
              {
      
      ・・・略・・・
      
                  // メイン再生オブジェクト以外の場合、ボリューム調整のためキャッシュしておく
                  var mainSoundBankObject = GetMainSoundBankObject(soundBankName);
                  if (mainSoundBankObject != null && mainSoundBankObject != gameObject)
                  {
                      AkSoundEngine.RegisterGameObj(gameObject);
                      _soundBankObjectCache[soundBankName].Add(gameObject);
                      SetSoundBankVolume(soundBankName, GetSoundBankVolume(soundBankName));
                  }
      
                  // Event再生
                  uint playId = 0;
                  if (option?.BeatSyncCallback != null
                      || option?.CustomEventCallback != null)
                  {
      
      ・・・略・・・
      
                  }
                  else
                  {
                      playId = AkSoundEngine.PostEvent(eventName, gameObject);
                  }
      
      ・・・略・・・
      
                  return playId;
              }
      
      ▲Eventの再生(3D)
              /// <summary>
              /// サウンドイベント再生(3D)
              /// </summary>
              /// <param name="eventName">サウンドイベント名</param>
              /// <param name="gameObject">再生するゲームオブジェクト</param>
              /// <param name="option">再生オプション</param>
              public void PlaySoundEvent(string eventName, UnityEngine.GameObject gameObject, IGameAudioService.SoundPlayOption option = null)
              {
                  _wwiseApiService.PlayEvent(GameWwiseAudioSettings.Wwise.GetSoundBankName(eventName), eventName, gameObject,
                      new IWwiseApiService.SoundPlayOption()
                      {
                          IsStopOther = true,
                          FadeTimeMs = option?.FadeTimeMs ?? 0,
                          BeatSyncCallback = option?.BeatSyncCallback,
                          CustomEventCallback = option?.CustomEventCallback,
                      });
              }
      
      ▲PlayEventにgameObjectを渡す
      エレキベア
      エレキベア
      AddComponentじゃなくWwiseのゲームオブジェクトとして登録するクマね

      音量調整

      マイケル
      マイケル
      音量調整については、調べた限りは取得処理が見当たらなかったので変数としてボリュームを保持して返すようにしました。 実装としては下記のようになっています。
              /// <summary>
              /// Masterボリューム
              /// </summary>
              public float MasterVolume
              {
                  get => _wwiseApiService.GetMasterVolume();
                  set => _wwiseApiService.SetMasterVolume(value);
              }
      
              /// <summary>
              /// BGMボリューム
              /// </summary>
              public float BgmVolume
              {
                  get => _wwiseApiService.GetSoundBankVolume(GameWwiseAudioSettings.Wwise.SoundBankName.Bgm);
                  set => _wwiseApiService.SetSoundBankVolume(GameWwiseAudioSettings.Wwise.SoundBankName.Bgm, value);
              }
      
              /// <summary>
              /// SEボリューム
              /// </summary>
              public float SeVolume
              {
                  get => _wwiseApiService.GetSoundBankVolume(GameWwiseAudioSettings.Wwise.SoundBankName.Se);
                  set => _wwiseApiService.SetSoundBankVolume(GameWwiseAudioSettings.Wwise.SoundBankName.Se, value);
              }
      
      ▲各ボリュームの取得/設定
              /// <summary>
              /// SoundBankに対応するボリューム情報のキャッシュ
              /// </summary>
              private readonly Dictionary<string, float> _soundBankVolumeCache = new Dictionary<string, float>();
      
              /// <summary>
              /// マスターボリューム
              /// </summary>
              private float _masterVolume = 1f;
      
      ・・・略・・・
      
              /// <summary>
              /// SoundBankボリュームの取得
              /// </summary>
              /// <param name="soundBankName"></param>
              /// <returns></returns>
              public float GetSoundBankVolume(string soundBankName)
              {
                  // ボリューム取得の関数は調べた感じだと用意されていないため、キャッシュしたボリュームをそのまま返している
                  // 永続的に扱うにはゲーム内で保存した値を使用する必要がある
                  return _soundBankVolumeCache.ContainsKey(soundBankName) ? _soundBankVolumeCache[soundBankName] : 1f;
              }
      
              /// <summary>
              /// SoundBankボリュームの設定
              /// </summary>
              /// <param name="soundBankName"></param>
              /// <param name="volume"></param>
              /// <returns></returns>
              public bool SetSoundBankVolume(string soundBankName, float volume)
              {
                  _soundBankVolumeCache[soundBankName] = volume;
      
                  // GameObjectがまだ生成されていない場合、キャッシュのみ行う
                  var mainSoundBankObject = GetMainSoundBankObject(soundBankName);
                  if (mainSoundBankObject == null)
                  {
                      return true;
                  }
      
                  // SoundBankに紐づく全てのオブジェクトに対してボリュームを設定する
                  foreach (var soundBankObject in _soundBankObjectCache[soundBankName])
                  {
                      if (soundBankObject == null)
                      {
                          continue;
                      }
                      var emitterObjectId = AkSoundEngine.GetAkGameObjectID(soundBankObject);
                      var listenerObjectId = AkSoundEngine.GetAkGameObjectID(_listenerObject.gameObject);
                      var result = AkSoundEngine.SetGameObjectOutputBusVolume(emitterObjectId, listenerObjectId, volume * _masterVolume);
                      if (result != AKRESULT.AK_Success)
                      {
                          Debug.LogError($"failed set volume => {soundBankName}: {result}");
                          return false;
                      }
                  }
                  return true;
              }
      
              /// <summary>
              /// マスターボリュームの取得
              /// </summary>
              /// <returns></returns>
              public float GetMasterVolume()
              {
                  return _masterVolume;
              }
      
              /// <summary>
              /// マスターボリュームの設定
              /// </summary>
              /// <param name="volume"></param>
              public void SetMasterVolume(float volume)
              {
                  _masterVolume = volume;
      
                  // 各SoundBankのボリュームにも反映
                  foreach (var soundBankName in _soundBankObjectCache.Keys)
                  {
                      SetSoundBankVolume(soundBankName, GetSoundBankVolume(soundBankName));
                  }
              }
      
      ▲Masterボリューム、Soundbankボリュームの管理
      エレキベア
      エレキベア
      うーん、他にいい方法はないのクマかね・・・

      DSPエフェクトの適用

      マイケル
      マイケル
      最後に、DSPエフェクトはスクリプトメインで設定するのは難しかったため、Wwise側メインで制御する方向で実装しました。 エフェクトをかけたBUSを用意し、send値をGameParameterで変化させるようにすることで実装しています。

      参考:Wwiseヘルプ - Game-Defined Auxiliary Sendを使う

      20240330_01_unity_wwise_basic_08
      ▲AudioBusの定義

      20240330_01_unity_wwise_basic_09
      ▲User-Defined Auxilliary Sendsの設定

      20240330_01_unity_wwise_basic_10
      ▲RTPCによる調整

      エレキベア
      エレキベア
      CRIでいうAISAC値がRTPCにあたるクマね
      マイケル
      マイケル
      あとはスクリプト側で対象のパラメータを設定するようにすれば実装は完了です。
              /// <summary>
              /// GameParameterの設定
              /// </summary>
              /// <param name="gameParameterName"></param>
              /// <param name="value"></param>
              public void SetGameParameter(string gameParameterName, float value)
              {
                  AkSoundEngine.SetRTPCValue(AkSoundEngine.GetIDFromString(gameParameterName), value);
              }
      
      ▲GameParameterの設定
              /// <summary>
              /// BGMエフェクト変更
              /// </summary>
              /// <param name="effectType">エフェクトタイプ</param>
              public void ChangeBgmEffect(IGameAudioService.EffectType effectType)
              {
                  switch (effectType)
                  {
                      case IGameAudioService.EffectType.Normal:
                          _wwiseApiService.SetGameParameter(GameWwiseAudioSettings.Wwise.GameParameterName.BgmReverb, 0);
                          _wwiseApiService.SetGameParameter(GameWwiseAudioSettings.Wwise.GameParameterName.BgmDistortion, 0);
                          break;
                      case IGameAudioService.EffectType.Reverb:
                          _wwiseApiService.SetGameParameter(GameWwiseAudioSettings.Wwise.GameParameterName.BgmReverb, 1);
                          _wwiseApiService.SetGameParameter(GameWwiseAudioSettings.Wwise.GameParameterName.BgmDistortion, 0);
                          break;
                      case IGameAudioService.EffectType.Distortion:
                          _wwiseApiService.SetGameParameter(GameWwiseAudioSettings.Wwise.GameParameterName.BgmReverb, 0);
                          _wwiseApiService.SetGameParameter(GameWwiseAudioSettings.Wwise.GameParameterName.BgmDistortion, 1);
                          break;
                  }
              }
      
      ▲エフェクト適用処理
      エレキベア
      エレキベア
      スクリプト側での実装は簡単クマね

      おわりに

      マイケル
      マイケル
      というわけで今回はWwiseによる基本挙動の実装でした! どうだったかな?
      エレキベア
      エレキベア
      CRIの実装とはまた違って面白かったクマ〜〜
      マイケル
      マイケル
      スクリプト側での実装方法を調べるのが大変で、制御がWwise側に寄っている印象を受けました。 今回紹介した内容もこれがベストかどうかは疑問なところですね・・・
      マイケル
      マイケル
      次回は引き続きWwiseでインタラクティブミュージックの実装に挑戦してみます! お楽しみに!!
      エレキベア
      エレキベア
      クマ〜〜〜〜〜〜

      【Unity】第一回 Wwiseを使用したサウンド制御 〜基本動作編〜 〜完〜

      【Unity】第一回 UnityAudioを使いこなす 〜サウンド再生処理編〜
      2024-01-22
      【Unity】第二回 UnityAudioを使いこなす 〜AudioMixer活用編〜
      2024-01-22
      【Unity】第一回 CRI ADXを使用したサウンド制御 〜基本動作、周波数解析編〜
      2024-03-28
      【Unity】第二回 CRI ADXを使用したサウンド制御 〜インタラクティブミュージック編〜
      2024-03-28

      サウンドUnityWwise
      2024-03-30

      関連記事
      【Unity】Timeline × Excelでスライドショーを効率よく制作する
      2024-10-31
      【Unity】Boidsアルゴリズムを用いて魚の群集シミュレーションを実装する
      2024-05-28
      【ゲーム数学】第九回 p5.jsで学ぶゲーム数学「フーリエ解析」
      2024-05-12
      【Unity】GoでのランキングAPI実装とVPSへのデプロイ方法についてまとめる【Go言語】
      2024-04-14
      【Unity】第二回 Wwiseを使用したサウンド制御 〜インタラクティブミュージック編〜
      2024-03-30
      【Unity】第二回 CRI ADXを使用したサウンド制御 〜インタラクティブミュージック編〜
      2024-03-28
      【Unity】第一回 CRI ADXを使用したサウンド制御 〜基本動作、周波数解析編〜
      2024-03-28
      【Unity】サウンドミドルウェアに依存しない設計を考える【CRI ADX・Wwise】
      2024-03-27