标签:简单 resource get 卸载 override material unlock ddc date
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
标签:简单 resource get 卸载 override material unlock ddc date
原文地址:http://www.cnblogs.com/icexlf/p/7231693.html