【乐府】史上最详细cocos-creator接入wwise

转自【乐府札记】: 【CocosCreator】史上首次有人把Wwise接入讲这么清楚

01 准备工作

  1. 注册wwise账号 (不要怕,这是免费滴)地址:https://www.audiokinetic.com/zh/sign-up/

  2. 注册帐号并登陆后,注册一个项目后可以 拿到授权 ,此步骤也可以最后再研究,不影响接入和测试使用。(当前wwise的免费版本支持一个项目500个音效上限,满足大部分中小项目需求)
    image

  3. 下载wwise编辑器 地址:Audiokinetic | Download Wwise

  4. 下载完成后打开,发现其实是个Launcher(类似CocosCreator的DashBoard),在Launcher切换Wwise页签 下载新版的Wwise编辑器

特别提醒:对应版本编辑器安装目录包含了wwise的sdk和示例工程。


5. 点击对应版本的Launch可以打开真正的Wwise编辑器,创建一个 Wwise工程


创建界面如下:

OK,到这里,准备工作就做好了,当然还有两个比较有用的网址一定要记住去白嫖。

官方sdk文档传送门 :官方文档

一些简单的操作学习视频:视频教程

02 SDK接入

  1. 首先wwise为Unity和unreal提供了贴心的 sdk集成服务

比如unity,你只需要将Wwise launcher选项切换到Unity页面,Wwise launcher会自动检测并显示的Unity工程,没有的可以手工导入。点击集成到Unity,Wwise会被自动添加到Unity特定工程。完成后Wwise会在Unity工程目下新增一个Wwise工程目录,并加Wwise插件放到Unity工程的Assets目录下。完成~

But Cocos没有 !, So what xxx? , 有种被忽视和歧视的感觉!

去搜索引擎搜索,也只搜到了

嗯。。。Cocos的进击之路还很长啊。。。

在这条没有前辈的路上,我就是前辈,多么骄傲的领悟!

  1. 言归正传,Cocos没有wwise的官方一键集成,并不代表它不支持Cocos。所幸还有个6年前(此处应有表情:“我想静静”)的 demo可以参考 ,再结合官方sdk做分析。看看demo里面都有些啥:

再看看SDK里面有些啥:


SoundEngine是个重要的目录,看看有些啥接口:

  1. 参照cocos2dx-IntegrationDemo的windows工程,并对比wwise-sdk和wwise-sdk下samples目录里的 SoundEngine 工程,不难得出:
  • 可以集成wwise提供的预编译库到cocos原生工程,wwise的所有功能都通过include文件夹里的头文件暴露。
  • wwise本身不提供文件路径定位的功能,需要实现对应wwise申明的抽象接口,并注册给wwise使用,并且ios,android,windows的实现不一样。不过SoundEngine基本给我们实现的七七八八了,我们只需要考虑CocosCreator原生端的热更新+文件名与UUID的映射。
  • 我们可以自己封装一个Wwise的单实例管理器去管理wwise的生命周期,以及封装加载,播放,暂停等接口,并通过jsb暴露给js调用,方便逻辑开发。
  1. 下面是我在CocosCreator的native项目下建立的目录
    image
  • include来自{wwise-sdk}/include
  • prebuilt为新建文件夹,里面放置各个平台的预编译库(来自wwise-sdk)

image

  • proj.xxx为各平台的工程配置文件。
  • WWiseHelper为一个单实例的wwise管理器,代码可以先复制cocos2dx-IntegrationDemo的WwiseWrapper。

image

  • 其余都来自{wwise-sdk}/samples/SoundEngine

image

2.1、sdk-windows

用vs打开cocos的sln工程,新建一个libwwise工程,并为入口项目设置依赖项:


libwwise的各个配置我们先完全参考libcocos2d的配置, libwwise增加目录包含:

game工程也添加目录包含:

game工程增加链接库文件目录和相应的lib文件名:


libwwise工程将win32和common的代码文件加入进来,把wwisehelper也加入进来

修改掉一些编译报错和一些代码报错,基本windows就编通了,当然想运行通,没这么简单,不要着急,看完下面的android和ios项目配置后,会详细说明。(着急的人先跳到2.4继续看)

2.2、sdk-android

安卓的jni编译,需要编写mk文件, 参考cocos2dx-IntegrationDemo的写法,基本能满足需求:

不过为了工程化管理,笔者单独写了mk文件,给主工程引用,方便管理,内容与demo的大同小异:
image

2.3、sdk-ios

ios工程下我们同样建立一个lib工程,把文件和lib库都加入进去:


2.4、sdk-wwiseHelper

  1. 前面的内容只让我们把wwise库编译进去,接下来我们介绍怎么使用。在使用前,我们至少要先准备一些简单的wwise资源,方便runtime调用。

打开wwise编辑器新建一个工程,把一个wav音频拖入进去

右键这个音频,New Event->Play

image

切换到SundBanks,我们新建一个Main的bnk

在菜单的Layouts切换SoundBnk,然后把Play_ttt事件拖动给Main-bnk,点击Generate,发布成功

按照官方sdk文档介绍,wwise的runtime只会用到Init.bnk和Main.bnk

我们只需要调用wwise的接口发送Play_ttt的事件,那么游戏就会播放这个音频

  1. 回过头来看wwisehelper,我们之前只是简单copy了cocos2dx-IntegrationDemo的内容。
    image
    image
    只提供了 初始化销毁每帧调用render 的参考代码。别的嘞???

