Unity 简单的音效管理器

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

public enum _eSoundLayer
{
    Background,
    Effect,
    EffectUI
}

public class SoundManager
{
    SoundServer mSoundServer = new SoundServer();
    Dictionary<_eSoundLayer, ISoundLayer> mSoundLayers = new Dictionary<_eSoundLayer, ISoundLayer>();

    public void Create()
    {
        mSoundServer.Create("Sound");
        mSoundLayers.Add(_eSoundLayer.Background, new SoundLayerBackground(mSoundServer));
        mSoundLayers.Add(_eSoundLayer.Effect, new SoundLayerEffect(mSoundServer, 5));
        mSoundLayers.Add(_eSoundLayer.EffectUI, new SoundLayerUI(mSoundServer, 3));
    }

    public void SetVolume(_eSoundLayer layer, float volume)
    {
        mSoundLayers[layer].SetVolume(volume);
    }

    public void Play(_eSoundLayer layer, string sound_name)
    {
        if (string.IsNullOrEmpty(sound_name))
        {
            return;
        }
        mSoundLayers[layer].Play(sound_name);
    }

    public void Stop(_eSoundLayer layer)
    {
        mSoundLayers[layer].Stop();
    }

    public void Destroy()
    {
        foreach (var sound_layer in mSoundLayers)
        {
            sound_layer.Value.Destroy();
        }
        mSoundLayers.Clear();
    }
}

public class SoundServer
{
    GameObject mPlayer;
    string mSoundFileRootPath;

    public void Create(string sound_file_root_path)
    {
        Debug.Log(" SoundPlayer +++++++++++++++++++++++++++");
        mSoundFileRootPath = sound_file_root_path;
        mPlayer = new GameObject("SoundPlayer");
    }

    AudioClip LoadSound(string sound_name)
    {
        return Resources.Load<AudioClip>(mSoundFileRootPath + "/" + sound_name);
    }

    public AudioSource CreateSoundPlayer()
    {
        return mPlayer.AddComponent<AudioSource>();
    }

    public void Play(AudioSource sound_player, string sound_name, bool is_loop)
    {
        if (sound_player == null) return;
        //sound_player.Stop();
        sound_player.loop = is_loop;
        sound_player.clip = LoadSound(sound_name);
        sound_player.Play();
    }

    public void Pause(AudioSource sound_player)
    {
        if (sound_player == null) return;
        sound_player.Pause();
    }

    public void Stop(AudioSource sound_player)
    {
        if (sound_player == null) return;
        sound_player.Stop();
    }

    public void DestroySoundPlayer(AudioSource sound_player)
    {
        if (sound_player == null) return;
        sound_player.Stop();
        UnityEngine.Object.Destroy(sound_player);
    }
}

public interface ISoundLayer
{
    void Play(string sound_name);
    void Stop();
    void SetVolume(float volume);

    void Destroy();
}

public class SoundLayerBackground : ISoundLayer
{
    SoundServer mSoundServer;
    AudioSource mSoundPlayer;

    public SoundLayerBackground(SoundServer sound_server)
    {
        mSoundServer = sound_server;
        mSoundPlayer = mSoundServer.CreateSoundPlayer();
    }

    public void Play(string sound_name)
    {
        if (IsSameSound(sound_name)) return;
        mSoundServer.Play(mSoundPlayer, sound_name, true);
    }

    public void Stop()
    {
        mSoundServer.Stop(mSoundPlayer);
    }

    public void SetVolume(float volume)
    {
        mSoundPlayer.volume = volume;
    }

    public void Destroy()
    {
        mSoundServer.DestroySoundPlayer(mSoundPlayer);
    }

    bool IsSameSound(string sound_name)
    {
        return mSoundPlayer.clip != null && mSoundPlayer.clip.name == sound_name;
    }
}

public class SoundLayerEffect : ISoundLayer
{
    SoundServer mSoundServer;
    Queue<AudioSource> mSoundPlayers = new Queue<AudioSource>();

    public SoundLayerEffect(SoundServer sound_server, int track_number)
    {
        mSoundServer = sound_server;
        mSoundPlayers = new Queue<AudioSource>(track_number);
        while (track_number > 0)
        {
            mSoundPlayers.Enqueue(mSoundServer.CreateSoundPlayer());
            track_number--;
        }
    }

    public void Play(string sound_name)
    {
        AudioSource current_player = mSoundPlayers.Dequeue();
        mSoundServer.Play(current_player, sound_name, false);
        mSoundPlayers.Enqueue(current_player);
    }

    public void Stop()
    {
        foreach (var sound_player in mSoundPlayers)
        {
            mSoundServer.Stop(sound_player);
        }
    }

    public void SetVolume(float volume)
    {
        foreach (var sound_player in mSoundPlayers)
        {
            sound_player.volume = volume;
        }
    }

    public void Destroy()
    {
        foreach (var sound_player in mSoundPlayers)
        {
            mSoundServer.DestroySoundPlayer(sound_player);
        }
    }
}
public class SoundLayerUI : ISoundLayer
{
    SoundServer mSoundServer;
    Queue<AudioSource> mSoundPlayers = new Queue<AudioSource>();

