Unity使用Wwise实现音效
首先使用Wwise Launcher 将Wwise集成到项目中
在集成的时候无法识别中国版的Unity 必须要翻墙下载国外版的Unity
但这并不意味着必须要使用国外版的Unity进行项目开发,只需要在集成的时候使用与项目开发所使用的Unity版本相同的国外版的Unity进行集成即可,以本人所做的项目为例,使用的是Unity2020.3.11f1c1,本人在集成的时候所使用的是2020.3.11f1版本,之后继续使用f1c1版本进行项目开发,并没有出现错误
通过此选项来进行集成
在Unity中使用Wwise播放音效有两种实现方式
- 第一种方式是直接通过挂载脚本进行加载Bank文件,然后通过AkEvent来加载Event的方式进行播放
此种方式简单暴力,但是不宜维护,如果是多个Event进行播放则脚本管理起来比较麻烦,如下图所示
- 第二种方式则是使用脚本进行注册和加载,本人采用的是此种方式进行加载
const float minRTPCValue = 0f;
const float maxRTPCValue = 100f;
GameObject globalGameObject;
public void Init()
{
globalGameObject = new GameObject("Global Audio");
GameObject.DontDestroyOnLoad(globalGameObject);
AkSoundEngine.RegisterGameObj(globalGameObject, globalGameObject.name);
}
public void LoadBank(string name)
{
if (name.isNullOrEmpty())
{
Debug.LogError("AudioServiceImpl LoadBank name is null");
return;
}
AkBankManager.LoadBank(name, false, false);
}
public void UnloadBank(string name)
{
if (name.isNullOrEmpty())
{
Debug.LogError("AudioServiceImpl UnloadBank name is null");
return;
}
AkBankManager.UnloadBank(name);
}
public void Play(string name)
{
if (name.isNullOrEmpty())
{
Debug.LogError("AudioServiceImpl Play name is null");
return;
}
Play(name, globalGameObject);
}
public void Play(string name, GameObject go)
{
if (name.isNullOrEmpty())
{
Debug.LogError("AudioServiceImpl Play name is null");
return;
}
AkSoundEngine.PostEvent(name, go);
}
public void PlayAtGameObjectPosition(string name, GameObject go)
{
if (name.isNullOrEmpty())
{
Debug.LogError("AudioServiceImpl PlaySoundAtGameObjectPosition name is null");
return;
}
if (go == null)
{
Debug.LogError("AudioServiceImpl PlaySoundAtGameObjectPosition go is null:" + name);
return;
}
if (AkSoundEngine.RegisterGameObj(go, go.name) != AKRESULT.AK_Success)
{
Debug.LogError("AudioServiceImpl PlaySoundAtGameObjectPosition go is register failed:" + name + " " + go.name, go);
return;
}
AkSoundEngine.SetObjectPosition(
go,
go.transform.position.x,
go.transform.position.y,
go.transform.position.z,
go.transform.forward.x,
go.transform.forward.y,
go.transform.forward.z,
go.transform.up.x,
go.transform.up.y,
go.transform.up.z);
Play(name, go);
AkSoundEngine.UnregisterGameObj(go);
}
public void Stop(string name)
{
if (name.isNullOrEmpty())
{
Debug.LogError("AudioServiceImpl Stop name is null");
return;
}
Stop(name, globalGameObject);
}
public void Stop(string name, GameObject go)
{
if (name.isNullOrEmpty())
{
Debug.LogError("AudioServiceImpl Stop name is null");
return;
}
AkSoundEngine.ExecuteActionOnEvent(name, AkActionOnEventType.AkActionOnEventType_Stop, go, 300, AkCurveInterpolation.AkCurveInterpolation_Linear);
}
public void SetRTPC(string rtpc, float value)
{
if (rtpc.isNullOrEmpty())
{
Debug.LogError("AudioServiceImpl SetRTPC rtpc is null");
return;
}
AkSoundEngine.SetRTPCValue(rtpc, Mathf.Clamp(value, minRTPCValue, maxRTPCValue));
}
public void SetState(string group, string state)
{
if (group.isNullOrEmpty())
{
Debug.LogError("AudioServiceImpl SetState group is null");
return;
}
if (state.isNullOrEmpty())
{
Debug.LogError("AudioServiceImpl SetState state is null:" + group);
return;
}
AkSoundEngine.SetState(group, state);
}
public void SetSwitch(string group, string value, GameObject go)
{
if (group.isNullOrEmpty())
{
Debug.LogError("AudioServiceImpl SetSwitch group is null");
return;
}
if (value.isNullOrEmpty())
{
Debug.LogError("AudioServiceImpl SetSwitch value is null:" + group);
return;
}
if (go == null)
{
Debug.LogError("AudioServiceImpl SetSwitch go is null:" + group + " value:" + value);
return;
}
AkSoundEngine.SetSwitch(group, value, go);
}
}
此脚本中包含了注册,播放,加载Bank文件和卸载Bank文件以及各种切换,音量控制等函数,经过测试,加载和播放是完全可以实现的,其他的函数暂时还没有进行使用,都是WwiseSDK中提供的接口,之后在使用的时候会进行研究
以上是本次Wwise音效接入的一点总结,有不足之处还请大家指出,一定改正