目次

Wwise Unity Integrationの使用

このインテグレーションによって、良くあるシナリオ用にコードなしで直接使えるコンポーネントがいくつか提供されます:

  • AkAmbient
    Use this component to attach a Wwise Event to any object in a scene. The sound can be started at various moments, dependent on the selected Unity trigger. This component is more useful for ambient sounds (sounds related to scene-bound objects) but could also be used for other purposes. Since AkAmbient has AkEvent as its base class, it features the play/stop, play multiple, stop multiple and stop all buttons for previewing the associated Wwise event. . AkAmbientをInspectorで使うには を参照してください。
  • AkAudioListener
    Add this script on the game object that represent a listener. This is normally added to the Camera object or the Player object, but can be added to any game object when implementing 3D busses. isDefaultListener determines whether the game object will be considered a default listener - a listener that automatically listens to all game objects that do not have listeners attached to their AkGameObjListenerList's.
  • AkBank
    Loads and unloads a SoundBank at a specified moment. Vorbis sounds can be decompressed at a specified moment using the decode compressed data option. In that case, the SoundBank will be prepared.
  • AkEmitterObstructionOcclusion
    Obstructs/Occludes the emitter of the current game object from its listeners if at least one object is between them.
  • AkEnvironment
    Use this component to define a reverb zone. This needs to be added to a collider object to work properly. AkEvironmentやAkEvironmentPortalをInspectorと共に使うには (Reverb Zones).
  • AkEnvironmentPortal
    Use this component to define an area that straddles two different AkEnvironment's zones and allow mixing between both zones. AkEvironmentやAkEvironmentPortalをInspectorと共に使うには (Reverb Zones).
  • AkEvent
    Wwise Eventのことや、それをいつUnityでトリガーするのかを知っているHelperクラス。AkAmbientをInspectorで使うには を参照してください。
  • AkGameObj
    This component represents a sound object in your scene tracking its position and other game syncs such as Switches, RTPC and environment values. You can add this to any object that will emit sound, and it will be added to any object that an AkAudioListener is attached to. Note that if it is not present, Wwise will add it automatically, with the default values, to any Unity Game Object that is passed to Wwise.
  • AkRoom
    An AkRoom is an enclosed environment that can only communicate to the outside/other rooms with AkRoomPortals.
  • AkRoomPortal
    An AkRoomPortal can connect two AkRoom components together.
  • AkRoomPortalObstruction
    Obstructs/Occludes the spatial audio portal of the current game object from the spatial audio listener if at least one object is between them.
  • AkSpatialAudioEmitter
    Add this script on the GameObject which represents an emitter that uses the Spatial Audio API.
  • AkSpatialAudioListener
    Add this script on the game object that represent a listener. This is normally added to the Camera object or the Player object, but can be added to any game object when implementing 3D busses. isDefaultListener determines whether the game object will be considered a default listener - a listener that automatically listens to all game objects that do not have listeners attached to their AkGameObjListenerList's.
  • AkState
    This will call AkSoundEngine.SetState() whenever the selected Unity event is triggered. For example this component could be set on a Unity collider to trigger when an object enters it.
  • AkSurfaceReflector
    This component will convert the triangles of the GameObject's geometry into sound reflective surfaces.
  • AkSwitch
    This will call AkSoundEngine.SetSwitch() whenever the selected Unity event is triggered. For example this component could be set on a Unity collider to trigger when an object enters it.
参照:

Wwise Types

またこのインテグレーションには、最小限のコードで、これ以外の利用シナリオの大部分に対応できるクラスが、いくつか提供されています:

  • AK.Wwise.AuxBus

  • AK.Wwise.Bank

  • AK.Wwise.CallbackFlags

  • AK.Wwise.Event

  • AK.Wwise.RTPC

  • AK.Wwise.State

  • AK.Wwise.Switch

  • AK.Wwise.Trigger

参照:

Wwise Authoring API (WAAPI) client

C# APIのあるネイティブWAAPIクライアントを使い、Unity内から WAAPI に接続できます。現在、WindowsとmacOS用に提供中です。Wwise Authoring APIが、JSONオブジェクト経由でメッセージを送信します。Unity側では、文字列を使いクライアントを実装しました。あなたの好きな方式で、有効なJSON文字列を構築してから、WAAPIクライアントに渡してください。

