Unity获取麦克风实现吹气球效果

2 篇文章 0 订阅

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

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值