Unity集成Wwise开发的流程

前言
Unity有自己的原生音乐功能:AduioSound。但是这个功能较为简单,对于音效开发人员来说并不是很友好。在一些大型的游戏中,音效会接入Wwise这个软件。音效开发者通过Wwise编辑器就能操作音效,然后Unity可以读取最终的文件,达到游戏开发和音效开发分离的效果。
Wwise是一个音效软件,有自己的编辑器工具,有SDK是面向多平台的。官方网站还有中文的支持,所以是比较友好的。官网还有开发文档,接入说明。接下来我们要做的事情离不开这个官网。

官网: https://www.audiokinetic.com/zh/products/wwise/

流程
接下来大体分为三部:1.准备工作 2.设置Wwise项目 3.Unity的接入
我使用的Wwise版本是2019.1.0.6947,Unity版本是2018.3.6f1。

在这里插入图片描述
提要
下载Wwise Lancher,安装版本,下载Unity的SDK包并安装到自己的项目中
新建Wwise项目,导入音效,导出SoundBank待用。
准备
准备工作重点是安装Wwise Lancher,接下来很多操作都和这个有关。

Wwise Lancher
1.下载。官网下载网址: https://www.audiokinetic.com/downloads/

在这里插入图片描述

2.下载后打开Lancher,选择WWISE,然后选择Modify进行下载。进入下载界面第一个就是版本,右边选择全平台,虽然不能全选。我的界面是已经下载好的了。然后就下载,需要等一下,而且不要点击其他切换界面。。我感觉很容易崩。

在这里插入图片描述

3.安装好就会显示安装好的版本号,如下图就是安装好了。

在这里插入图片描述
4.选择UNITY,我建议直接下载离线的安装包,否则每个项目都要重新从网上拉一次很慢。

 在这里插入图片描述

5.安装到你开发的Unity工程去。

在这里插入图片描述
Launcher的准备工作这样就差不多了。我们的音效是放到Wwise项目中的,所以需要新建一个项目。

Wwise项目
1.新建项目。从Launcher打开编辑器工具,然后新建项目。然后我这个是普通版的,会提示不能生成超过200条Event。

在这里插入图片描述

在这里插入图片描述
2.导入音效。点击菜单栏的Project,然后选择Import Audio Files…。然后弹出的界面就可以导入了。音效文件的放置我是用默认的。

 在这里插入图片描述

 在这里插入图片描述

3.导入成功。

在这里插入图片描述
4.添加播放事件。Event的概念是事件,所有的操作都是一个事件。对着资源点击右键,然后添加Play事件。

 在这里插入图片描述


5.生成事件成功。

在这里插入图片描述
6.生成SoundBank。在SoundBank Manager下点击New…,然后在弹出的界面中填入你的SoundBank名字,我就命名成SoundBank了。最后生成。
SoundBank是一个操作的集合。可以有多个也可以一个。但最少都必须有一个。我是把所有的Event都合在一个SoundBank下。

 在这里插入图片描述


7.生成成功。

在这里插入图片描述
8.设置SoundBank信息。如果这里选择了,就会覆盖掉Unity里对应的设置。SoundBank的导出我是选择导出到Unity项目里去的,能方便打包。这里可以按照自己的需要进行设置。如果没有什么需求的话,使用默认就可以了。默认的这个路径基于这个Wwise项目的路径的。

 在这里插入图片描述

9.生成最终的文件。选择SoundBank,平台和语言。最后点击Generate Selected。生成功能就会弹个窗,没有红色提示就说明OK了。

在这里插入图片描述

10.生成成功。

在这里插入图片描述
多平台设置
SoundBank的生成默认是Windows平台的,如果需要多平台设置的,操作如下。
1.选择Platform Manager。这里和最开始下载版本是有关系的,当初选择下载了什么平台,这里就能选什么平台。

 在这里插入图片描述

2.选择需要的平台。选择好后,点击OK。Platform Manager也点击OK。然后会弹窗说要刷新,点击确定即可。

在这里插入图片描述

3.现在就多出刚刚添加的平台。SoundBank就可以生成多几个平台的支持。选择上需要的平台,重新点击Generate Selected生成一下即可。

在这里插入图片描述

// 

前言
这一篇章大致讲一下Wwise的基础概念和常规设置。虽然不是音效开发人员,但是最好还是了解Wwise的基础功能,这样能方便我们自己快速测试效果。上一篇已经讲了按键生成之类相关的,如果对Wwise完全不了解的话,可以先看一下上一篇。
习惯用Unity的AuditoSource的同学,这里要分清楚,Wwise的使用概念和Untiy的并不相同。如下图,框起来的部分是指相同的部分。
Unity的AudioSource是一切操作的集合,包括设置播放,循环,音量等。而资源文件本身并没有进行任何改变,唯一的操作就是加载和卸载。
Wwise则是分成了音效属性和操作两个部分,再加多一个分包的概念。

