Unity音量可视化——粒子随声浪跳动
起初是看到这么一篇博客 Shader特效—— 音符跳动,效果如下图

具体的shader代码就不贴在这里了,他的博客里都有。
处理音频的关键代码如下:
private int m_NumSamples = 256;
private float[] m_Samples;
private float sum, rms;
private void Start()
{
audioSource = GetComponent<AudioSource>();
BeginListener(0);
//audioSource.clip = Microphone.Start(null, true, 10, 44100);
m_Samples = new float[m_NumSamples];
}
private void Update()
{
audioSource.GetOutputData(m_Samples, 0);
sum = m_Samples[m_NumSamples - 1] * m_Samples[m_NumSamples - 1];
rms = Mathf.Sqrt(sum/* / m_NumSamples*/);
float intensity = rms;
Debug.Log(intensity);
if (intensity > bootIntensity)
{
//change in shader
material.SetFloat("_Intensity", intensity);
}
else
{
material.SetFloat("_Intensity", 0);
}
}
那么能不能用到粒子效果上呢,查了一下API果然不难做到。
脚本控制粒子
这里用一个球状发射的粒子模块来做示例:

我希望粒子随着音乐发射,音量越大数量越多,于是乎我们需要在脚本内通过检测音量来改变 Emission 模块的 Rate over Time 值(只是举个例子,当然有其他更漂亮的实现)
一开始我盲写,果然有 rateOverTime 这个值,但是Unity不允许我直接更改。

查了下 API-ParticleSystem.EmissionModule 后发现不能直接用脚本赋值,而是需要实例化之后赋值:
var emission = m_ParticleSystem.emission;
emission.rateOverTime = 100f;
那么事情就好办了,复用上面的脚本代码就可以控制粒子了:
private void Update()
{
var emission = m_ParticleSystem.emission;
audioSource.GetOutputData(m_Samples, 0);
sum = m_Samples[m_NumSamples - 1] * m_Samples[m_NumSamples - 1];
rms = Mathf.Sqrt(sum/* / m_NumSamples*/);
float intensity = rms;
Debug.Log(intensity);
if (intensity > bootIntensity)
{
emission.rateOverTime = 10f * (1 + intensity * 1000);
}
else
{
emission.rateOverTime = 10f;
}
}
接入Mic
Unity给的接口很方便,在脚本中开启Mic即可,具体代码如下:
private void Start()
{
audioSource = GetComponent<AudioSource>();
BeginListener(0);
//audioSource.clip = Microphone.Start(null, true, 10, 44100);
m_Samples = new float[m_NumSamples];
}
......
public void BeginListener(int index)
{
int min = 0;
int max = 0;
Microphone.GetDeviceCaps(Microphone.devices[index], out min, out max);
audioSource.clip = Microphone.Start(Microphone.devices[index], true, 2, max);
while (!(Microphone.GetPosition(Microphone.devices[index]) > 1))
{
// Wait until the recording has started
}
audioSource.loop = true;
audioSource.Play();
}
对着Mic吼的效果如下:

