使用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

时间: 2024-07-28 18:02:03

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

验证码确保php无输出、sql语句的封装性、文件上传的工具类【这三个重点工具类实现】

1.php代码在引入中不会进行结束或者确保结束之后没有空格,来保证php在被包含中没有被输出[防止header和session_start()对输出的控制]实质上,需要注意的就是,要不就进行输出缓存控制以及php开始标签前没有空格 验证码这个功能需要header和session两个功能[尤其需要注意输出的问题] [总结:防止php代码中带着一些输出的问题](1)在php标签中开始<?php 前顶格(2)php结束符要不不写,写了就不要在结束之后还有换行[防止该文件被包含之后提前出线输出](3)或

配置简单功能强大的excel工具类搞定excel导入导出工具类(一)

对于J2EE项目导入导出Excel是最普通和实用功能,本工具类使用步骤简单,功能强大,只需要对实体类进行简单的注解就能实现导入导出功能,导入导出操作的都是实体对象. 请看一下这个类都有哪些功能:????? 1.实体属性配置了注解就能导出到excel中,每个属性都对应一列.????? 2.列名称可以通过注解配置.????? 3.导出到哪一列可以通过注解配置.????? 4.鼠标移动到该列时提示信息可以通过注解配置.????? 5.用注解设置只能下拉选择不能随意填写功能.???? ? 6.用注解设置

iOS开发--换肤简单实现以及工具类的抽取

一.根据美工提供的图片,可以有两种换肤的方案. <1>美工提供图片的类型一: <2>美工提供图片的类型二:这种分了文件夹文件名都一样的情况,拖入项目后最后用真实文件夹(蓝色文件夹).因为项目中的黄色文件夹都是虚拟不存在的,同名的文件只会保留一个 勾选第二个: 二.工具类的抽取 -- 以第二种图片的方案为前提,抽取的工具类 头文件的实现                                                                          

java常用工具类(二)—— JSON处理工具类

package com.springboot.commons.utils; import com.springboot.commons.scan.JacksonObjectMapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import net.sf.json.JSONArray; import net.sf.j

AFN的简单封装抽取工具类

?AFN获取数据----by hanfeng AFN是对 NSURLConnection,NSURLSession的封装 AFNetworking3.0删除了了对 NSURLConnection的封装内容 这是因为,NSURLSession能够完全替代NSURLConnection,并且具有很多优点 支持后台运行的网络任务 暂停.停止.重启网络任务,不需要自己封装NSOperation 支持断点续传,异步下载 支持上传,异步上传 获取下载.上传的进度 NSURLSession有3种任务 NSUR

编写一个简单的正则表达式工具类

跟着视频的讲解,也亲手敲了这么一个正则表达式的类,感觉很不错,真是温故而知新,本来想把注释写的逼格高一点的,今天晚了有点累,先简单的写一下,有时间了再完善完善. <?php class regexTool{ //内置一些常用的正则表达式 private $validate = array( 'require'   =>  '/.+/', 'email'     =>  '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/', 'url'    

Swift:简单封装一个工具类模板

创建模板类(封装一个类)新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var description: String var price: Double var stock: Int init(name: String, description: String, price: Double, stock: Int) { self.name = name self.description =

保存一下简单封装的工具类JsonUtils 、android网络判断的Utils 是否连接无wifi、sdcard状态的utils

1.JsonUtils    json和实体类之间相互转换 随便提一下  App版本升级   github上有开源框架可以看一下VersionUpdate: public class JsonUtils { /** * 将一个实体类转换成json字符串(对象中可以包含集合) */ public static <T> String beanToJson(T t){ Gson gson = new Gson(); String json = gson.toJson(t); return json;

一个简单的Hibernate工具类HibernateUtil

HibernateUtil 1 package com.wj.app.util; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 import org.hibernate.service.ServiceRegistry; 7 import org.hibernate.service.ServiceRegistry