参照:

Wwiseサウンドをゲームオブジェクトに追加するには

サウンドをゲームに追加する方法は、3通りあります:

  • Wwise Picker を使う。 最も簡単にサウンドをオブジェクトに追加できます。EventをWwise PickerウィンドウからUnity ViewerまたはInspectorにあるオブジェクトまでドラッグします。これで自動的にAkAmbientコンポーネントが対象Game Objectに作成されます。
  • Add Componentメニューを使う。 AkAmbientコンポーネントやAkEventコンポーネントを、どのUnity Game Objectにも追加できます。
  • Wwise Types を使う。 いつでも AK.Wwise.Event.Post() をC#スクリプトからコールできます。
  • スクリプトを使う。 いつでも AkSoundEngine.PostEvent() をC#スクリプトからコールできます。

AkAmbientをInspectorで使うには

  • AkAmbient:
    • Trigger On:
      イベントをトリガーできるUnityイベントのリストが表示されます。これ以外のイベントでも可能です。いつでもコードのどこからでも、AkSoundEngine.PostEventをコールしてイベントをトリガーできます。またトリガーのコードを自分で書いて、リストで同僚が見れるようにできます。Wwiseイベントのトリガーを追加する を参照してください。
    • Event Name:
      現在のイベントの名前を指定します。イベントを選択するには、現在のイベント名をクリックしてイベントピッカーウィンドウを開きます。次にイベントをクリックしてOkボタンをクリックするか、イベントをダブルクリックして、それを選択します。また、イベントを Wwise Pickerからドラッグして現在のイベント名にドロップすることで、新しいものを選択することもできます。
    • Action On Event:
      Wwiseで定義されたイベントパラメータの一部を、Unityで直接オーバーライドできるようにします。これで既存のイベントを再利用できるので、新しいものを作成せずに済みます。
      • Action On Event Type:
        イベントタイプをオーバーライドします。
      • Curve Interpolation:
        インターポレーション(補間)カーブをオーバーライドします。
      • Fade Time:
        サウンドのフェードタイムをオーバーライドします。
    • Use Callback:
      簡単に、ゲームオブジェクトをイベントのコールバックに反応させることができます。
      • Game Object:
        コールバックを受けるゲームオブジェクト。ゲームオブジェクトを選択するには、階層からドラッグしてゲームオブジェクトフィールドにドロップします。
      • Callback Function:
        このファンクションが、コールバックが発生した時にGame Objectからコールされます。ファンクションを選択するには、ファンクション名をCallback Functionテキストフィールドに入力します。
        これが機能するにはGame Objectのコンポーネントの1つでCallback Functionを定義する必要があります
        ファンクションの定義を必ず次の通りにします: void FunctionName(AkEventCallbackInfo in_info)
      • Callback Flags:
        Callback Functionをいつコールするのかを指定するフラグを選択します。同時に複数のフラグを選択できます。各フラグの詳しい情報については、Wwise ドキュメンテーション のAkCallbackType一覧表を参照してください。
    • Play / Stop:
      Editモードの時に、Wwiseイベントをプレビューするのに使います。
    • Stop All:
      すべての再生中のWwiseイベントを停止します。
    • Position Type:
      イベントのポジションがどのようにAudioEngineに送信されるかを定義します。
      • Simple_Mode:
        このイベントのポジションは、イベントが添付されているゲームオブジェクトのポジションと同一です。
      • Large_Mode:
        イベントのポジションとして、複数のポイントを定義すれば複数のポジションを設定できます。ポイントを追加するには、AkAmbient Tool BarのAddボタンをクリックします。各ポイントの位置は、ポイントをドラッグして変えられます。このモードは、あるサウンドが同時に複数のポジションから同時にくる場合などに便利です。海の中にいる時の水のサウンドなどは、良い例です。
      • MultiPosition_Mode:
        このモードで、同じイベントを使うAkAmbientの全てのインスタンスに対してサウンドのインスタンスを1つにすることができるので、メモリを節約できます。
        このモードを利用するAkAmbientでイベントが同じものは自動的に検出され、同一サウンドを別々に何回もロードするのではなく、全てに同じサウンドインスタンスが使われます。
        なお、このモードのAkambientはイベントが同じであれば、全てトリガーが同じです(AkEventのTrigger On参照)。つまり1つのAkAmbientのトリガーを変更すると、ほかもイベントが同じであれば全て、トリガーが自動的に変更されます。
      • Show Attenuation Sphere:
        イベントによって再生されるサウンドの聞こえる範囲を定義する球体が表示されます。
        これが機能するにはMax AttenuationWwise プロジェクトのSoundBank設定で有効にする必要があります(project->project settings->soundbanks->Max attenuation)
        • Dont_Show:
          減衰球体が表示されません。
        • Current_Event_Only:
          現在のモード中に AkSoundEngine.PostEvent へのコールの後に再生される全てのサウンドの減衰球体が表示されます。
          Simple_Modeの場合は、ゲームオブジェクトからくるサウンドの減衰半球のみが表示されます。
          Large_Modeの場合は、全てのポイントのそれぞれの減衰カーブが表示されます。
          ifMultiPosition_Modeの場合は、同じイベントをもつMultiPosition_Modeの他の全てのAkAmbientの減衰半球が表示されます。
        • All_Events:
          シーン内の全てのAkAmbientの減衰半球が表示されます。

