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

     

  • 相关阅读:
    SQLSERVER走起微信公众帐号已经开通搜狗微信搜索
    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
    从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
    恢复SQL Server被误删除的数据(再扩展)
    Windows server 2012 添加中文语言包(英文转为中文)(离线)
    SQL Server技术内幕笔记合集
    将表里的数据批量生成INSERT语句的存储过程 增强版
    在SQL2008查找某数据库中的列是否存在某个值
    SQLSERVER走起 APP隆重推出
  • 原文地址:https://www.cnblogs.com/icexlf/p/7231693.html
Copyright © 2020-2023  润新知