Exemplo n.º 1
0
    //获取播放器
    private AudioData GetAudioSource(string type, AudioSpaceType spaceType, AudioCreateType createType, AudioReleaseType releaseType, GameObject targetObj, float maxRange, bool isLoop)
    {
        //获取指定type的数据
        AudioTypeData data = GetAudioTypeData(type);
        //获取播放器
        AudioData audioData = null;

        //寻找空闲播放器
        bool bFree = false;

        for (int i = 0; i < data.mAudioDataList.Count; i++)
        {
            if (createType == AudioCreateType.eOnly)
            {
                if (data.mAudioDataList[i].mCreateType == createType)
                {
                    bFree     = true;
                    audioData = data.mAudioDataList[i];
                    if (audioData.mAudioState == AudioSourceState.ePlaying)
                    {
                        StopAndDisposeAudioByID(audioData.mID);
                        audioData.mAudioState = AudioSourceState.eReady;
                    }
                    break;
                }
            }
            else if (createType == AudioCreateType.eNew)
            {
                if (!data.mAudioDataList[i].mAudioSource.isPlaying &&
                    data.mAudioDataList[i].mAudioState == AudioSourceState.eIdel &&
                    data.mAudioDataList[i].mSpaceType == spaceType &&
                    data.mAudioDataList[i].mCreateType == createType)
                {
                    bFree                              = true;
                    audioData                          = data.mAudioDataList[i];
                    audioData.mAudioState              = AudioSourceState.eReady;
                    audioData.mFollowObj               = targetObj;
                    audioData.mAudioSource.loop        = isLoop;
                    audioData.mAudioSource.maxDistance = maxRange;
                    break;
                }
            }
        }

        //没有空闲,创建新的
        if (!bFree)
        {
            audioData = CreateAudioData(type, spaceType, createType, releaseType, data, targetObj, maxRange, isLoop);
            data.mAudioDataList.Add(audioData);
            mAudioDataMap[audioData.mID] = audioData;
        }
        return(audioData);
    }
Exemplo n.º 2
0
    private AudioSource GetAudioSource(string name, AudioCreateType audioCreateType, GameObject fromPosition, bool loop, float e3d = 0f, float maxRange = 0f)
    {
        AudioClip clip = Resources.Load <AudioClip>("Music/" + name);

        if (audioCreateType == AudioCreateType.ONLY)
        {
            if (bgm == null)
            {
                bgm = fromPosition.AddComponent <AudioSource>();
            }
            else
            {
                if (bgm.isPlaying)
                {
                    bgm.Stop();
                }
            }

            bgm.clip         = clip;
            bgm.spatialBlend = e3d;
            bgm.loop         = loop;

            return(bgm);
        }
        else
        {
            bool bFree = false;
            int  i;
            for (i = 0; i < mID; ++i)
            {
                if (!sounds[i].isPlaying)
                {
                    bFree = true;
                    break;
                }
            }
            if (!bFree)
            {
                AudioSource newSource = fromPosition.AddComponent <AudioSource>();
                sounds.Add(newSource);
                mID++;
            }

            sounds[i].clip               = clip;
            sounds[i].loop               = loop;
            sounds[i].spatialBlend       = e3d;
            sounds[i].maxDistance        = maxRange;
            sounds[i].transform.position = fromPosition.transform.position;

            return(sounds[i]);
        }
    }