WwiseとUnity Timelineを使う

UnityのTimeline機能用に、Wwiseイベントをトリガーしたり、Wwise RTPC値を設定したりするための、カスタム設定のWwiseトラックがあります。

参照:

Unity WAAPIクライアントを使う

Unityインテグレーションに、Wwise Authoringツールとのインターフェースに使えるシンプルなWAAPIクライアントが入っています。

参照:

AkEvironmentやAkEvironmentPortalをInspectorと共に使うには (Reverb Zones)

WwiseでReverb Zoneのことを Environment または Auxiliary Sends と呼びます。リバーブゾーンはリバーブエフェクトだけに制限されず、Wwiseプロジェクトで定義されます。

AkEnvironmentコンポーネントは非常に単純な環境ゾーンを表します。AkEnvironmentは、あらゆる種類のColliderに添付できます。シーンにAkEnvironmentを追加するには:

  • Wwise Picker を使う。 AkEnvironmentを追加するのに最も簡単な方法です。AuxBusをWwise PickerウィンドウからUnity ViewerまたはInspectorにあるオブジェクトまでドラッグします。これで自動的にAkAmbientコンポーネントが対象Game Objectに作成されます。
  • "Add Component"メニューを使う。 AkEnvironmentコンポーネントを、どのUnity Game Objectにも追加できます。使いたい環境をInspectorのセレクタで選択します。
  • スクリプトを使う。 いつでも AK::SoundEngine::SetGameObjectAuxSendValues() をC#スクリプトからコールできます。

また、2つの環境のエフェクトを統合するためのポータルもあります。両者の環境が貢献するレベルは、ゲームオブジェクトからそれぞれの環境への距離に応じます。
例えばゲームオブジェクトが2つの部屋の間に立っている場合や、2つの環境をつなぐトンネル内にいる時などに便利です。

  • 環境ポータルをプロジェクトに追加するには、UnityのメニューバーでGameObject->Wwise->Envrionment Portalを選択します。

環境や環境ポータルを利用するには、環境を意識できるAkGameObjコンポーネントを有するゲームオブジェクトが必要です。
AkEnvironmentPortalオブジェクトは、そのオブジェクトに重なるAkEnvironmentオブジェクトを自動的に検知します。重複する環境はポータルのInspectorにある2つの選択リストに表示されます。ポータルに重複する環境が多すぎる場合は、ポータルでミックスすべき環境を選択できます。

