1.脚本拖拽(本地)
2.Resources加载(本地) ★
3.AssetBundle加载(本地,远程[www])★
本篇将使用Resources类搭建一个简单的资源管理工具类
Resources是Unity下的特殊文件夹,使用需自行创建Resources文件夹(命名必须正确)
使用Resources文件夹就需要用到Resources类的一些方法,如下:
Resources类 | |
Load | 从Resources文件夹加载单个资源(可指定类型) |
LoadAll | 从Resources文件夹加载多个资源(可指定类型) |
LoadAsync | 异步从Resources文件夹加载单个资源 |
UnloadAsset | 从内存卸载资源 |
UnloadUnloadAssets | 卸载用不到的资源 |
Resources类主要用到Load方法,使用实例如下
登录后复制
1 public class Test : MonoBehaviour {
2 //预设体
3 GameObject _pre;
4 //图片纹理
5 Texture _texture;
6 //精灵
7 Sprite _sprite;
8 //网格
9 Mesh _mesh;
10 //音频
11 AudioClip _aud;
12 //材质
13 Material _material;
14 void Start () {
15 //获取预设体
16 _pre = Resources.Load<GameObject>("player");
17 //获取材质
18 _material = Resources.Load<Material>("red");
19 GetComponent<MeshRenderer>().material = _material;
20 //获取声音文件
21 _aud = Resources.Load<AudioClip>("SNOW");
22 //动态添加一个声音组件
23 AudioSource aud = gameObject.AddComponent<AudioSource>();
24 aud.clip = _aud;
25 aud.playOnAwake = true;
26 aud.loop = true;
27 aud.Play();
28 //获取纹理
29 _texture = Resources.Load<Texture>("eff04b");
30 GetComponent<MeshRenderer>().material.mainTexture = _texture;
31 }
32 }
但这样写会时代码繁琐,尤其当获取很多资源的时候Star里的初始化就让人没法看了,所有需要建立一个有效的简单工具类去管理
下面以管理添加音频文件为例建立一个简单的Resources资源管理工具类
1.首先建立一个单例脚本基类,用于管理所有的单例脚本,代码如下:
登录后复制
1 using UnityEngine;
2 using System.Collections;
3 /// <summary>
4 /// 作为脚本单例的基类
5 /// </summary>
6 public class MonoSingletonBaseScr<T>:MonoBehaviour where T:MonoSingletonBaseScr<T> {
7
8 private static T instance;
9 public static T Instance
10 {
11 get
12 {
13 if (null==instance) {
14 //如果这个单例脚本不存在,说明没有挂载
15 //但是要想使用,必须有对象挂载初始化
16 //所有我们自己创建一个空对象,挂载我们的单例脚本
17 //保证我们在使用的时候它已经被实例化
18 GameObject obj=new GameObject();
19 instance=obj.AddComponent<T>();
20 }
21 return instance;
22 }
23 }
24
25 protected virtual void Awake()
26 {
27 instance =this as T;
28 }
29
30 }
2.建立一个MusicController音频管理单例脚本,继承MonoSingletonBaseScr<T>基类
登录后复制
1 using UnityEngine;
2 using System.Collections;
3
4 public class MusicController :MonoSingletonBaseScr<MusicController> {
5 //播放器
6 private AudioSource aud_music;
7 //控制音量
8 public float music_Volume
9 {
10 get
11 {
12 return aud_music.volume;
13 }
14 set
15 {
16 aud_music.volume = value;
17 }
18 }
19
20 //重写初始化方法,做准备工作
21 protected override void Awake()
22 {
23 //调用父类初始化方法
24 base.Awake();
25 //自己的初始化
26 if (GetComponent<AudioSource>()==null) {
27 aud_music = gameObject.AddComponent<AudioSource>();
28 }
29 else {
30 aud_music = GetComponent<AudioSource>();
31 }
32
33 aud_music.loop = true;
34 aud_music.playOnAwake = true;
35
36 }
37 //根据音频名称播放音频,定义为private保护
38 private void playMusicByName(object name,bool isRestart = false)
39 {
40 //定义一个当前的音频
41 string currectName = string.Empty;
42
43 if (aud_music.clip!=null) {
44 currectName = aud_music.clip.name;
45 }
46 //ResourcesLoadTool为自己定义的Resources工具类
47 AudioClip clip = ResourcesLoadTool.Instance.ResourcesLoadObject<AudioClip>(name);
48 if (clip!=null) {
49 if (currectName==clip.name && !isRestart) {
50 return;
51 }
52
53 //播放新的音频
54 aud_music.clip = clip;
55 aud_music.clip = clip;
56 aud_music.Play();
57 }
58 else {
59 Debug.Log("加载失败!=" + name.ToString());
60 }
61 }
62
63 //使用方法重载
64 public void PlayeMusic(Music.musicType_Main music,bool isRestart = false)
65 {
66 playMusicByName(music, isRestart);
67 }
68 public void PlayeMusic(Music.musicType_Items music, bool isRestart = false)
69 {
70 playMusicByName(music, isRestart);
71 }
72
73 }
3.建立一个单例类的基类,以后所写的单例类都可以继承这个基类直接实现单例
登录后复制
1 public class SingletonBase<T>:System.IDisposable where T:new() {
2 private static T instance;
3 public static T Instance
4 {
5 get
6 {
7 if (null==instance) {
8 instance = new T();
9 }
10 return instance;
11 }
12 }
13
14 public virtual void Dispose()
15 {
16
17 }
18
19 }
4.建立Resources管理单例类,继承SingletonBase单例类基类
登录后复制
/// <summary>
/// Resources管理单例类,继承SingletonBase基类
/// </summary>
public class ResourcesLoadTool :SingletonBase<ResourcesLoadTool> {
public T ResourcesLoadObject<T>(object objname)where T:Object
{
//通过传进的的声音名字,获取所在的枚举类型
string enumType = objname.GetType().Name;
//定义一个文件的路径
string filePath = string.Empty;
switch (enumType) {
//case 后的值为Music脚本中的枚举值,可根据需求在Music中添加
case "musicType_Main": {
//给出在Unity工程中对应的路径
filePath = "Music/Main/"+objname.ToString();
break;
}
case "musicType_Items": {
filePath = "Music/Items/" + objname.ToString();
break;
}
}
return Resources.Load<T>(filePath);
}
}
5.音频文件地址的枚举
登录后复制
/// <summary>
/// 根据枚举值来获取Resources文件下文件路径
/// </summary>
public class Music {
public enum musicType_Main
{
Accomplish,
BGMusic,
Select,
Unlock
}
public enum musicType_Items
{
Ach,
BGMusic01,
BGMusic02,
BGMusic03,
BGMusic06
}
}
文件路径示例如下
现在,Resources简单的资源管理工具类就封装好了,后面可以根据需求添加Prefabs,Texture等等
进行测试:
建立一个Test脚本测试
登录后复制
1 public class MusicTest : MonoBehaviour {
2 void Start () {
3 }
4
5
6 void Update () {
7
8 if (Input.GetKeyDown(KeyCode.Q)) {
9 MusicController.Instance.PlayeMusic (Music.musicType_Main.BGMusic);
10 }
11 if (Input.GetKeyDown(KeyCode.W)) {
12 MusicController.Instance.PlayeMusic(Music.musicType_Items.BGMusic01);
13 }
14
15 }
16 }
将Test和脚本挂载到Cube上进行测试(MusicController脚本如果没有挂载会自动创建一个空物体添加AudioSource)
摁下Q键会播放Resources/Music/Main下的BGMusic
摁下W键会播放Resources/Music/Items下的BGMusic01
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删