Unity 音乐播放全局类

今天晚了LOL, 发现里面的声音系统做得很不错,于是最近就写了一份反正以后也用的到,2D音乐全局播放.

项目跟PoolManager对象池插件结合了.

解决的问题:

1. 已经播放的声音,可以马上暂停或者减少音量等等

2. 实现音乐全局控制

3. 音乐和音效分开控制

4. 音乐重叠播放

类如下:

AudioShot 音乐实体类

SoundController 全局音乐控制类

SoundPanel 音乐面板

代码如下:

AudioShot实体类:

using UnityEngine;
using System.Collections;

public class AudioShot : MonoBehaviour {
    public AudioSource audioSource;
    public string audioName;
}

SoundController类:

using UnityEngine;
using System.Collections;
using PathologicalGames;
using System.Collections.Generic;

/*
 * 2D音乐播放全局控制类
 * 如果有音乐已经在播放了,改变声音大小,或者停止播放
 * 可控制已经在播放的音乐马上暂停,或改变当前的音量
 */
public class SoundController : MonoBehaviour {

    private float fxVolume = 1;              //音效声音大小
    private float musicVolume = 1;           //音乐声音大小

    private bool isPlayFxVolume = true;      //是否播放音效声音
    private bool isPlayMusicVolume = true;   //是否播放音乐声音

    public AudioClip[] fxClip;
    public AudioClip[] musicClip;

    private SpawnPool audioSpwan;               //音乐游戏物体池
    private List<AudioSource> fxAudioList;      //为了控制已经播放的音乐,需要记录他们的引用
    private List<AudioSource> musicAudioList;
    public static SoundController instance;
    private int audioCount;                     //音乐下标值计时器

    public void Awake()
    {
        audioSpwan = PoolManager.Pools["Audio"];
        fxAudioList = new List<AudioSource>();
        musicAudioList = new List<AudioSource>();
        instance = this;
    }

    /// <summary>
    /// 播放音效不可重叠播放
    /// </summary>
    /// <param name="name"></param>
    public void PlayFxSound(string name)
    {
        if (isPlayFxVolume)
        {
            for (int i = 0; i < fxClip.Length; i++)
            {
                if (name == fxClip[i].name)
                {
                    audio.PlayOneShot(fxClip[i], fxVolume);
                    return;
                }
            }
        }
    }

    /// <summary>
    /// 播放音效可重叠播放(NGUI播放方式,只能一次播放完整才能销毁,最好不要使用)
    /// </summary>
    /// <param name="name"></param>
    public void PlayFxSoundOverlap(string name)
    {
        if (fxClip == null) return;

        if (isPlayFxVolume)
        {
            for (int i = 0; i < fxClip.Length; i++)
            {
                if (name == fxClip[i].name)
                {
                    //NGUITools.PlaySound(fxClipStatic[i], fxVolume);
                    var gameObject = audioSpwan.Spawn("AudioShotGame");
                    gameObject.audio.clip = fxClip[i];
                    gameObject.audio.volume = fxVolume;
                    gameObject.audio.Play();

                    AudioShot model = gameObject.GetComponent<AudioShot>();

                    if (string.IsNullOrEmpty(model.audioName))
                    {
                        model.name = audioCount + "";
                        audioCount++;
                        fxAudioList.Add(gameObject.audio);      //添加到集合中
                    }

                    return;
                }
            }
        }
    }

    /// <summary>
    /// 播放音乐
    /// </summary>
    /// <param name="name"></param>
    public void PlayMusicSound(string name)
    {
        if(isPlayMusicVolume)
        {
            for (int i = 0; i < musicClip.Length; i++)
            {
                if (name == musicClip[i].name)
                {
                    audio.PlayOneShot(musicClip[i], musicVolume);
                    return;
                }
            }
        }
    }