Wwiseでは、同時にアクティブにできる環境数は最大4つです。4つの環境は、以下の通り選択されます:

  • ポータルに接続されている環境で最もプライオリティの高いものが順に4つまで、またはそれ以上にポータルに接続されている環境がないまで、選択されます。
  • 選択した環境が4つに満たない場合は、ポータルに接続されていない環境を、以下の通り選択します:
    • 最もプライオリティの高い環境が順に4つまで選択されます(DefaultフラグやExclude Othersフラグが設定されていなければ)。
    • Default環境は、他の環境が一切選択されていない場合に限り、選択されます。
    • ゲームオブジェクトがExclude Othersフラグの立っている環境の中にある場合はその環境が選択されて、他の環境は全て棄却されます。
  • AkEnvironment component:
    同時にアクティブにできる環境数は最大4つです。
    • Priority:
      その環境のプライオリティを定義する。
      数字が小さいほど、プライオリティが高くなります。
      ゲームオブジェクトが5つ以上の環境の中にある場合は、最もプライオリティの高い4つの環境のみがアクティブになります(DefaultフラグやExclude Othersフラグが設定されていなければ)。
    • Default:
      デフォルト環境は、そのゲームオブジェクトを含む環境が他にない場合に限りアクティブになります。
      ゲームオブジェクトが2つ以上のデフォルト環境の中にある場合は、最もプライオリティの高い1つの環境のみがアクティブになります。
    • Exclude Others:
      このフラグの立っている環境は、他の環境に重複されることはありません。
      ゲームオブジェクトがExclude Othersフラグの立っている環境の中にある場合は、他の環境は全て棄却されます。
      ゲームオブジェクトがExclude Othersフラグの立っている2つ以上の環境の中にある場合は、最もプライオリティの高い1つの環境のみがアクティブになります。
    • AuxBus Name:
      現在のAuxBusの名前を指定。AuxBusを選択するには、現在のAuxBus名をクリックしてAuxBusピッカーウィンドウを開きます。次にAuxBusをクリックしてOkボタンをクリックするか、AuxBusをダブルクリックして、それを選択します。また、AuxBusを Wwise Pickerからドラッグして現在のAuxBus名にドロップすることで、新しいものを選択できます。
  • AkEnvironmentPortal component:
    Unityで環境ポータルを作成するには、GameObject->Wwise->Environment Portalを選択します。
    2つの環境の間に環境ポータルを設定して、ゲームオブジェクトがそのポータルの中にある間は両者のエフェクトを統合することができます。これが機能するには、両者の環境とポータルが交差する必要があります。
    両者の環境が貢献するレベルは、ゲームオブジェクトからそれぞれの環境への距離に応じます。ゲームオブジェクトが1つの環境に近ければ近いほど、その環境の最終的なエフェクトに対する影響が強くなります。
    • Environment #1:
      ポータルは、そのポータルに交差する全ての環境を自動的に検知します。これらの環境のうち、ポータルの負の側に位置する環境(つまり選択された軸と反対方向にある環境)がドロップダウンメニューに表示されます。 このように環境をソートしておくのは、ランタイムに環境ごとの貢献レベルを判断するための演算量を削減するためです。
    • Environment #2:
      ポータルは、そのポータルに交差する全ての環境を自動的に検知します。これらの環境のうち、ポータルの正の側に位置する環境(つまり選択された軸と同一方向にある環境)がメニューに表示されます。 このように環境をソートしておくのは、ランタイムに環境ごとの貢献レベルを判断するための演算量を削減するためです。
    • Axis:
      環境ごとの貢献レベルを知るために使われる軸。
      例えばZ軸を選択すると、X軸方向の移動は環境ごとの貢献レベルを左右しません。Z軸方向の移動のみが貢献レベルを左右します。
      なお、軸はオブジェクトスペースにあります。つまり、ポータルを回転させると、軸も回転します。
参照:

サウンドエンジンの制御にC#コードを使う

Wwise SDKの大部分の機能を AkSoundEngine クラスからUnityで利用できます。C++ ネームスペースの AK::SoundEngineAK::MusicEngine などの代わりとしてとらえることができます。元のSDKと比較してAPIバインディングにどのような変更があったかは、APIの変更と制約を参照してください。 複雑な状況の場合は、コードでWwiseファンクションをコールする必要があります。APIで、全てのファンクションの GameObjectID がGameObjectのUnityフレーバーに置き換えられます。AkGameObjコンポーネントを既にマニュアル操作で追加してない限り、ランタイムにこのGameObjectに自動的に追加されます。

