目次

Wwise Unity Integration Documentation
Wwise Unity Integrationの使用

このインテグレーションは、Unity Scene GameObjectsでそのまま使えるWwise専用コンポーネントを提供します。これらのコンポーネントで、サウンドデザインの大体のシナリオに対応できます。コンポーネントはC::のカスタムスクリプトですが、その公開プロパティを編集するのに、プログラミングは必要ありません。

Wwiseコンポーネントの追加

Unity GameObjectsにWwiseコンポーネントを追加するには:

  • シーンで選択したGameObjectがロードされているUnity Inspectorウィンドウ(Ctrl+3)を開きます。
  • Add Component をクリックし、Componentリストを表示させます。
  • Wwise を選択してそのサブリストを開き、希望する Wwiseコンポーネント を選択します。
    TIP: コンポーネントのサーチフィールドに "ak" と入力すると、すべてのWwiseコンポーネントの入ったリストがすぐに表示されます。

Pickerから直接、Wwiseコンポーネントを追加する

コンポーネントをゲームに追加するには、WwiseオブジェクトをWwise PickerからInspectorにドラッグするか、ロードしたシーンのHierarchyの中にあるゲームオブジェクトにドラッグします。

参照

WwiseGlobalオブジェクト

WwiseGlobalオブジェクトは、Wwise Sound EngineのInitializingスクリプトとTerminatingスクリプトを含むGameObjectです。各シーンをEditorで正しくプレビューできるように、Editorのワークフローにおいて、すべてのシーンに追加されます。ゲーム中は最初のシーンでインスタンスが1つだけ作成され、それがゲームの終わりまで存続します。初期化スクリプトに、いくつかのカスタム設定可能なオプションがあります。

この動作を解除するには、 Edit > Wwise Settings を使い、 Create WwiseGlobal GameObject を無効にします。その場合、ゲームを通して存在するオブジェクトに、initializerスクリプトを追加するのは、あなたの責任となります。

メインカメラのリスナー

ポジショニング機能を使うには、すべてのシーンで、Ak Audio Listenerスクリプトをメインカメラに添付する必要があります。デフォルトで、自動的にリスナーがメインカメラに追加されます。この動作を無効にするには、 Edit > Wwise Settings に進み、 Automatically add Listener to Main Camera を無効にします。

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

  • AK.Wwise.AcousticTexture

参照

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::スクリプトからコールできます。

WwiseとUnity Timelineを使う

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

参照

Unity WAAPIクライアントを使う

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

参照

サウンドエンジンの制御に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.
This component represents a sound object in your scene tracking its position and other game syncs suc...
Definition: AkGameObj.cs:19
virtual UnityEngine.Vector3 GetPosition()
Definition: AkGameObj.cs:209