Exemplo n.º 3
0
    //创建播放器(新增类型要修改这里)
    private AudioData CreateAudioData(string type, AudioSpaceType spaceType, AudioCreateType createType, AudioReleaseType releaseType, AudioTypeData data, GameObject targetObj, float maxRange, bool isLoop)
    {
        AudioData audioData = new AudioData();

        audioData.mID          = mID++;
        audioData.mFollowObj   = targetObj;
        audioData.mTimerID     = 0;
        audioData.mAudioState  = AudioSourceState.eReady;
        audioData.mType        = type;
        audioData.mSpaceType   = spaceType;
        audioData.mCreateType  = createType;
        audioData.mReleaseType = releaseType;
        audioData.mLoop        = isLoop;
        audioData.mMaxRange    = maxRange;

        GameObject obj = new GameObject();

        obj.transform.SetParent(transform, false);
        obj.name = type.ToString() + audioData.mID;
        audioData.mAudioSource        = obj.AddComponent <AudioSource>();
        audioData.mAudioSource.mute   = data.IsMute;
        audioData.mAudioSource.volume = data.Volume;

        if (spaceType == AudioSpaceType.e2D)
        {
            audioData.mAudioSource.spatialBlend = 0.0f;
            audioData.mAudioSource.loop         = isLoop;
        }
        else if (spaceType == AudioSpaceType.e3D)
        {
            audioData.mAudioSource.spatialBlend = 1.0f;
            audioData.mAudioSource.maxDistance  = maxRange;
            audioData.mAudioSource.minDistance  = 0;
            audioData.mAudioSource.loop         = isLoop;
            audioData.mAudioSource.rolloffMode  = AudioRolloffMode.Linear;
            if (targetObj != null)
            {
                obj.transform.position = targetObj.transform.position;
            }
        }

        return(audioData);
    }
Exemplo n.º 4
0
    //播放音效
    //type 音频类型
    //spaceType 空间类型(2D或者3D)
    //createType 创建类型(eOnly:唯一播放器  eNew : 多个播放器)
    //name 音频名字
    //delayTime 延时时间
    //obj 3d音效需要指定obj对象
    //maxRange 3D音效的最大范围
    //isLoop 是否循环
    public int PlayAudio(string type, string name, bool isLoop = false, float delayTime = 0.0f,
                         AudioCreateType createType            = AudioCreateType.eOnly,
                         AudioSpaceType spaceType     = AudioSpaceType.e2D,
                         AudioReleaseType releaseType = AudioReleaseType.eAuto,
                         GameObject obj = null, float maxRange = 0.0f)
    {
        if (string.IsNullOrEmpty(name))
        {
            return(-1);
        }

        //获取播放器
        AudioData audioData = GetAudioSource(type, spaceType, createType, releaseType, obj, maxRange, isLoop);

        //加载音频,然后播放音频
        GetAudioClip(name, (audioClip) =>
        {
            if (audioClip == null)
            {
                return;
            }

            audioData.mAudioSource.clip        = audioClip;
            audioData.mAudioSource.playOnAwake = false;
            if (Mathf.Abs(delayTime) < Mathf.Epsilon)
            {
                audioData.mAudioSource.Play();
                audioData.mAudioState = AudioSourceState.ePlaying;
            }
            else
            {
                audioData.mTimerID = TimerManager.Instance.AddTimer(delayTime, 1, () =>
                {
                    audioData.mAudioSource.Play();
                    audioData.mAudioState = AudioSourceState.ePlaying;
                    audioData.mTimerID    = 0;
                });
            }
        });

        return(audioData.mID);
    }
Exemplo n.º 5
0
    //会过滤掉同一帧重复播放的音乐
    private void PlayAudioFilter(string type, string name, bool isLoop = false, float delayTime = 0.0f,
                                 AudioCreateType createType            = AudioCreateType.eOnly,
                                 AudioSpaceType spaceType     = AudioSpaceType.e2D,
                                 AudioReleaseType releaseType = AudioReleaseType.eAuto,
                                 GameObject obj = null, float maxRange = 0.0f)
    {
        if (mCurFrameCount != Time.frameCount)
        {
            mCurFrameCount = Time.frameCount;
            mCurFramePlayList.Clear();
        }
        else
        {
            //阻止同一帧多次播放相同的音频
            int index = mCurFramePlayList.FindIndex((item) => { return(item == name); });
            if (index != -1)
            {
                return;
            }
        }

        PlayAudio(type, name, isLoop, delayTime, createType, spaceType, releaseType, obj, maxRange);
    }