EventやBankの文字列の代わりに数値IDを使う。

ネーティブWwise APIで、文字列やIDを使ってWwiseプロジェクト内のイベントやその他の名前の付いたオブジェクトをトリガーできます。C#の世界でも、 Wwise_IDs.h ファイルを Wwise_IDs.cs に変換することで、同様にできます。Assets > Wwise > Convert Wwise SoundBank IDsをクリックする。これが機能するには、Pythonをインストールしておく必要があります。

MIDIをWwiseに送る。

MIDIをWwiseに送るには、 AkMIDIPostArray クラスの AkMIDIPost メンバーをfillして、以下の方式のどれかをコールします:

  • AkMIDIPostArray.PostOnEvent()
  • AkSoundEngine.PostMIDIOnEvent()
  • AK.Wwise.Event.PostMIDI()

以下は、サウンドエンジンにMIDIメッセージを送るための基本的なスクリプトです。

public class MyMIDIBehaviour : UnityEngine.MonoBehaviour
{
    public AK.Wwise.Event SynthEvent;

    private void Start()
    {
        AkMIDIPostArray MIDIPostArrayBuffer = new AkMIDIPostArray(6);
        AkMIDIPost midiEvent = new AkMIDIPost();

        midiEvent.byType = AkMIDIEventTypes.NOTE_ON;
        midiEvent.byChan = 0;
        midiEvent.byOnOffNote = 56;
        midiEvent.byVelocity = 127;
        midiEvent.uOffset = 0;
        MIDIPostArrayBuffer[0] = midiEvent;

        midiEvent.byOnOffNote = 60;
        MIDIPostArrayBuffer[1] = midiEvent;

        midiEvent.byOnOffNote = 64;
        MIDIPostArrayBuffer[2] = midiEvent;

        midiEvent.byType = AkMIDIEventTypes.NOTE_OFF;
        midiEvent.byOnOffNote = 56;
        midiEvent.byVelocity = 0;
        midiEvent.uOffset = 48000 * 8;
        MIDIPostArrayBuffer[3] = midiEvent;

        midiEvent.byOnOffNote = 60;
        MIDIPostArrayBuffer[4] = midiEvent;

        midiEvent.byOnOffNote = 64;
        MIDIPostArrayBuffer[5] = midiEvent;

        SynthEvent.PostMIDI(gameObject, MIDIPostArrayBuffer);
    }
}

UnityでAudio Input Sourceプラグインを使う。

Audio Input Sourceプラグインを、C#スクリプト経由で使えます。Wwise SDKドキュメンテーションの、オーディオ入力ソースプラグインを参照してください。

以下は、Audio Input Sourceプラグインにテストトーンを送るための基本的なスクリプトです。

public class MyAudioInputBehaviour : UnityEngine.MonoBehaviour
{
    public AK.Wwise.Event AudioInputEvent;
    public uint SampleRate = 48000;
    public uint NumberOfChannels = 1;
    public uint SampleIndex = 0;
    public uint Frequency = 880;
    private bool IsPlaying = true;

    // Callback that fills audio samples - This function is called each frame for every channel.
    bool AudioSamplesDelegate(uint playingID, uint channelIndex, float[] samples)
    {
        for (uint i = 0; i < samples.Length; ++i)
            samples[i] = UnityEngine.Mathf.Sin(Frequency * 2 * UnityEngine.Mathf.PI * (i + SampleIndex) / SampleRate);

        if (channelIndex == NumberOfChannels - 1)
            SampleIndex = (uint)(SampleIndex + samples.Length) % SampleRate;

        // これ以上提供するデータがないことを示すために、return falseとします。これで、関連するイベントも停止されます。
        return IsPlaying;
    }

    // Callback that sets the audio format - This function is called once before samples are requested.
    void AudioFormatDelegate(uint playingID, AkAudioFormat audioFormat)
    {
        // Channel configuration and sample rate are the main parameters that need to be set.
        audioFormat.channelConfig.uNumChannels = NumberOfChannels;
        audioFormat.uSampleRate = SampleRate;
    }