没关系,官方的sdk提供了完整的资料,看完官方文档,在查阅sdk的头文件,不难发现,基本的API都在这里:
image
所以我们可以根据这些API,扩展下wwiseHelper:



基本功能就是加载 卸载 bnk, 注册 object发送event暂停继续停止rtpc控制 等。。。

  1. 在game的AppDelegate中需要加入wwise的 生命周期管理 (暂停,继续,销毁)


    image
    (注:plugin命名空间就不用care了,这是我们的所有扩展库的命名空间)

  2. 通过jsb-binding导出给js端调用(你们都会的):

在ts端新建的d.ts添加接口申明:

在ts中再次封装一个player类,初始化的时候,加载2个bnk,就可以调用postEvent播放了:

2.5 sdk-兼容CocosCreator的资源管理方式

然鹅,当你做完上面的所有步骤,你会发现可能还是不能正确播放,看log会发现wwise报错显示未找到 Init.bnkMain.bnk

原因很简单,因为当你把资源放到creator编辑器下的assets目录后,经过creator发布打包后,所有资源都会被重命名为uuid形式放在cocos的bundle下的native目录。

想解决这个问题有2种方式:

  • 自建资源目录 ,这个目录不放在在assets目录,打包后也不归bundle管理。
  • 把uuid和原文件名关联隐射 ,读取时把原文件名转化为真正的uuid。

第1种方式比较简单,没什么挑战,所以不介绍了,我们介绍第2种(我们就是喜欢挑战最难的),下面为实现方式:

  1. 假设将整个wwise工程导出的内容都放在resouce-bundle下,那么我们建立一个 resouces/bnk文件夹(如果在别的bundle下同理)。
  2. 新建一个bnk.txt放到上面目录中
  3. 在bnk.txt里记录所有bnk和wem(wem为单独未合并音频-可在官网sdk文档查看)文件对应的uuid文件名
  4. bnk.txt的内容可以通过creator插件模式自动监听文件变化生成,uuid直接读取.meta为文件里的即可
  5. 初始化wwise时,先获取resouces-bundle的native路径,再把bnk.txt中记录的隐射关系传给wwise,那么所有的Wwise导出文件都能根据uuid直接获得在resouce-bundle的native文件夹下的实际相对路径。
  6. 获取的uuid路径再通过cocos2d::FileUtils::getInstance()->fullPathForFilename得到最后热更新最新版本的路径
  7. android版在cocos会得出@assets/前缀的路径,代表的是包内内容,需要通过android的AssetManager读取,读取时(wwise有自己的读取文件函数封装),需要把@assets/前缀去除,需要特殊处理下资源路径图:

ios+windows关键代码:

android关键代码:

当你准备好这些,并且全部编译通过,打包到手机上,就能正确听到wwise的音效输出了,真的很丝滑有没有。

TIPS:想获得最新的文章推荐,请关注公众号“乐府札记”


关于 乐府互娱

乐府互娱成立于2019年,是一家专注于精品移动游戏研发和运营的明星初创企业。

公司核心团队是《少年三国志》《少年西游记》系列作品的原班人马,其中制作人、策划、技术、美术、UI、发行等模块核心成员已共事多年,拥有成熟的研发产品体系和管理体系。

团队长期深耕卡牌手游等品类,具备敏锐的嗅觉和高效的研运能力,以长线游戏研发运营著称,打造过数款月流水过亿的产品,包括《少年三国志》《少年西游记》等,游戏累计流水超100亿元。

公司在成立之初即获得资本市场高度认可,目前已完成B轮数亿元融资。短期内,乐府将结合自身优势,继续致力于中轻度卡牌手游的深耕细作,保持在该领域的头部地位。

在长期,乐府会重点聚焦于“游戏工业化”之路,在自研自发的前提下,继续打造经典游戏IP。

21赞

牛X牛X牛X!

牛牛牛牛牛牛

战略性Mark!!!

大佬厉害了。请教下您这个“在这条没有前辈的路上的前辈”,我在creator 2.4.3 上,想按照您的教程接入 wwise 体验一下,您图中这个engine-cplusplus 是什么目录,它的上级目录是什么?麻烦告知下,谢谢。
我怎么看到
proj_root/build/jsb-default/frameworks/cocos2d-x/external 是分平台的预编译头文件和库文件,和您的目录对不上,为了跟着您后面的教程且做不容易出错,想和您保持一样的目录结构。


1赞

1、engine-cplusplus就是把creator的c++部分copy了一份出来而已
2、目录位置问题不大,按照c++的编译规范配置即可

更新一条后来遇到的兼容性问题:
在个别华为手机上,wwise运行久了会产生声音变成碎屑声的情况。
原因是由于华为的音效兼容性问题,需要为华为专门设置成低版本的音效api。
设置方式为:

1赞

先mask以下,等有时间尝试下

mark~~

看到这么复杂的文档,瞬间麻了

mark zsbd

大佬这个cocos creator版本是多少,怎么和我的native目录一点也不像

是什么 为什么


这样的,我的是2.4.10

请问大佬,步骤2.1、sdk-windows 那个game工程是啥啊?我咋找不到这些.sln,creator3.7.希望大佬能更一下3代的步骤

想起之前接wwise,接完了,上层接口也弄好了,结果发现wwise一点都不便宜。。然后产品经理直接弃用。。。

我的御剑日记有接入wwise吗

现在看还是牛逼