昨天写了一篇关于将麦克风的音频变成可视化的音波 今天我就来把那个音波变成柱状的 -----------类卡拉OK的效果
本文将详细的介绍这一功能的实现,并对上一篇文档进行解析。
首先:在Start的时候开始录音,
开始之前要记录使用的设备的麦克风, 音频采样率自行百度
Microphone.Start
的使用可以去Unity官网查询有关API文档
public AudioClip micRecord;
string device;//记录设备的麦克风名称
void Start()
{
device = Microphone.devices[0];
micRecord = Microphone.Start(device, true, 999, 44100);//999 录音时长 44100音频采样率
}
下面要处理在每一帧麦克风所录制的声音,并保存到一个baty数组内
void Update()
{
volume = GetMaxVolume();
}
音频处理:
float GetMaxVolume()
{
float maxVolume = 0f;
float[] volumeData = new float[120];
int offset = Microphone.GetPosition(device) - 120 + 1;
if (offset < 0)
{
return 0;
}
micRecord.GetData(volumeData, offset);
for (int i = 0; i < 120; i++)
{
float tempMax = volumeData[i] * volumeData[i];//修改麦克风对声音的敏感度可以自行调整,,,想不敏感就乘volumeData[i]就行了,反之就去掉
//这个if是用来取记录的音频的一部分 和你所加的物体有关 下面有效果图展示
if (i % 4 == 0)
{
f = i / 4;
ButtonAudio.instance.obj[f].gameObject.transform.localScale = new Vector3(1, volumeData[i] * 30 + 0.5f, 1);//将可视化的物体和音波相关联
}
}
return maxVolume;
}
到此,,音频处理结束
下面是处理物块的代码;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ButtonAudio : MonoBehaviour
{
public GameObject[] obj;
public static ButtonAudio instance;
public float Role;//旋转角度
public float r;//半径
public int d;//物块个数
private void Awake()
{
//print(Mathf.Sqrt(9));
instance = this;
}
// Use this for initialization
void Start()
{
Role = 360.0f / d;
print(Role.ToString());
obj = new GameObject[d];
for (int i = 0; i < d; i++)
{
Object gameObject = Resources.Load("Audio", typeof(GameObject));
GameObject Audio = Instantiate(gameObject) as GameObject;
Audio.transform.parent = transform;
Audio.gameObject.transform.position = Vector3.zero;
Audio.gameObject.transform.localRotation = Quaternion.identity;
Audio.gameObject.transform.localScale = Vector3.one;
Audio.gameObject.transform.Rotate(new Vector3(0, Role * i, 0));
Audio.gameObject.transform.Translate(Vector3.forward * r);
Audio.name = i.ToString();
obj[i] = Audio;
}
}
}
总之呢,,就是将音频的值和物块的放大缩小相关连 效果就出来了 随后可以将文件分享出来
上几张效果图给大家看看 由于没有美术 毕竟我们看的是功能对吧。
为了让它比较真实。。。。加了一个水面的特效
物块要改成自发光的
为了让它比较真实。。。。加了一个水面的特效