昨天写了一篇关于将麦克风的音频变成可视化的音波 今天我就来把那个音波变成柱状的 -----------类卡拉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 initializationvoid 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;}}
}
总之呢,,就是将音频的值和物块的放大缩小相关连 效果就出来了 随后可以将文件分享出来
上几张效果图给大家看看 由于没有美术 毕竟我们看的是功能对吧。
为了让它比较真实。。。。加了一个水面的特效
物块要改成自发光的
为了让它比较真实。。。。加了一个水面的特效