WWWManager管理器总结



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
//相对路径和绝对路径
//减少代码重复量
//提高开发成本
//降低开发成本
//异步和协程
//泛型
/// <summary>
/// WWW管理器(对资源包进行加载 保存)
/// </summary>
public class WWWManager
{
    //一、原由:为什么要编写这个类,作用是什么
    //原因:方便快速加载不同的资源
    //作用:可以加载多个资源包的内容


    //二、抽象思路:
    //1:先加载资源
    //2:资源添加迭代器
    //3:保存加载的资源
    //4:得到不同类型的资源
    //5:资源的删除
    //6:资源包的删除


    //三、注释要详细


    //四、API
    //Alldict大字典,用于存储所有的资源(可以避免对象的名字相同)
    //dicts小字典,用于存储单个资源包的内容
    //public void LoadSrc(MonoBehaviour mono,string path,UnityAction fun,string name) 在这里启动协程
    //IEnumerator Load(string path,UnityAction fun,string name) 添加资源迭代器
    // void SaveBundle(AssetBundle bundle,string name) 保存加载的资源
    //public GameObject GetGameObject(string name1,string name2)通过资源包的名字,资源的名字获得各种资源的类型






    //保存所有的资源
    Dictionary<string, Dictionary<string, Object>> Alldict = new Dictionary<string, Dictionary<string, Object>>();                  
    /// <summary>
    /// 单例
    /// </summary>
    public static WWWManager wwwManager = null;
    public static WWWManager Instance()
    {
        if (wwwManager == null) wwwManager = new WWWManager();
        return wwwManager;
    }
    /// </summary>
   /// 加载资源
   /// </summary>
   /// <param name="mono">对象</param>
   /// <param name="path">路径</param>
   /// <param name="fun">回调函数</param>
   /// <param name="name">资源包的名字</param>
    public void LoadSrc(MonoBehaviour mono,string path,UnityAction fun,string name) 
    {
        //启动协程
        mono.StartCoroutine(Load(path,fun,name));
    }
    /// <summary>
    /// 资源添加迭代器
    /// </summary>
    /// <param name="path">资源的路径</param>
    /// <param name="fun">回调函数</param>
    /// <param name="name">名字</param>
    /// <returns></returns>
    IEnumerator Load(string path,UnityAction fun,string name) 
    {
        //加载资源
        WWW www = new WWW(path);
        //等待资源的异步加载完成
        yield return www;
        //如果加载没有出错,就保存加载的资源
        if (www.error == null || www.error.Length == 0)
        {
            //解析资源对象
            AssetBundle boundle = www.assetBundle;
            Debug.Log(www.text);
            //保存资源
            SaveBundle(boundle,name);
            //执行回调函数
            if (fun != null) fun();
            //释放资源
            boundle.Unload(false);
        }
        else 
        {
            Debug.Log("资源加载出错");
        }
    }
    /// <summary>
    /// 保存加载的资源
    /// </summary>
    /// <param name="bundle">加载的资源</param>
    void SaveBundle(AssetBundle bundle,string name) 
    {
              //对象的名字    对象
       Dictionary<string, Object> dicts = new Dictionary<string, Object>();
        //加载所有的资源并保存到数组里边
       Object[] objs= bundle.LoadAllAssets();
       for (int i = 0; i < objs.Length; i++)
       {
           //如果字典中已经有这个对象了,就删除后重新添加(如果不删除,会添加相同的键)
           if (dicts.ContainsKey(objs[i].name)) 
           {
               dicts.Remove(objs[i].name);
           }
           dicts.Add(objs[i].name, objs[i]);
       }
        //如果大字典中包含这个文件的名字,就移除后重新添加
       if (Alldict.ContainsKey(name)) 
       {
           Alldict.Remove(name);
       }
       Alldict.Add(name, dicts);


    }
    //=====================得到所有类型的资源=================
    /// <summary>
    /// 得到对象
    /// </summary>
    /// <param name="name1">资源包的名字</param>
    /// <param name="name2">资源的名字</param>
    /// <returns>返回的根节点</returns>
    public GameObject GetGameObject(string name1,string name2) 
    {
        if (Alldict.ContainsKey(name1)) 
        {
            return (GameObject)Alldict[name1][name2];
        }
        return null;
    }
    /// <summary>
    /// 得到声音
    /// </summary>
    /// <param name="name1">资源包的名字</param>
    /// <param name="name2">资源的名字</param>
    /// <returns></returns>
    public AudioClip GetAudioClip(string name1,string name2)
    {
        if (Alldict.ContainsKey(name1))
        {
            return (AudioClip)Alldict[name1][name2];
        }
        return null;
    }
    /// <summary>
    /// 得到贴图
    /// </summary>
    /// <param name="name1">资源包的名字</param>
    /// <param name="name2">资源的名字</param>
    /// <returns></returns>
    public Texture GetTexture(string name1,string name2)
    {
        if (Alldict.ContainsKey(name1))
        {
            return (Texture)Alldict[name1][name2];
        }
        return null;
    }
    //============================得到各种资源=========================
    /// <summary>
    /// 得到各种资源
    /// </summary>
    /// <typeparam name="T">资源的类型</typeparam>
    /// <param name="packName">资源包的名字</param>
    /// <param name="name">对象的名字</param>
    /// <returns></returns>
    public T GetRes<T>(string packName, string name) where T : Object 
    {
        if (Alldict.ContainsKey(packName)) 
        {
            if (Alldict[packName].ContainsKey(name)) 
            {
                return (T)Alldict[packName][name];
            }
        }
        return null;
    }
   /// <summary>
   /// 删除资源
   /// </summary>
   /// <param name="name">资源包的名字</param>
    void RemoveAssets(string name) 
    {
        if (Alldict.ContainsKey(name)) 
        {
            Alldict.Remove(name);
        }
    }
    /// <summary>
    /// 删除所有的资源
    /// </summary>
    void RemoveAll() 
    {
        if (Alldict != null)
        {
            Alldict.Clear();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/wk201403010114/article/details/78523932