版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/n_moling/article/details/82804686
首先感谢 FransicZhang的博客,链接:https://blog.csdn.net/fransiczhang/article/details/78093131
下面获取输入音频及处理代码主要根据FransicZhang的博客所写:
/************************************************************
FileName: AudioVisualization.cs
Author:末零 Version :1.0 Date: 2018-9-21
Description:音频可视化
************************************************************/
using UnityEngine;
public class AudioVisualization : MonoBehaviour
{
public float speed = 20f;//速度
public float peak = 10;//峰值控制
public float volume;
private AudioClip micRecord;
private string device;
private float x;
private void Start()
{
device = Microphone.devices[0];//获取设备麦克风
micRecord = Microphone.Start(device, true, 999, 44100);
}
private void Update()
{
volume = GetMaxVolume();
transform.Translate(Vector3.right * speed * Time.deltaTime);
x = gameObject.transform.localPosition.x;
//处理峰值
if (volume > 0.9f)
{
volume = volume * speed * Time.deltaTime;
gameObject.transform.localPosition = new Vector3(x, volume * peak, 0);
}
else
{
gameObject.transform.localPosition = new Vector3(x, volume * peak, 0);
}
}
//每一振处理那一帧接收的音频文件
private float GetMaxVolume()
{
float maxVolume = 0f;
//剪切音频
float[] volumeData = new float[128];
int offset = Microphone.GetPosition(device) - 128 + 1;
if (offset < 0)
{
return 0;
}
micRecord.GetData(volumeData, offset);
for (int i = 0; i < 128; i++)
{
float tempMax = volumeData[i];//修改音量的敏感值
if (maxVolume < tempMax)
{
maxVolume = tempMax;
}
}
return maxVolume;
}
}
可以把这部分代码挂到一个GameObject上,并加上拖尾组件,便可实现音频曲线,前提是获取的麦克风权限,前面博客已有涉及。处理好音频部分,接下来的任务就是把它显示在界面上。
首先,写一个摄像机跟随脚本:
/************************************************************
FileName: CameraFollow.cs
Author:末零 Version :1.0 Date: 2018--
Description:摄像机跟随
************************************************************/
using UnityEngine;
public class CameraFollow: MonoBehaviour {
public Transform target;
private float distance = 59;
private void OnEnable()
{
distance = transform.position.x - target.position.x;
}
private void Update ()
{
transform.position = new Vector3(target.position.x + distance, transform.position.y, transform.position.z);
}
}
然后通过RenderTexture显示在UI界面上。