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:码 ...
随机推荐
- 纯CSS如何实现状态圆点
.circle { display: inline-block; width: 12px; height: 12px; } .circle:after { content: ''; margin: 3 ...
- Javascript 随机显示数组元素
$(function(){ var wx_arr = ['gb3055','gb6365']; var storage = window.localStorage; function random_w ...
- 网络聚合Network Teaming
team是新的聚合软件,依赖于安装包teamd,可以通过nmcli管理. team和bond的区别在于,支持hash加密,支持负载均衡,支持8块网卡,更好地支持IPV6,总之要取代bond. 1. 添 ...
- TensorFlow笔记——关于MNIST数据的一个简单的例子
这个程序参考自极客学院. from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf # MN ...
- MySQL连接查询驱动表被驱动表以及性能优化
准备我们需要的表结构和数据 两张表 studnet(学生)表和score(成绩)表, 创建表的SQL语句如下 CREATE TABLE `student` ( `id` int(11) NOT NUL ...
- C#数据结构与算法系列(四):链表——单链表(Single-LinkedList)
1.介绍: 链表是有序的列表,但是它在内存的存储如下: 链表是以节点的方式来存储,链式存储 每一个节点包含data域,next域:指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表 ...
- Android学习笔记物理按键事件处理
常见的物理按键: Android为每个物理按键都提供了如下几个回调方法: 代码示例: package com.example.demo3; import androidx.appcompat.app. ...
- 网站用https访问的问题
网站挂到阿里云上, 可以http访问, 也可以https访问. 但是如果用https方式访问网站.发现接口报错. 因为接口只提供http方式. 在谷歌浏览器出现: Mixed Content: The ...
- 阿里面试官最喜欢问的21个HashMap面试题
1.HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过 8 时,链表转换为红黑树. transient Node<K,V>\[\ ...
- 「从零单排canal 03」 canal源码分析大纲
在前面两篇中,我们从基本概念理解了canal是一个什么项目,能应用于什么场景,然后通过一个demo体验,有了基本的体感和认识. 从这一篇开始,我们将从源码入手,深入学习canal的实现方式.了解can ...