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:码 ...
随机推荐
- npm run dev启动项目,electron提示throw new Error('Electron failed to install correctly, please delete node_modules/electron and try installing again')
npm run dev 项目,提示 throw new Error('Electron failed to install correctly, please delete node_modules/ ...
- 第一次使用Genymotion遇到的问题:for an unknown reson,VirtualBox DHCP has not assigned an IP address to virtual
解决方案:http://www.aiuxian.com/article/p-554135.html
- Vue3 新特性
一.vue3 为什么要重写 两个主要原因考虑重写vue新版本主要功能: 1.主流浏览器对新的JavaScript语言特性的普遍支持. 2.当前Vue代码库随着时间的推移而暴露出来的设计和体系架构问题. ...
- Android官方新推的DI库 Hilt
Android官方新推的DI库 Hilt Hilt是Google Android官方新推荐的依赖注入工具. 已加入到官方文档: Dependency injection with Hilt. 目前是a ...
- 第一个SpringMVC程序 (配置版)
通过配置版本的MVC程序,可以了解到MVC的底层原理,实际开发我们用的是注解版的! 1.新建一个普通Maven的项目,然后添加web的支持 2.导入相关的SpringMVC的依赖 3.配置web.xm ...
- 关于Api的那些事儿!
工作中一直在写Api数据接口,但大部分的Api都存在这样的问题 1.接口请求的地址和参数暴露 2.重要接口返回数据明文暴露 3.APP登录态请求的数据完全性问题 4.代码层的数据完全性问题(从代码层有 ...
- python基础001----Python+pycharm环境搭建
一.Python下载安装 1.python下载-----下载地址:https://www.python.org/downloads/windows/ 在python的官网下载python版本,需要下载 ...
- android中getWidth()和getMeasuredWidth()之间的区别
先给出一个结论:getMeasuredWidth()获取的是view原始的大小,也就是这个view在XML文件中配置或者是代码中设置的大小.getWidth()获取的是这个view最终显示的大小,这个 ...
- 个人工作用SQL短句,不定时更新
表字段操作 --一.修改字段默认值 alter table 表名 drop constraint 约束名字 ------说明:删除表的字段的原有约束 alter table 表名 add constr ...
- SpringMVC拦截器使用
源码地址 拦截器interceptor 拦截器是URL请求的第一道门,所有请求会先经过拦截器interceptor,然后再进入controller: 下面,记录一种通过注解方法拦截所有需要登录才能发起 ...