根据音效文件目录自动生成获取音频的代码

自动化生成Unity音频文件访问代码
这篇博客介绍了一个Unity编辑器脚本,用于自动生成访问Resources目录下Music文件夹中音频文件的C#代码。脚本会创建一个枚举和静态类,方便直接通过类方法加载AudioClip。只需在指定文件夹放置音频文件,运行脚本,即可在Scripts/Enum目录下得到生成的Music.cs文件,简化了资源加载过程。

前言

当我们处理音频音效的时候往往需要读取到AudioClip文件来进行操作,但是繁琐的使用Resources.Load<AudioClip>()方法来获取clip文件是一个很头疼的事情,所以参考了 https://blog.youkuaiyun.com/songhuanfei2017/article/details/90065838 大佬的文章将读取clip文件的操作用代码来完成,简而言之就是用代码来写读取音频的代码。

代码

    
using System ; using System . IO ; using UnityEditor ; using UnityEngine ; public class MusicEditor { [ MenuItem ( "Tools/GenMusicEnum" , false , 2000 ) ] public static void GetMusicEnum ( ) { string musicPath = Application . dataPath + "/Resources/Music" ; //存放音频文件的文件夹 Debug . Log ( "音乐文件夹:" + musicPath ) ; if ( Directory . Exists ( musicPath ) ) //判断路径是否存在 { DirectoryInfo direction = new DirectoryInfo ( musicPath ) ; FileInfo [ ] files = direction . GetFiles ( "*" , SearchOption . AllDirectories ) ; //获取路径下所有文件的路径 string musicMnumFile = @" using UnityEngine; //------------------------------------------------------------------------------ // <自动生成音频(音乐)文件枚举脚本> // 将指定路径下的音频文件转换为枚举类型脚本,供调用 // </自动生成音频(音乐)文件枚举脚本> //------------------------------------------------------------------------------ namespace TheExpanse.SingleManagerSystem { public enum MusicEnum { " ; //新建一个字符串,待会补充完成后保存为.cs脚本文件,引用固定的UnityEngine,加上你自己的命名空间以及类名 for ( int i = 0 ; i < files . Length ; i ++ ) //原来文章中有的枚举部分 { if ( files [ i ] . Name . EndsWith ( ".meta" ) ) //每一个资源文件unity会生成一个后缀为.meta的文件,跳过对该文件的操作 { continue ; } string extensionName = Path . GetExtension ( files [ i ] . Name ) . ToLower ( ) ; //判断文件的后缀是否为支持的音频文件 if ( extensionName == ".mp3" || extensionName == ".aiff" || extensionName == ".wav" || extensionName == ".ogg" ) { try { string str = files [ i ] . Name . Replace ( Path . GetExtension ( files [ i ] . Name ) . ToLower ( ) , "" ) ; //去除文件后缀名, string strs = str . Replace ( " " , "" ) ; //去除空格 string [ ] musicName = strs . Split ( '\\' ) ; //去除最后一个\及之前的内容 for ( int j = 0 ; j < musicName . Length ; j ++ ) { musicMnumFile += " " + musicName [ j ] + ",\n" ; //循环将所有音频文件名作为MusicEnum的枚举 } } catch ( Exception e ) { Debug . LogError ( e . Message ) ; continue ; } } } musicMnumFile += @" }" + "\n" ; //补上MusicEnum的后大括号 musicMnumFile += @" public static class Music {" + "\n" ; //新建一个Music静态类,其他地方可以使用此类点出音频文件 for ( int i = 0 ; i < files . Length ; i ++ ) { if ( files [ i ] . Name . EndsWith ( ".meta" ) ) { continue ; } //以下几行代码同之前的操作 string extensionName = Path . GetExtension ( files [ i ] . Name ) . ToLower ( ) ; if ( extensionName == ".mp3" || extensionName == ".aiff" || extensionName == ".wav" || extensionName == ".ogg" ) { try { string str = files [ i ] . Name . Replace ( Path . GetExtension ( files [ i ] . Name ) . ToLower ( ) , "" ) ; string strs = str . Replace ( " " , "" ) ; string [ ] musicName = strs . Split ( '\\' ) ; for ( int j = 0 ; j < musicName . Length ; j ++ ) //循环在Music类下面书写静态方法 { musicMnumFile += @" public static AudioClip " + musicName [ j ] + "()" + "\n" ; //返回值为AudioClip的静态方法 musicMnumFile += @" {" + "\n" ; //前大括号 musicMnumFile += @" " + @"return Resources.Load<AudioClip>(""Music" ; //返回Resources加载的clip文件 musicMnumFile += "/" + musicName [ j ] + @"""" + ");" + "\n" ; //补充引号和括号,使用@""时可以将两个引号转义为字符串引号 musicMnumFile += " }" + "\n" ; //补充静态方法后大括号 } } catch ( Exception e ) { Debug . LogError ( e . Message ) ; continue ; } } } musicMnumFile += "\n" + " }" + "\n" + "}" ; //补充静态类后括号和命名空间后括号 try { string filePath = Application . dataPath + "/Scripts/Enum/Music.cs" ; File . WriteAllText ( filePath , musicMnumFile ) ; //将字符串保存到指定路径下,保存为Music.cs文件 AssetDatabase . Refresh ( ) ; } catch ( Exception e ) { Debug . Log ( e . Message ) ; throw ; } } else { Debug . LogWarning ( "指定文件夹不存在!" ) ; } } }
对Unity编辑器进行操作的所有脚本必须将其放置到Editor文件夹中,否则导出工程会报错。

使用方法

  1. 在你的Resources/Music文件夹中放置音频文件
2.在Unity编辑器顶部的Tools菜单下点击GenMusicEnum
3.此时在你Scripts/Enum/文件夹下会生成Music.cs文件(存放Music.cs的文件夹位置可在代码中自定义),打开结果如下(枚举菜单几乎没啥用只是保留大佬的原有效果,这段可以在上面的代码中去除生成枚举菜单的内容):
    
using UnityEngine ; //------------------------------------------------------------------------------ // <自动生成音频(音乐)文件枚举脚本> // 将指定路径下的音频文件转换为枚举类型脚本,供调用 // </自动生成音频(音乐)文件枚举脚本> //------------------------------------------------------------------------------ namespace TheExpanse . SingleManagerSystem { public enum MusicEnum { BornReady , CHINA2 , MistyRain , 光亮 , 唐宋元明清 , 庐州月 , 桃花笑 , } public static class Music { public static AudioClip BornReady ( ) { return Resources . Load < AudioClip > ( "Music/BornReady" ) ; } public static AudioClip CHINA2 ( ) { return Resources . Load < AudioClip > ( "Music/CHINA2" ) ; } public static AudioClip MistyRain ( ) { return Resources . Load < AudioClip > ( "Music/MistyRain" ) ; } public static AudioClip 光亮 ( ) { return Resources . Load < AudioClip > ( "Music/光亮" ) ; } public static AudioClip 唐宋元明清 ( ) { return Resources . Load < AudioClip > ( "Music/唐宋元明清" ) ; } public static AudioClip 庐州月 ( ) { return Resources . Load < AudioClip > ( "Music/庐州月" ) ; } public static AudioClip 桃花笑 ( ) { return Resources . Load < AudioClip > ( "Music/桃花笑" ) ; } } }
4.此时你便可在其他地方使用此音频文件了。

注意事项

  • 音频文件的命名尽量简洁,不要包含下划线"_"、横杠"-"、点"·"等特殊字符,最好空格也不要有,实质上脚本是在对字符串进行处理,这些特殊符号会造成转义混乱,导致很繁琐的问题出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值