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();
}
}
}