前言
当我们处理音频音效的时候往往需要读取到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文件夹中,否则导出工程会报错。
使用方法
-
在你的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.此时你便可在其他地方使用此音频文件了。
注意事项
-
音频文件的命名尽量简洁,不要包含下划线"_"、横杠"-"、点"·"等特殊字符,最好空格也不要有,实质上脚本是在对字符串进行处理,这些特殊符号会造成转义混乱,导致很繁琐的问题出现。
自动化生成Unity音频文件访问代码
这篇博客介绍了一个Unity编辑器脚本,用于自动生成访问Resources目录下Music文件夹中音频文件的C#代码。脚本会创建一个枚举和静态类,方便直接通过类方法加载AudioClip。只需在指定文件夹放置音频文件,运行脚本,即可在Scripts/Enum目录下得到生成的Music.cs文件,简化了资源加载过程。
264

被折叠的 条评论
为什么被折叠?