不建议在办公室吼,吹气也可以达到这样的效果。
本人不太熟悉粒子系统,有兴趣的朋友可以自己实现更多更酷的特效。
Unity音量可视化——粒子随声浪跳动的更多相关文章
- Unity:控制粒子特效的移动方向
前几天在项目中遇到一个问题,需求是界面中先展示一段闪光特效,停顿一段时间后特效飞往一个固定的位置然后消失,类似于跑酷游戏吃到金币后金币飞往固定的金币数值显示框那种效果(具体是通过特效来实现还是直接通过 ...
- Unity中的粒子特效的 RendererQ 排序
这里接https://www.cnblogs.com/luguoshuai/p/10021660.html 这里介绍两套粒子排序的方法. 首先声明,这两套排序方法均不是本人所写,是在项目开发的过程当中 ...
- unity音量设置(同时设置到多个物体上)——引伸语言设置
在游戏中游戏设置是一个很重要的功能,但是比如语言设置和音量设置分散在很多个物体的组件上,如果每个对应的物体都放到一个链表里,会导致程序雍总难堪,使用事件调用是最好的方式 音量存储类 SoundMana ...
- unity拖尾粒子问题
拖尾粒子有一个问题就是当设置父物体时候,拖动父物体,就没有拖尾效果了 此时只需设置Emitter Velocity的类型为 transform 就行了 还有一种设置simulation space类型 ...
- unity监听粒子播放结束
需要在粒子上挂脚本 脚本添加代码 public void OnParticleSystemStopped() { Debug.Log("粒子停止"); } 这是个生命周期 粒子的 ...
- Unity Gizmos可视化辅助工具
所有gizmo绘制需要在脚本的OnDrawGizmos或OnDrawGizmosSelected里函数完成. OnDrawGizmos在每帧调用.所有在OnDrawGizmos中渲染的gizmos都是 ...
- Unity安卓共享纹理
前置知识:安卓集成Unity开发示例 本文的目的是实现以下的流程: Android/iOS native app 操作摄像头 -> 获取视频流数据 -> 人脸检测或美颜 -> 传输给 ...
- unity常用插件
Unity3D常用插件,网址:http://jingyan.baidu.com/article/7f766daf4ef2844100e1d079.html ,想想自己也有小半年unity经验了,于是整 ...
- Unity相对于Cocos2d-x的比较
1.unity:Code in C# or js cocos:(Code in C++) 2.unity:可以让美工.动画.码农在同一个平台上各司其职(一起玩) cocos:码 ...
随机推荐
- go mod 与单元测试
目录 go mod 创建mod 默认模块名 指定模块名 引入其他模块 go 单元测试 创建源文件和测试文件 calc.go calc_test.go 运行测试用例 go mod 为解决go模块间的相互 ...
- 启动fiddler情况下,网络连接错误[Fiddler] The connection to ** failed.解决办法
这种错误是由于浏览器设置了代理,而代理服务器配置不正确导致 解决办法 1.关闭浏览器服务器代理,设置-高级-网络代理 2.检查网络代理设置是否正确,Fiddler中配置的端口号需要跟浏览器中配置的端口 ...
- kali系统安装后乱码的解决
1.先添加kaili的源地址*(这里推荐了几个源,选一个就可以.打开/etc/apt/sources.list 删除里面自带的所有内容,把你复制的内容添加进去保存就ok了) #中科大 deb http ...
- C语言视频教程下载(百万年薪程序员录制,免费公开)
<C/C++语言高性能服务开发基础>您可以自由下载.传播.发布或其它商业用途. 视频文件共13.6G,提供了QQ群文件和百度网盘两种方法,建议采用QQ群文件下载,速度较快. 一.下载方法 ...
- C++ 网教通直播刷屏反制 (思路启发)
前言 那些手动刷屏的你们弱爆了! 直播间的讨论区是用来讨论的, 下次谁再在上课时间大量刷屏,就以暴制暴! 思路启发 #define VK_CTRL 0x11 //... keybd_event(VK_ ...
- TensorFlow从0到1之TensorFlow常用激活函数(19)
每个神经元都必须有激活函数.它们为神经元提供了模拟复杂非线性数据集所必需的非线性特性.该函数取所有输入的加权和,进而生成一个输出信号.你可以把它看作输入和输出之间的转换.使用适当的激活函数,可以将输出 ...
- Android学习笔记通过Toast显示消息提示框
显示消息提示框的步骤 这个很简单我就直接上代码了: Button show = (Button)findViewById(R.id.show); show.setOnClickListener(new ...
- cb01a_c++_数据结构_顺序容器_STL_deque类
/*cb01a_c++_数据结构_顺序容器_STL_deque类deque是一个动态数组,比vector更加灵活.两者都属于动态数组deque与vector非常类似deque可以在数组开头和末尾插入和 ...
- .Net Core Configuration Etcd数据源
前言 .Net Core为我们提供了一套强大的Configuration配置系统,使用简单扩展性强.通过这套配置系统我们可以将Json.Xml.Ini等数据源加载到程序中,也可以自己扩展其他形 ...
- 3.kubernetes的CNI网络插件-Flannel
目录 1.1.K8S的CNI网络插件-Flannel 1.1.1.集群规划 1.1.2.下载软件.解压.软链接 1.1.3.最终目录结构 1.1.4.拷贝证书 1.1.5.创建配置 1.1.6.创建启 ...