【Unity】搭建基于字典(Dictionary)和泛型列表(List)的音频系统

1.前言

我们在开发游戏的音频系统的时候,可能最常规的想法就是定义一大堆的AudioSource变量,然后给它们定义相应的调用方法。但是,每次要新增音频的时候,就要定义新的变量,很不方便,也不利于维护,可维护性很差。

经过我的项目实践下来,给大家介绍一种基于字典和泛型列表开发出来的音频系统,核心搭建完之后,能够很方便的扩展功能。

2.系统介绍

现在来介绍一下搭建系统所用到的数据结构的用途。

  • 泛型列表(List):存储音频文件(AudioClip)和该音频对应的类型(AudioType)
  • 字典(Dictionary):根据泛型列表中存储的数据,动态生成并存储AudioSource,同时该字典的AudioSource的键值为AudioType
  • 枚举(Enum):存储音频类型,比如攻击音效(Attack),防御的音效(Defense)等

在之后,当我们的AudioSource都加载到字典里面之后,我们只需要AudioType就可以快速访问到指定的AudioSource,播放对应的音频!

3.搭建系统

3.1 创建音频类型枚举

这里你可以自行创建一个空脚本来存储各种各样的枚举类型。(不需要写在class里面)

cs 复制代码
public enum AudioType
{
    Attack,
    Denfense,
    Hit
}

3.2 创建音频SO类

cs 复制代码
using UnityEngine;

[CreateAssetMenu(fileName = "new AudioAsset",menuName = "AudioAsset")]
public class AudioAsset : ScriptableObject
{
    public AudioClip audio;
    public AudioType type;
}

3.3 创建音频SO文件

在完成前两步之后,你就可以在Unity的Project窗口中创建AudioAsset文件了

每一个音频对应创建一个AudioAsset文件,++每一个音频对应一个AudioType++。

3.4 创建音频系统

下面是搭建好的基本的音频系统,请将这个脚本挂载到一个空物体上。

cs 复制代码
using System;
using System.Collections.Generic;
using UnityEngine;

public class AudioSystem : MonoBehaviour
{
    //这个列表请在Inspector窗口中自行将AudioAsset文件添加进来
    public List<AudioAsset> audioAssetList = new();
    
    //这个列表是动态存储AudioSource的
    private Dictionary<AudioType,AudioSource> audioSourceDic = new();
    
    private void Awake()
    {
        Initial();
    }

    //初始化
    private void Initial()
    {
        foreach(var audioAsset in audioAssetList)
        {
            var audioSource = gameObject.AddComponent<AudioSource>();
            audioSource.playAwake = false;
            audioSource.clip = audioAsset.audio;
            audioSourceDic.Add(audioAsset.type,audioSource);
        }
    }
    
    //播放指定类型的音频
    public void PlayAudio(AudioType type)
    {
        audioSourceDic[type].Play();
    }
}

在今后的开发中,如果再增减音频,只需要在Insprctor窗口中增减SO文件,增减枚举成员(当然你留着也没不影响)即可。

注意,我上面的代码只是演示了一个基本的思路,并没有考虑一些潜在的问题,比如某些AudioSource没有启用、某些类型的音频没有加入到字典中但是又要播放这个音频等。还请各位视情况做调整和优化!

相关推荐
张张努力变强8 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
wWYy.8 小时前
数组快排 链表归并
数据结构·链表
心疼你的一切9 小时前
Unity异步编程神器:Unitask库深度解析(功能+实战案例+API全指南)
深度学习·unity·c#·游戏引擎·unitask
李斯啦果9 小时前
【PTA】L1-019 谁先倒
数据结构·算法
呆呆敲代码的小Y11 小时前
【Unity 实用工具篇】 | Book Page Curl 快速实现翻书效果
游戏·unity·游戏引擎·u3d·免费游戏·翻书插件
.房东的猫19 小时前
ERP(金蝶云星空)开发【安装篇】
c#
AC梦1 天前
unity中如何将UI上的字高清显示
ui·unity
Mr Xu_1 天前
告别硬编码:前端项目中配置驱动的实战优化指南
前端·javascript·数据结构
czxyvX1 天前
017-AVL树(C++实现)
开发语言·数据结构·c++
数智工坊1 天前
【数据结构-队列】3.2 队列的顺序-链式实现-双端队列
数据结构