    public SoundLayerUI(SoundServer sound_server, int track_number)
    {
        mSoundServer = sound_server;
        mSoundPlayers = new Queue<AudioSource>(track_number);
        while (track_number > 0)
        {
            mSoundPlayers.Enqueue(mSoundServer.CreateSoundPlayer());
            track_number--;
        }
    }

    public void Play(string sound_name)
    {
        AudioSource current_player = mSoundPlayers.Dequeue();
        mSoundServer.Play(current_player, sound_name, false);
        mSoundPlayers.Enqueue(current_player);
    }

    public void Stop()
    {
        foreach (var sound_player in mSoundPlayers)
        {
            mSoundServer.Stop(sound_player);
        }
    }

    public void SetVolume(float volume)
    {
        foreach (var sound_player in mSoundPlayers)
        {
            sound_player.volume = volume;
        }
    }

    public void Destroy()
    {
        foreach (var sound_player in mSoundPlayers)
        {
            mSoundServer.DestroySoundPlayer(sound_player);
        }
    }
}

时间: 2024-11-01 12:22:15

Unity 简单的音效管理器的相关文章

C#WinForm treeview 简单文件夹管理器 查看文件夹下的文件,子文件下的文件

1 查看的文件夹中的内容 2 UI 3 代码 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.IO; 7 using System.Linq; 8 using System.Text; 9 using System.Threading.Tasks; 10 usi

简单的密码管理器(Python)(待完善)

需要使用的库:pymssql(用于连接SQL Server), PyQt5(用于窗口的制作) 首先编写DOS界面的密码生成器,以及将程序与数据库相连接,用于存储和查询 PasswordDOS.py 1 from random import randint 2 import pymssql 3 4 5 def connect_to_sql(): 6 print('连接中...') 7 connect = pymssql.connect('(local)', 'sa', '123456789', '

10 款最佳剪贴板管理器

导读 许多时候,你将内容拷贝到剪贴板后,最终因某人或某物导致的分心而清空剪贴板,而找不回来.如果出现这种情况,确实很烦人.那么,你如何杜绝这种令人沮丧的局面?这正是我们在本文中所要解答的问题. 这里不妨看一下可以帮助你管理并跟踪剪贴板内容的几款剪贴板管理器. 什么是剪贴板管理器? 剪贴板管理器是一种实用程序或工具,它在你Linux系统的后台运行,为你保存到系统剪贴板的所有内容保存一份历史记录. 为什么需要剪贴板管理器? 剪贴板管理器的一个重要用途就是,你没必要为清空或覆盖剪贴板内容而操心,如果你

JAVA 三种基本的布局管理器

1.FlowLayout 最简单的布局管理器,使用该框架,按照组件添加的顺序,从左到右的将组件排列在容器中. 当一行放满后,开始新的一行.可以使用三个常量(用来指定组建的对齐方式): FlowLayout.RIGHT FlowLayout.CENTER FlowLayout.LEFT package chapter12; import javax.swing.JFrame; import java.awt.FlowLayout; import javax.swing.JLabel;// impo

yum源包管理器配置方法的详细总结

yum是红帽软件包管理器,可以查询有关可用的软件包的信息,使用来自yum仓库的rpm包,安装和卸载,并更新整个系统的最新版本.yum执行自动依赖解析更新时,安装或删除软件包,从而能够自动判断.获取和安装所有可用的依赖包. yum可以配置新的,额外的yum仓库或者包的来源,也提供了很多插件,增强和扩展其功能.同时yum还能够执行许多rpm包管理软件能够执行的工作:此外,许多命令行选项是相似的.yum是容易简单的包管理器在单一的机器. 下面的部分假设您的系统在安装过程中注册了红帽订阅管理,如红帽企业

python上下文管理器ContextLib及with语句

http://blog.csdn.net/pipisorry/article/details/50444736 with语句 with语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍).with 语句适用于对资源进行访问的场合,确保不管使用过程

安全类工具制作第004篇:进程管理器(上)

一.前言 进程是计算机中执行的程序,是向操作系统申请资源的基本单位.我们执行一个程序.那么就会对应地创建一个甚至多个进程,关闭程序时.进程也就结束了.查看进程最经常使用的手段是按下Ctrl+Shift+Delete打开Windows自带的任务管理器,或者使用老牌强力软件"冰刃".又或者是使用由微软推出的更为强大的Process Monitor,都能基本得到同样的效果.不同的是.强大的进程查看软件能够查看到系统的隐藏进程,而一般的仅仅能查看应用层的进程.而我在这两篇文章中所讨论的就是怎样

一个简单而强大的单片机内存管理器-不带内存碎片整理

单片机简单内存管理器 本代码基于无操作系统的STM32单片机开发,功能强大,可申请到地址空间连续的不同大小的内存空间,且用户接口简单,使用方便 转载请注明出处:http://blog.csdn.net/u011833609/article/details/46834203 memory.h #ifndef __MEMORY_H__ #define __MEMORY_H__ #include "stdio.h" #include "string.h" #include

推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler

在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自带的timer,但这个类只能完成一些简单的定时操作,比如间隔多久执行什么操作.遇到一些复杂的定时任务,如从当前时间开始,多少时间后间隔重复执行,timer类处理起来就相对困难了.经过多番查找搜索,终于找到一下比较好用的任务定时器–FluentScheduler,你可以通过Nuget来引用,用程序包管