使用Resources类搭建Unity简单的资源管理工具类

Unity资源加载的方式有:

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

 

 

posted @ 2017-07-24 22:58  !xlf  阅读(1945)  评论(0编辑  收藏  举报