    private void Start()
    {
        // The AudioInputEvent event, that is setup within Wwise to use the Audio Input plug-in, is posted on gameObject.
        // AudioFormatDelegate is called once, and AudioSamplesDelegate is called once per frame until it returns false.
        AkAudioInputManager.PostAudioInputEvent(AudioInputEvent, gameObject, AudioSamplesDelegate, AudioFormatDelegate);
    }

    // コールバックを停止するために、このメソッドをほかのスクリプトからコールできます
    public void StopSound()
    {
        IsPlaying = false;
    }

    private void OnDestroy()
    {
        AudioInputEvent.Stop(gameObject);
    }
}

ポジショニングのカスタム設定をUnityで適用する

デフォルトで、 AkGameObj コンポーネントは特定のUnity gameObject に添付されて、そのtransform(オフセットの設定も可)を使ってフルポジショニングを行います。ファーストパーソンシューティングゲームなど多くのゲームは、これで充分です。一方、オーディオリスナーを単純に1つのゲームオブジェクト、例えばUnityのメインカメラなどに添付するだけでは、多くのサードパーソンゲームなどにあるカスタム設定されたカメラ角度で、ポジショニングに対応するための2つの要素(距離減衰とスペーシャリゼーション)に対応するのが難しい場合があります。また、その他のカスタム設定ポジショニングをプレイヤーに提供するゲームも、考えられます。

このような使い方のために、AkGameObjコンポーネントクラスで、Unityユーザーはポジショニングをオーバーライドできます。GetPosition()、 GetForward()、 GetUpward() という3つのバーチャル方式を使って、ユーザーは AkGameObj からサブクラスを取り、そのサブクラスコンポーネントでUnity gameObjects のポジショニングをいくつでもカスタマイズできます。

デフォルトの AkAudioListener 動作を、カスタムコンポーネントを使ってオーバーライドするシンプルな例を、ここに示します。Wwiseにサードパーソンのプロジェクトをインテグレートした状態で、既存の AkAudioListener と、それに関連付けられた AkGameObj を削除します。次に、以下のスクリプトをMainCameraオブジェクトに添付して、さらに AkAudioListener を添付して、最後にオーディオリスナーのポジションが追うターゲットとして、Unity gameObject (例えばプレイヤーのアバター)を指定します。これ以降、全てのエミッターの距離減衰を計算するのに、選択したターゲットのUnity gameObject のポジションをリスナーポジション(画面上の距離リスナー)としてとらえる一方、全てのエミッターのオリエンテーションを決めるには、引き続きメインカメラのオリエンテーションをリスナーのオリエンテーションとしてとらえます(画面外のオリエンテーションリスナー)。

#if !(UNITY_DASHBOARD_WIDGET || UNITY_WEBPLAYER || UNITY_WII || UNITY_WIIU || UNITY_NACL || UNITY_FLASH || UNITY_BLACKBERRY) // Disable under unsupported platforms.

//
// Copyright (c) 2017 Audiokinetic Inc. / All Rights Reserved
//

using UnityEngine;
using System;
using System.Collections.Generic;


[AddComponentMenu ("Wwise/AkGameObj3rdPersonCam")]
[ExecuteInEditMode] //ExecuteInEditMode necessary to maintain proper state of isStaticObject.
public class AkGameObj3rdPersonCam : AkGameObj
{
    public Transform target;            // The position that this camera will be following. ユーザーはこれを、InspectorでプレイヤーキャラクターのUnity gameObjectに対して指定できます。

    
    // 距離減衰に対応するために、カメラのポジションをプレイヤーポジションに設定します。
    public override Vector3 GetPosition ()
    {
        return target.GetComponent<AkGameObj> ().GetPosition ();
    }

}
#endif // #if !(UNITY_DASHBOARD_WIDGET || UNITY_WEBPLAYER || UNITY_WII || UNITY_WIIU || UNITY_NACL || UNITY_FLASH || UNITY_BLACKBERRY) // Disable under unsupported platforms.
Wwise Unity Integrationに対してTue Jan 29 11:50:13 2019に生成されました。  doxygen 1.6.3