在这里插入图片描述
提要
Unity的AduioSource和Wwise的概念并不相同。AudioSource是全操作,而Wwise分为Event(操作事件)和资源(资源本身和资源属性)
Wwise有分包概念,可以根据自己的项目的需求来定这个分包。资源少的话一个包也可以。但无论如何肯定需要一个包。
Event
这是音效操作的基础,无论是播放还是暂停,都是一个事件。而事件对于音效本身是不做处理的。
事件单纯是操作,如下图可见,是播放,停止,音量和状态等。除此之外,不做别的功能。可以理解为是对(音效)外的处理。

 在这里插入图片描述在这里插入图片描述

音效
音效是指我们导入项目的资源。比起Event,我们可以对资源做更多的处理。以下我就讲一些最常用的操作。

循环播放
在音乐播放结束后,继续紧接着播放同一个音乐。对应AudioSource的是Loop。
在Sound Property Editor面板,选择General Settings,右下有一个Loop选项,勾上即是循环播放。默认是不勾选。

在这里插入图片描述
3D音效
3D音效是指伴随监听者和音源的距离,所听到的音量会随之变化的效果。对应AudioSource的是2d-3d的滑动条。

1.在Sound Property Editor面板,选择Positioning模块,勾选Listener Relative Routing,勾选Attenuation。默认是都勾选了的。

在这里插入图片描述

2.需要添加Attenuation的事件。点击>>按钮新建一个。如果已经创建了可以选现有的。弹出面板后自定义命名点击OK按钮。

在这里插入图片描述

3.修改指数,重点是两个。
一个是距离。在Unity3d场景中,我觉得填30也差不多了。具体的可以导出在Unity里面对比着慢慢调。
一个是渐变指数。在这条红线上,任何点都可以双击设置关键点。也可以对着红线右键,选择平滑线。

在这里插入图片描述

在这里插入图片描述

 在这里插入图片描述

 
SoundBank
SoundBank的概念是音效操作的集合,是分包。游戏中有不同类型的音效,战斗的,日常的,点击的等等。当音效资源比较大的时候,如果在游戏开始时就全部加载,这可能会照成一定的性能问题。为此,Wwise提出了分包的概念。将不同类型的资源分为不同的包,在操作音效前,先加载包,然后再加载相关音效。当然,也可以将所有资源都放到一个包内。这个具体要看自己项目的需求。但无论如何,肯定有一个包的。

如何生成SoundBank,上一篇已经讲了,这里就不重复了。这一次,重点讲一下生成出来的东西到底是什么。

示例是上一篇的生成。下图是最终生成的所有东西。English(US)文件夹里面是空的,所以重点是当前文件夹里面的文件。

在这里插入图片描述
(一).bnk文件是Wwise处理后的音效资源。
(二)Init.txt和SoundBank.txt是SoundBank的具体信息。打开来看,可以看到里面分别记录了事件信息和对应的音效信息。从我的SoundBank里可以看到,对应有Play_Close事件和所使用的Close资源的存放路径。

 在这里插入图片描述

(三)SoundbanksInfo.xml是那些SoundBank配置文件的集合。
(四)PluginInfo.xml是一些平台设置。

这样很明显,如果需要知道Event对应的是哪个SoundBank的话,通过SoundbanksInfo.xml,我们就可以得到全部的信息。
 

前言
这一篇章是Unity接入Wwise的代码。如果看了前面两章的介绍,那么就会比较清晰地明白脚本为什么要这么写。

提要
1.绑定Wwsie项目并配置对应的项目设置
2.脚本交互:初始化,播放,音量,停止,开关,清理
3.热更资源配置路径

绑定Wwsie项目
我们之前已经建好了一个项目,在导入Wwise时可以选择我们项目的位置。
如果没有现成的项目,这个地方可以不用管,Wwise会安装默认位置去创建一个。

在这里插入图片描述

导入之后,在Wwise Picker面板可以看到我们之前设置好的数据。

在这里插入图片描述

这里是一些项目配置。包括WwiseProject的路径,SoundBanks的设置路径。但是如果在Wwise项目导出SoundBank的选择种,选了对应的Overirde,这里就会不生效。
Create WwiseGlobal GameObejct,这个选项我是取消的。我的做法是自己生成进行控制。

在这里插入图片描述
常用功能
这里讲一下音效系统中最常用的几个功能。

初始化
初始化要做两件事:
1.确保有AkInitializer对象,并赋值上了AkWwiseInitializationSettings
2.得到Event和SoundBank的映射数据

【AkInitializer】
这个是可以在Wwise Setting面板选择自动生成的【Create WwiseGlobal GameObejct选项】。不过我的做法是自己控制创建。
AkWwiseInitializationSettings对象是我们之前设置的Generated的相关数据,实际对象是存储在Resources里面的AkWwiseInitializationSettings.Asset。这个是默认放置在Resources里,所以如果不改动的话不要打到ab包去了,免得打重。这个对象必须要有,因为在真机运行时,就是靠这个对象拿到设置的数据。
在创建时必须时先SetActive为false,因为AkWwiseInitializationSettings是在Awake时进行初始化的。挂载脚本的时候,AkWwiseInitializationSettings还未存在就会直接报错,即便是后面赋值也不行。
            public void Init()
            {
                GameObject global = new GameObject(m_WwiseGlobalPrefabName);
                global.SetActive(false);
                GameObject.DontDestroyOnLoad(global);
                AkInitializer akInitializer = global.AddComponent<AkInitializer>();
                object settingObj = Resources.Load("AkWwiseInitializationSettings");
                if (settingObj != null)
                {
                    AkWwiseInitializationSettings settings = settingObj as AkWwiseInitializationSettings;
                    akInitializer.InitializationSettings = settings;
                    global.SetActive(true);
                }
            }

