Wwise Unity Integrationの使用

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

参照:

Wwise Types

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

参照:

Wwise Authoring API (WAAPI) client

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

参照:

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

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

AkAmbientをInspectorで使うには

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を追加するには:

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

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

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

参照:

サウンドエンジンの制御に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して、以下の方式のどれかをコールします:

以下は、サウンドエンジンに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 Dec 4 10:52:20 2018に生成されました。  doxygen 1.6.3