    public void PlayMusicSoundOverlap(string name)
    {
        if (musicClip == null) return;

        if(isPlayMusicVolume)
        {
            for (int i = 0; i < musicClip.Length; i++)
            {
                if (name == musicClip[i].name)
                {
                    var gameObject = audioSpwan.Spawn("AudioShotGame");
                    gameObject.audio.clip = musicClip[i];
                    gameObject.audio.volume = musicVolume;
                    gameObject.audio.Play();

                    AudioShot model = gameObject.GetComponent<AudioShot>();
                    if (string.IsNullOrEmpty(model.audioName))
                    {
                        model.audioName = audioCount + "";
                        audioCount++;
                        //添加到集合中
                        musicAudioList.Add(gameObject.audio);
                    }

                    return;
                }
            }
        }
    }
    public void UpdateFxVolume(float volume)
    {
        this.fxVolume = volume;

        foreach (var i in fxAudioList)
        {
            i.volume = volume;
        }
    }
    public void UpdateMusicVolume(float volume)
    {
        this.musicVolume = volume;

        foreach (var i in musicAudioList)
        {
            i.volume = volume;
        }
    }
    public void IsPlayFxVolume(bool isPlay)
    {
        isPlayFxVolume = isPlay;

        if (isPlay == false)
        {
            foreach (var i in fxAudioList)
            {
                i.volume = 0;
            }
        }
        else
        {
            foreach (var i in fxAudioList)
            {
                i.volume = fxVolume;
            }
        }
    }
    public void IsPlayMusicVolume(bool isPlay)
    {
        isPlayMusicVolume = isPlay;

        if (isPlay == false)
        {
            foreach (var i in musicAudioList)
            {
                i.volume = 0;
            }
        }
        else
        {
            foreach (var i in musicAudioList)
            {
                i.volume = musicVolume;
            }
        }
    }
    public void ClearAudioSource()
    {
        for (int i = 0; i < musicAudioList.Count; i++)
        {
            if (musicAudioList[i].isPlaying == false)
            {
                musicAudioList.Remove(musicAudioList[i]);
            }
        }

        for (int i = 0; i < fxAudioList.Count; i++)
        {
            if (fxAudioList[i].isPlaying == false)
            {
                fxAudioList.Remove(fxAudioList[i]);
            }
        }
    }

}

音乐控制面板类:

using UnityEngine;
using System.Collections;

public class SoundPanel : MonoBehaviour {

    public void UpdateFxVolume(float i)
    {
        SoundController.instance.UpdateFxVolume(i);
    }

    public void UpdateMusicVolume(float i)
    {
        SoundController.instance.UpdateMusicVolume(i);
    }

    public void isPlayFxSound(bool isOpen)
    {
        SoundController.instance.IsPlayFxVolume(isOpen);
    }

    public void isPlayMusicSound(bool isOpen)
    {
        SoundController.instance.IsPlayMusicVolume(isOpen);
    }

    public void PlayMusic()
    {
        SoundController.instance.PlayMusicSoundOverlap("3550");
    }

    public void PlayFx()
    {
        SoundController.instance.PlayFxSoundOverlap("1843");
    }

}

源代码地址: http://yunpan.cn/cKSQeasSgVXbD  提取码 dedb

时间: 2024-10-05 10:52:14

Unity 音乐播放全局类的相关文章

[MFC] MFC音乐播放器 傻瓜级教程 网络 搜索歌曲 下载

>目录< >----------------------< 1.建立工程  1.建立一个MFC工程,命名为Tao_Music 2.选择为基本对话框 3.包含Windows Sockts 4.使用静态链接库 [方便一会直接生成的exe文件单独可以发布] 2. 搭建界面  1. 拖入控件: 2. 控件拖入并摆好 3. 控件属性设置: 3. 写代码实现功能  1.变量绑定: 2.加入图片资源 3.新建mp3类: 4.修改Tao_MusicDlg.h 5.修改Tao_Music.cpp 6

