unity简单的脚本 播放3D立体音效(近大远小效果)

自制简单的3D音效播放脚本

使用如下
新建场景,
新建空对象,挂载测试脚本testEasyAudio_3D
在这里插入图片描述

 public class TestEasyAudio_3D : MonoBehaviour
    {
        AudioListener audioListener;

        GameObject leftAudio, rightAudio;
        private void Awake()
        {
            audioListener = FindObjectOfType<AudioListener>();
            if (audioListener)
            {
                print("find listener");
            }

            leftAudio = new GameObject();
            leftAudio.transform.position = audioListener.transform.position + new Vector3(-15, 0, 0);

            rightAudio = new GameObject();
            leftAudio.transform.position = audioListener.transform.position + new Vector3(15, 0, 0);
        }

        private void Update()
        {
            if (Input .GetKeyDown (KeyCode.A))
            {
                EasyAudio_3D.PlayAudio_3D("testAudio", leftAudio);
            }
            if (Input.GetKeyDown(KeyCode.D))
            {
                EasyAudio_3D.PlayAudio_3D("testAudio", rightAudio);
            }
        }
    }

上代码

/********************************************************
     文件: AudioManager.cs
     作者: 阿飞
     日期: CreateTime
     寄语: 虎年 虎虎生威  大吉大利
     功能: Nothing
*********************************************************/


using System.Collections.Generic;
using UnityEngine;


public class EasyAudio_3D
{
    

    /// <summary>
    /// 能听到声音的最远距离
    /// </summary>
    private const float maxDistance = 30;


    private static bool isDebug = true;


    /// <summary>
    /// 加载内存中的音频文件
    /// </summary>
   static Dictionary<string, AudioClip> audioClipDic = new Dictionary<string, AudioClip>();



    /// <summary>
    /// 不固定父物体的音频播放器
    /// </summary>
  static  List<AudioSource> audioSources_3d = new List<AudioSource>();

  
    public static void PlayAudio_3D(string audioName, Transform pos, bool follow = false)
    {
        //找到播放组件
        AudioSource tmpAudio =GetFreeAudioSource();

        //找到音频文件
        AudioClip tmpClip;

        if (audioClipDic.ContainsKey(audioName))
        {
            tmpClip = audioClipDic[audioName];
        }
        else
        {
            tmpClip = Resources.Load<AudioClip>(audioName);
            //保存音效
            audioClipDic.Add(audioName, tmpClip);
        }

        //设置音效位置
        if (follow)
        {
            tmpAudio.gameObject.transform.parent = pos;
            tmpAudio .transform.localPosition = Vector3.zero;
        }
        else
        {
            tmpAudio.gameObject.transform.position = pos.position;
        }
       
        //播放音效
        tmpAudio.PlayOneShot(tmpClip);

        if (isDebug)
        {
            Debug.Log(string.Format("音效播放完成\n总Audio数为:{0}", audioSources_3d.Count.ToString ()));
        }

    }


    /// <summary>
    /// 获得一个空闲的audioSource
    /// </summary>    
    private static AudioSource GetFreeAudioSource()
    {
        foreach (var item in audioSources_3d)
        {
            if (! item .isPlaying )
            {
                return item;
            }
        }
        return AddAudioSource_3D();
    }

    /// <summary>
    /// 添加3D声音播放组件
    /// </summary> 
    private static AudioSource AddAudioSource_3D()
    {
        GameObject audioObj = new GameObject();
        audioObj.name = "easyAudio_3D";
        audioObj.transform.localPosition = Vector3.zero;
        AudioSource audioSource = audioObj.AddComponent<AudioSource>();

        //设置audio参数
        audioSource.spatialBlend = 1;//3D效果
                                     //设置为3D效果
        audioSource.maxDistance = maxDistance;
        //线性衰减
        audioSource.rolloffMode = AudioRolloffMode.Linear;

        audioSources_3d.Add(audioSource);

        return audioSource;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值