unity获取麦克风音量_Unity获取麦克风实现吹气球效果

本文介绍了如何在Unity中利用麦克风音量来实现吹气球的效果。通过获取设备的麦克风输入,实时调整气球的大小,当声音超过一定阈值时触发爆炸动画。提供了完整的Unity工程源码供下载参考。
摘要由CSDN通过智能技术生成

最近做了个吹气球的案例,远离就是获取设备的麦克风,对声音进行采样,我这里是手机测试。实现了吹气气球不断变大的效果。

直接上代码,工程源码文件我分享一个百度云地址。我的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");

}

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值