iOS开发拓展篇—音频处理(音乐播放器2)

iOS开发拓展篇—音频处理(音乐播放器2) 说明:该文主要介绍音乐播放界面的搭建. 一.跳转 1.跳转到音乐播放界面的方法选择 (1)使用模态跳转(又分为手动的和自动的) (2)使用xib并设置跳转 2.两种方法的分析 可以使用模态的方法,添加一个控制器,让这个控制器和音乐播放控制器类进行关联,脱线,设置标识符且在cell的点击事件中执行segue即可. 步骤说明: (1)在storyboard中新拖入一个控制器,然后设置和playing控制器类相关联. (2)设置手动跳转 (3)设置segue

iOS开发拓展篇—音频处理(音乐播放器3)

iOS开发拓展篇—音频处理(音乐播放器3) 说明:这篇文章主要介绍音频工具类和播放工具类的封装. 一.控制器间数据传递 1.两个控制器之间数据的传递 第一种方法:self.parentViewController.music=self.music[indexPath.row];不能满足 第二种做法:把整个数组传递给它 第三种做法:设置一个数据源,设置播放控制器的数据源是这个控制器.self.parentViewController.dataSource=self;好处:没有耦合性,任何实现了协议

委托实现音乐播放器 | 委托实现音乐播放器的缺点 | 事件实现音乐播放器

1,使用委托实现一个音乐播放器的功能呢.(模拟事件) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace 模拟事件 { /// <summary> /// 音乐播放器类 /// </summary> public class MusicP

iOS_33_音乐播放(后台播放+锁屏歌词)

最终效果图: 应用程序代理(后台播放三步曲) // // BeyondAppDelegate.h // 33_音效 // // Created by beyond on 14-9-10. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import <UIKit/UIKit.h> @interface BeyondAppDelegate : UIResponder <UIApplicationDelegate>

[个人项目] 使用 Vuejs 完成的音乐播放器

Foreword 虽然音乐播放这类的项目的静态展示居多,业务逻辑并不复杂,但是对于我这种后端出身的前端萌新来说,能使用vuejs完成大部分功能, 也会有许多收获. api:我使用的是一个开源的 nodejs 封装的网易云音乐 api,名叫NeteaseCloudMusicApi 文档地址 github地址 感谢大佬提供的学习资源. 我的项目地址 Project Preview Build Setup # install dependencies npm install # serve with

RemoteViews用法三:包含的widget的类音乐播放器

关于widget的用法参考:RemoteViews用法一:widget简单用法 RemoteViews用法二:可以接收点击事件并改变外观的widget 这篇博文主要是完成一个类音乐播放器,全面的应用activity,widget,service这几个类. 下载: 代码不算少,就不在这里粘代码了,先把源码下载地址奉上:http://download.csdn.net/detail/u011647962/8184423 demo效果: 为什么这个demo叫类音乐播放器呢,因为只有播放器的形,没有播放

音乐播放器设计类图

按图索骥---软件的设计图纸 1.用例图: 定义:选用播放器的用户与播放器的关系: 用例准则:描述用户一系列的动作: 参与者准则:与播放器交互的任何人: 2. 类图 定义:类图展示的系统中的类,类之间的相互关系,类的方法和属性. 理解:根据用例图,可以基本上设计出系统的类和他们的之间的关系.类图描述的就是类的静态结构3.音乐播放类

本地音乐播放

iOS开发拓展篇—音乐的播放 一.简单说明 音乐播放用到一个叫做AVAudioPlayer的类,这个类可以用于播放手机本地的音乐文件. 注意: (1)该类(AVAudioPlayer)只能用于播放本地音频. (2)时间比较短的(称之为音效)使用AudioServicesCreateSystemSoundID来创建,而本地时间较长(称之为音乐)使用AVAudioPlayer类. 二.代码示例 AVAudioPlayer类依赖于AVFoundation框架,因此使用该类必须先导入AVFoundati