Unity项目接入Wwise
Unity项目接入Wwise
https://www.jianshu.com/p/6279e0142f8c
不说废话,项目需要接入wwise,在网上搜了下资料,大概2天弄了个简单的接入.
https://blog.csdn.net/sinat_34870723/article/details/89387926
https://blog.csdn.net/sinat_34870723/article/details/89458824
https://blog.csdn.net/sinat_34870723/article/details/89506079
前人栽树后人乘凉,具体接入插件可以看上面3个链接,不过由于我使用的最新版本,可能在某些交互UI会有不一样的地方!
我使用的是2019.1.2版本
soundbank的位置发生了变化
以及把event加入bank时候双击一个bank然后拖拽上去
图示很清楚了
还有导出的时候对着SoundBanks右键点击
或者记住快捷键 ALT+F7
生成目录
多个平台数据
生成出的文件,主要看这个xml
其他的不用在意,主要是需要用到这个ID,策划配表也只需要填写这个ID
直接上代码吧
using System;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using UnityEngine;
public class WwiseManager : SingletonClass<WwiseManager>
{
//全局控制开关
public bool IsPlayBGM = true;
public bool IsPlaySE = true;
private GameObject global;
//控制音量
public float _SoundVolumeBGM = 1.0f;
public float _SoundVolumeSE = 1.0f;
//2个观众 一个BGM 一个特效音 到时候互不影响
private GameObject listenerBGM;
private GameObject listenerSE;
//映射表
private Dictionary<uint, string> m_BankInfoDict = new Dictionary<uint, string>();
//所有bank的List
private List<string> m_LoadBankList = new List<string>();
public void Init()
{
//初始化AkInitializer 加载AkWwiseInitializationSettings
global = new GameObject("Wwise Global");
global.transform.parent = CorePlugins.Instance.pluginRoot;
global.SetActive(false);
AkInitializer akInitializer = global.AddComponent<AkInitializer>();
object settingObj = Resources.Load("AkWwiseInitializationSettings");
if (settingObj != null)
{
AkWwiseInitializationSettings settings = settingObj as AkWwiseInitializationSettings;
akInitializer.InitializationSettings = settings;
global.SetActive(true);
}
//做了一个0.1秒延迟
ToolKit.DelayCall(.1f, InitCompoent);
}
private void InitCompoent()
{
//首先需要设置一个LoadBank的路径,否则API不知道该从哪里load bank
//PathManager管理不同平台 iOS Android Windows
AKRESULT result = AkSoundEngine.SetBasePath(PathManager.WwiseFilePath());
if(result != AKRESULT.AK_Success)
{
Log.Error("不存在此音频路径");
return;
}
//Log.Info("设置Wwise音源路径为:" + PathManager.WwiseFilePath());
listenerBGM = new GameObject("listenerBGM");
listenerBGM.transform.parent = global.transform;
AkAudioListener akAudioListenerBGM = listenerBGM.AddComponent<AkAudioListener>();
//不能Default否则会串音
akAudioListenerBGM.SetIsDefaultListener(false);
akAudioListenerBGM.listenerId = 1;
listenerSE = new GameObject("listenerSE");
listenerSE.transform.parent = global.transform;
AkAudioListener akAudioListenerSE = listenerSE.AddComponent<AkAudioListener>();
akAudioListenerSE.SetIsDefaultListener(false);
akAudioListenerSE.listenerId = 2;
//游戏设置模块需要用到
InitSound();
//重要的一个解析xml方法
InitXML();
}
private void InitSound()
{
IsPlayBGM = LocalDataSave.Instance.HasKey(LocalDataSave.Instance.Int_BGM_Open) ? (LocalDataSave.Instance.GetIntData(LocalDataSave.Instance.Int_BGM_Open) == 1) : true;
float volume = LocalDataSave.Instance.HasKey(LocalDataSave.Instance.Float_BGM_Volume) ? LocalDataSave.Instance.GetFloatData(LocalDataSave.Instance.Float_BGM_Volume) : 1;
float val = IsPlayBGM ? volume : 0;
SoundVolumeBGM = val;
//Log.Error(IsPlayBGM.ToString());
IsPlayBGM = LocalDataSave.Instance.HasKey(LocalDataSave.Instance.Int_SE_Open) ? (LocalDataSave.Instance.GetIntData(LocalDataSave.Instance.Int_SE_Open) == 1) : true;
volume = LocalDataSave.Instance.HasKey(LocalDataSave.Instance.Float_SE_Volume) ? LocalDataSave.Instance.GetFloatData(LocalDataSave.Instance.Float_SE_Volume) : 1;
val = IsPlaySE ? volume : 0;
SoundVolumeSE = val;
//Log.Error(IsPlaySE.ToString());
}
public float SoundVolumeBGM
{
set
{
_SoundVolumeBGM = value;
AkSoundEngine.SetGameObjectOutputBusVolume(listenerBGM, listenerBGM, value);
}
get
{
return _SoundVolumeBGM;
}
}
public float SoundVolumeSE
{
set
{
_SoundVolumeSE = value;
AkSoundEngine.SetGameObjectOutputBusVolume(listenerSE, listenerSE, value);
}
get
{
return _SoundVolumeSE;
}
}
#region 解析xml
private void InitXML()
{
WWW www = new WWW(PathManager.WwiseFilePath() + "SoundbanksInfo.xml");
while (!www.isDone)
{
}
if (string.IsNullOrEmpty(www.error))
{
XmlDocument XmlDoc = new XmlDocument();
XmlDoc.LoadXml(www.text);
//首先获取xml中所有的SoundBank
XmlNodeList soundBankList = XmlDoc.GetElementsByTagName("SoundBank");
foreach (XmlNode node in soundBankList)
{
XmlNode bankNameNode = node.SelectSingleNode("ShortName");
string bankName = bankNameNode.InnerText;
//判断SingleNode存在与否,比如Init.bak就没这个
XmlNode eventNode = node.SelectSingleNode("IncludedEvents");
if (eventNode != null)
{
//拿到其中所有的event做一个映射
XmlNodeList eventList = eventNode.SelectNodes("Event");
foreach (XmlElement x1e in eventList)
{
m_BankInfoDict.Add(uint.Parse(x1e.Attributes["Id"].Value), bankName);
}
}
}
}
else
{
Log.Error(www.error);
}
}
#endregion
public void ClearLaseBGMSoundID()
{
lastBGMSoundID = 0;
}
private uint lastBGMSoundID = 0;
private uint bGMPlayingID = 0;
public uint PlayBGMSound(uint soundID, AkCallbackManager.EventCallback AkCallback = null, object cookie = null)
{
if (listenerBGM == null)
{
Log.Error("BGM还未初始化");
return 0;
}
LoadSound(soundID);
if (lastBGMSoundID == soundID)
{
Log.Info("重复播放BGM,id==" + soundID);
return bGMPlayingID;
}
lastBGMSoundID = soundID;
bGMPlayingID = AkSoundEngine.PostEvent(soundID, listenerBGM, 1, AkCallback + AkCallbackBGM, cookie);
return bGMPlayingID;
}
private void AkCallbackBGM(object in_cookie, AkCallbackType in_type, AkCallbackInfo in_info)
{
lastBGMSoundID = 0;
}
private uint lastSESoundID = 0;
private uint sEPlayingID = 0;
public uint PlaySESound(uint soundID)
{
if (listenerSE == null)
{
Log.Error("SE还未初始化");
return 0;
}
LoadSound(soundID);
if (lastSESoundID == soundID)
{
Log.Info("重复播放SE,id==" + soundID);
return sEPlayingID;
}
lastSESoundID = soundID;
sEPlayingID = AkSoundEngine.PostEvent(soundID, listenerSE, 1, AkCallbackSE,null);
return sEPlayingID;
}
private void AkCallbackSE(object in_cookie, AkCallbackType in_type, AkCallbackInfo in_info)
{
lastSESoundID = 0;
}
#region 加载SoundBank
private bool LoadSound(uint soundID)
{
if (soundID == 0)
{
Log.Error("soundID不能为0");
return false;
}
string bankName;
if (!m_BankInfoDict.TryGetValue(soundID, out bankName))
{
Log.Error(string.Format("加载event({0})失败,没有找到所属的SoundEvent", soundID));
return false;
}
if (!m_LoadBankList.Contains(bankName))
{
//加载SoundBank
AkBankManager.LoadBank(bankName, false, false);
m_LoadBankList.Add(bankName);
}
return true;
}
#endregion
/// <summary>
/// 根据ID停止声音
/// </summary>
/// <param name="id"></param> playingid
/// <param name="dura"></param> duration time
public void StopPlayingID(uint id,int dura = 0)
{
AkSoundEngine.StopPlayingID(id, dura);
if(id == bGMPlayingID)
{
lastBGMSoundID = 0;
}
if (id == sEPlayingID)
{
lastSESoundID = 0;
}
}
public void StopBMGSound()
{
AkSoundEngine.StopAll(listenerBGM);
lastBGMSoundID = 0;
}
public void StopSESound()
{
AkSoundEngine.StopAll(listenerSE);
lastSESoundID = 0;
}
public void StopAll()
{
StopBMGSound();
StopSESound();
}
//看剧情长短或者篇章考虑下需要不需要清理bank吧
public void ClearBanks()
{
AkSoundEngine.ClearBanks();
m_LoadBankList.Clear();
lastBGMSoundID = 0;
lastSESoundID = 0;
}
}
至于使用方法比较简单
简单播放例子
以上是wwise一个比较简单的使用,如果要3d音效这样的还需要自己去深入了解这个插件.
这个是带回调函数的例子
调用stop函数的时候这个回调函数一样会执行.
另外提一句插件东西比较多,能删的都尽量删掉,我就留下了以下
后续还会把windows文件夹删除
作者:鹿在狡黠
链接:https://www.jianshu.com/p/6279e0142f8c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Unity项目接入Wwise相关推荐
- Unity项目接入IOS的Admob Native(原生视频广告) IOS SDK
实现的功能与Unity项目接入Android的Admob Native(原生视频广告) SDK(二.AS导出aar)相同,但IOS的操作与Android完全不同,接入IOS的SDK大概实现流程是: 1 ...
- Unity项目接入Steam的SDK
1. 登录开发者帐号,去steam下载steamworks_sdk 2. 解压放入文件夹中(假设放在D盘根目录下steamworks_sdk),注意(steam works不支持文件路径之中带有空格( ...
- Unity游戏接入TypeSDK集成笔记
前言: 这是一个unity小程序猿使用typesdk给公司项目接入各渠道游戏联运sdk的使用笔记,说是笔记是因为从接触这个聚合工具到接入项目中并且将项目上线到渠道(目前已上线oppo,huawei,a ...
- Unity如何接入应用内购In-AppPurchase
一.前言 很多游戏需要接入内购IAP,对于苹果端,我们直接对接苹果就行了,但是android平台太多,国内,我们需要接入支付宝,微信,或者华为支付,小米支付等.国外,我们需要接入谷歌支付,亚马逊等等, ...
- 【Unity】【Wwise】在Unity中获取某个Wwise事件的持续时间
[Unity][Wwise]在Unity中获取某个Wwise事件的持续时间 解决方案 注意事项 边边角角 小吐槽 有一次接到这么一个需求:要在界面上显示出一段人物语音的长度,并且在播放的时候进行倒计时 ...
- 【steam接入】如何将unity游戏接入steam(steamworks)
使用Steamworks.NET,请确保成为steam的开发者(要在steam提交游戏,需要一次性缴纳100美元费用) sdk地址:http://steamworks.github.io/instal ...
- unity 项目实践经验 和 架构体系
GameRes游资网授权发布 文 / 吴秦(Tyler) 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身.虽然基于Unity3D,很多东西同样适用于Cocos.本文从以下10大点进行阐述: ...
- Unity项目导入Android Studio项目 --Androis Studio小白
前言:Unity项目,项目需求接入推送SDK,选择的是 友盟的U-Push SDK.在Android Studio接入SDK后再把unity项目打包导入Android Studio.本篇主要讲述如何将 ...
- android打包jar包给unity使用接入高德sdk,实现定位。
https://blog.csdn.net/unity_http/article/details/79929454 https://blog.csdn.net/why1happy/article/de ...
最新文章
- CCF-CSP 201903-2 二十四点 Python语言 模拟栈实现
- 进入保护模式(二)——《x86汇编语言:从实模式到保护模式》读书笔记14
- C#关于电脑DPI改动显示的问题
- C语言之指针与数组总结
- 计算机网络对我们思维的影响,计算机网络教学中学生计算思维的培养
- 使用yum更新补丁包
- TortoiseGit 添加ssh key
- php视频教程bt下载,LAMP 兄弟连原创视频光盘镜像下载—精品PHP Linux高清WMV格式视频教程全集...
- qq同步android 2.2,支持手机号注册!Android QQ同步助手2.1发布
- Elasticsearch Refresh vs Flush
- antd input框获取焦点点击输入历史保存的值后,背景颜色变成淡蓝色解决方法,输入框获取焦点后边框会有一圈淡蓝色光边
- saas系统分几种类型
- 软件开发质量改进措施_改进可能是软件开发人员面临的最大挑战,因此我们该如何做...
- 10大常见反人类设计:产品经理你的良心不会痛吗
- 海兰云发布海底数据中心(UDC)解决方案
- Unity动态加载和内存管理(三合一)
- C语言 用字符串打印ASCII码值
- 计算机网络设备安装检验批,智能建筑工程分为哪些子分部工程与分项工程
- Jetson Nano从USB外部存储设备启动系统
- 流量背后的生意经,“达人营销”能否带来捷径?
热门文章
- .NET作业调度 Quartz.NET
- 双智机器人 珠海_甄少强:美的机器人“双智”战略正当时
- [zotero] PDF translate 有道智云API接入
- [Excel 工具] 求和公式不生效使用+小图标
- elisa数据处理过程图解_图解ELISA试剂盒的结果处理方法
- UML 2.5的14种图术语和解释
- 二进制安装mysql及MySQL增删改查
- AUTOSAR从入门到精通-【应用篇】基于Vector工具链车载总线自动化测试平台的研究与开发
- TCP四层模型及各层的作用
- 电商扣减库存_做采购的您怎么能不懂电商仓储管理呢?