最近做了个吹气球的案例,远离就是获取设备的麦克风,对声音进行采样,我这里是手机测试。实现了吹气气球不断变大的效果。
直接上代码,工程源码文件我分享一个百度云地址。我的Unity版本是2018.2.1,手机测试时安卓。
项目工程地址:https://pan.baidu.com/s/15gK88rMI2yD0nZq3hJHTvQ
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class Audio : MonoBehaviour {
public Text text;
public AudioSource Myaudio;
public AudioSource QiqiuAudio;
public AudioSource BaozhaAudio;
float timer = 0;
public string sFrequency = "44100";
public GameObject prefab;
public GameObject Qiqiu;
public float Speed = 1;
float scale = 0;
bool IsBaozha = false;
// Use this for initialization
void Start () {
if (Application.isEditor)
return;
StartRecord();
StartCoroutine("Wait");
}
IEnumerator Wait()
{
yield return new WaitForSeconds(0.25f);
if (Volume > 10)
{
scale += 0.1f*Speed;
offset += 1.5f;
if (scale <= 1)
Qiqiu.transform.localScale = new Vector3(1+scale, 1+scale, 1+scale);
//爆炸
else
{
StopCoroutine("Wait");
IsBaozha = true;
StartCoroutine(BaoZhaEffect());
}
if (offset < 15)
{
if(Random.Range(0,1.0f)>0.5f)
StartCoroutine(RoateAndMove(offset, 0.15f));
else
StartCoroutine(RoateAndMove(offset, -0.15f));
}
else
offset = 0;
}
if(!IsBaozha)
StartCoroutine(Wait());
}
//场景一开始就开启录音功能
void StartRecord()
{
Myaudio.Stop();
Myaudio.loop = true;
Myaudio.mute = false;
Myaudio.clip = Microphone.Start(null, true, 1, int.Parse(sFrequency));
while (!(Microphone.GetPosition(null) > 0))
{
}
}
float offset = 0;
// Update is called once per frame
void Update () {
if(!Application.isEditor)
text.text = Volume.ToString();
if(Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(RoateAndMove(offset, 0.15f));
}
}
IEnumerator RoateAndMove(float offset,float timer)
{
Vector3 right, left, center;
right = new Vector3(0, 0, -offset);
left = new Vector3(0, 0, offset);
center = Vector3.zero;
Qiqiu.transform.DOLocalRotate(right, timer);
yield return new WaitForSeconds(timer);
Qiqiu.transform.DOLocalRotate(center, timer);
yield return new WaitForSeconds(timer);
Qiqiu.transform.DOLocalRotate(left, timer);
yield return new WaitForSeconds(timer);
Qiqiu.transform.DOLocalRotate(center, timer);
}
IEnumerator BaoZhaEffect()
{
QiqiuAudio.Play();
Qiqiu.transform.DOScale(Vector3.one, 0.2f);
yield return new WaitForSeconds(0.2F);
if(!BaozhaAudio.isPlaying)
BaozhaAudio.Play();
prefab.SetActive(false);
prefab.SetActive(true);
Qiqiu.SetActive(false);
}
public float Volume
{
get
{
if (Microphone.IsRecording(null))
{
// 采样数
int sampleSize = 128;
float[] samples = new float[sampleSize];
int startPosition = Microphone.GetPosition(null) - (sampleSize + 1);
// 得到数据
this.Myaudio.clip.GetData(samples, startPosition);
// Getting a peak on the last 128 samples
float levelMax = 0;
for (int i = 0; i < sampleSize; ++i)
{
float wavePeak = samples[i];
if (levelMax < wavePeak)
levelMax = wavePeak;
}
return levelMax * 99;
}
return 0;
}
}
public void ResetOnclck()
{
Qiqiu.SetActive(true);
Qiqiu.transform.localScale = Vector3.one;
scale = 0;
offset = 0;
IsBaozha = false;
StartCoroutine("Wait");
}
}