目录

Wwise Unity Integration Documentation
使用 Wwise Unity 集成

Unity Integration 提供 Wwise 专用组件,可直接用在 Unity Scene GameObject 上。这些组件可以满足大部分声音设计情境的需求。虽然组件为自定义 C# 脚本,但并不需要通过编程来编辑其公共属性。

添加 Wwise 组件

将 Wwise 组件添加到 Unity GameObject:

  • 转到已经加载了场景中所选 GameObject 的 Unity Inspector 窗口 (Ctrl+3)。
  • 单击 Add Component 来打开 Component 列表。
  • 单击 Wwise 来打开子列表,然后选择所需 Wwise components
    技巧: 若要快速访问包含所有 Wwise 组件的列表,请在组件的搜索字段中键入 ak。

Wwise Picker 添加 Wwise 组件

为了将组件添加到游戏中,您可以把 Wwise 对象从 Wwise Picker 拖到 Inspector 中或所加载场景的 Hierarchy 中列出的游戏对象上。

参见

WwiseGlobal 对象

WwiseGlobal 对象是一个包含 Wwise 声音引擎 Initializing 和 Terminating 脚本的游戏对象。在 Editor 工作流中,会将其添加到每一场景,以便在 Editor 中正常预览。在游戏中,只会在第一个场景中创建一个实例。该实例将在整个游戏当中保持有效。在初始化器脚本中,有一些可自定义的选项。

若要禁用此行为,请依次转到 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) 客户端

本机 WAAPI 客户端可通过 C# API 从 Unity 内部连接到 WAAPI。目前提供 Windows 和 macOS 版本。Wwise Authoring API 会通过 JSON 对象发送消息。在 Unity 中,客户端是通过字符串整合的。您可以根据需要灵活地构建有效的 JSON 字符串,然后将其提供给 WAAPI 客户端。

参见

如何将 Wwise 声音添加到游戏对象上

共有四种方法可以将声音添加到您的游戏中:

  • 使用 Wwise Picker.在所有将声音添加到一个对象的方法中,该方法是最简单的。将一个 Event 从 Wwise Picker 窗口拖动到 Unity Viewer 或者 Inspector 中的一个对象上。这样将自动在目标 Game Object 上创建一个 AkAmbient 组件。
  • 使用 Add Component 菜单。AkAmbient 或者 AkEvent 组件添加到任意 Unity Game Object 上。
  • 使用 unity_wwise_types。 从 C# 脚本中随时调用 AK.Wwise.Event.Post()。
  • 使用脚本。 从 C# 脚本中随时调用 AkSoundEngine.PostEvent()。

在 Unity Timeline 中使用 Wwise

在 Unity 的 Timeline 中,可使用自定义 Wwise Track 来触发 Wwise 事件,并设置 Wwise RTPC 值。

参见

使用 Unity WAAPI 客户端

Unity Integration 包含一个可用来与 Wwise 设计工具进行交互的简单 WAAPI 客户端。

参见

使用 C# 代码来控制声音引擎

大多数 Wwise SDK 函数可以通过 AkSoundEngine 类在 Unity 中使用。将它想象为 C++ 命名空间 AK::SoundEngine、AK::MusicEngine 等等的替代。想了解与原始 SDK 相比,API 绑定中所做的更改,请参考 pg_limitations。 对于更复杂的情况,您需要从代码中调用 Wwise 函数。在 API 中,所有函数中的 GameObjectID 被Unity 风格的 GameObject 所替代。在运行时,这个 GameObject 中将自动添加一个 AkGameObj 组件,除非您之前已经手动添加过了。

对于 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 成员赋值,并调用以下任一方法:

  • 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 源插件

您可以通过 C# 脚本来调用 Audio Input 源插件。请参阅 Audio Input Source Plug-in from the Wwise SDK documentation.

以下是一个将测试音发送到 Audio Input 源插件的简单脚本:

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;
// 通过该回调填充音频采样 – 此函数会在每一帧针对各声道调用。
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;
// 返回 false 表示已无更多数据可提供。与此同时,会停止关联事件。
return IsPlaying;
}
// 通过该回调设置音频格式 - 在请求提供样本之前会调用此函数一次。
.
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 一次,并在每一帧调用 AudioSamplesDelegate 一次,直到返回 false。
AkAudioInputManager.PostAudioInputEvent(AudioInputEvent, gameObject, AudioSamplesDelegate, AudioFormatDelegate);
}
// 可通过其他脚本调用此方法以停止回调
public void StopSound()
{
IsPlaying = false;
}
private void OnDestroy()
{
AudioInputEvent.Stop(gameObject);
}
}

在 Unity 中应用自定义定位

在默认情况下,会将 AkGameObj 组件关联到特定的 Unity gameObject ,并使用其变换功能(可选偏置)进行全面定位。这对很多游戏(如第一人称射击游戏)来说基本上就够了。不过,对于采用自定义镜头角度的游戏(如各种第三人称游戏)来说,假如只是简单地将音频听者关联到单个游戏对象(如 Unity 中的主镜头),定位的距离衰减和空间化这两个方面可能会不好协调。其他游戏可能还要给玩家提供别的自定义定位体验。

为此,AkGameObj 组件类允许用户重写定位。通过 GetPosition()、 GetForward()GetUpward() 这三种虚方法,用户可选择继承 AkGameObj 的子类,并使用这些子类组件来灵活地自定义任意数量 Unity gameObject 的定位。

这里有一个简单的示例,展示了如何使用自定义组件来重写默认的 AkAudioListener 行为。对这个整合了 Wwise 的第三人称游戏项目,可移除现有的 AkAudioListener 及其关联的 AkGameObj 。然后,将以下脚本关联到 MainCamera 对象,并关联 AkAudioListener 。最后,指定音频听者位置所要跟随的目标 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 来正确维护 isStaticObject 的状态。
public class AkGameObj3rdPersonCam : AkGameObj
{
public Transform target; // 指定此镜头所要跟随的位置。用户可在 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