【Event和SoundBank的映射】
我的做法是解析SoundbankInfos.xml,里面有所有具体的信息。我的做法就是读取解析文本,大家可以根据情况选择自己的做法。而SoundbankInfos.xml是什么,具体可以看上一章,里面有详细的介绍。
最终是存储在一个字典里面,最终可以根据字典来得到映射关系。

脚本
播放 音量

        public void PlaySound(string soundName)
        {
            if (string.IsNullOrEmpty(soundName))
            {
                return;
            }
            if (!m_PlaySound)
            {
                return;
            }
            PlayEvent("Play", soundName, null, m_SoundVolume, true);
        }

        private void PlayEvent(string handName, string eventName, GameObject gameObject, float volume, bool finishCallback = false)
        {
            if (listener == null)
            {
                return;
            }

            //EventName我使用默认的“操作_资源名”,如:Play_Close。用户输入直接输入Close即可。
            string resourceName = handName + "_" + eventName;
            string bankName;

            //m_BankInfoDict是Event和SoundBank的映射关系字典
            if (!m_BankInfoDict.TryGetValue(resourceName, out bankName))
            {
                Debug.LogError(string.Format("加载event({0})失败,没有找到所属的SoundBank", resourceName));
                return;
            }
            if (!m_LoadBankList.Contains(bankName))
            {
                //加载SoundBank
                AkBankManager.LoadBank(bankName, false, false);
                m_LoadBankList.Add(bankName);
            }
            if (gameObject == null)
            {
                //加载一个预制体,预制体是空的
                gameObject = AddSoundGameObject(eventName);
            }
                //播放
            AkSoundEngine.PostEvent(resourceName, gameObject, (uint) m_CallbackType, finishCallback ? m_SoundFinishCallback : null, null);
                //设置音量
            AkSoundEngine.SetGameObjectOutputBusVolume(gameObject, listener, volume);
        }
停止


    //第一种方法
    AkSoundEngine.StopAll(targetGameObject);
    //第二种
    AkSoundEngine.PostEvent("Stop_" + soundName,targetGameObject)

开关

开关我没有使用Wwise的接口,而是自己记录一下。开就播放,关就调整音量为0。我不停掉音效的原因是,将音量调整为0再调整音效为可听见状态,中间是很自然的过度。如果是停掉再开就会重新播放。当然这个要看个人选择。

清理

AkSoundEngine.ClearBanks();

热更

Wwise可以设置一个路径作为最优先的加载路径。这个路径是填什么就是什么,Wwise不会再加以修改。以下是我的设置。这个可以根据自己的需求来设置。在Windows的情况下不需要设置。

#if !UNITY_EDITOR
            string newPath = Application.persistentDataPath + "/core/" + settings.UserSettings.m_BasePath;
#if UNITY_ANDROID
            newPath += "Android";
#elif UNITY_IOS
            newPath += "iOSResource";
#else
            newPath += "Windows";
#endif
            Debug.Log(string.Format("添加搜索路径:{0}",newPath));
            AkSoundEngine.AddBasePath(newPath);
#endif
 

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity UnityWebSocket插件是一款用于在Unity项目中实现WebSocket通信的插件。WebSocket是一种新的网络通信协议,它建立在HTTP协议之上,可以提供全双工通信,使得客户端和服务器可以通过一次HTTP握手建立持久的连接,实现实时的双向通信。 Unity UnityWebSocket插件可以方便地在Unity中使用WebSocket协议进行网络通信。它提供了简洁易用的API接口,开发者可以轻松地实现连接、发送和接收消息等操作。通过该插件,我们可以构建实时的游戏功能,例如聊天系统、多人游戏和实时更新等。 使用Unity UnityWebSocket插件,开发者可以通过几行代码实现WebSocket的连接和消息处理。首先需要创建WebSocket连接,通过指定服务器地址和端口号等参数进行连接。连接建立后,可以通过发送消息来与服务器进行通信,并通过接收消息事件来处理服务器返回的数据。 Unity UnityWebSocket插件还提供了一些高级功能,例如心跳机制和断线重连。心跳机制可以保持连接的稳定性,防止连接断开。断线重连功能可以在网络连接断开后自动重新连接服务器,确保通信的连续性。 总之,Unity UnityWebSocket插件是一款强大的工具,可以帮助开发者在Unity中实现WebSocket通信。它提供了简单易用的接口,并支持一些高级功能,使得开发者可以轻松地构建实时的游戏功能。该插件的使用可以提高开发效率,为游戏开发带来更多可能性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值