1.Resources介绍
Resources文件夹是Unity中标志性的目录(可以在1级目录,也可以在其他子目录),Resources目录下的文件不论使用与否,都会被强制打包到游戏包中,所以应尽可能去除不需要运行时加载的资源或者已经废弃掉的资源,否则会增大游戏包体积。且Resources下的文件不要直接当作预制体引用在场景中,否则会被Scene和Resources打包成两份,而应该在打开场景时加载Resources中的资源。
2.Resources.Load加载各类游戏资源
在不同目录下添加Resources文件,但是Unity会将所有的Resouces文件合并,所以加载时他们仍在同一目录下。
using UnityEngine;
using System.Collections;
public class ResourcesTest : MonoBehaviour {
void Start ()
{
//加载材质
Material material = Resources.Load<Material>("New Material");
//加载cube
GameObject cube = Resources.Load("Cube") as GameObject;
Instantiate(cube);
//使用另一种方法加载
GameObject cube1 = Resources.Load<GameObject>("Cube1");
GameObject child= Instantiate(cube1);
//挂载相机下
child.transform.SetParent(Camera.main.transform, false);
}
}
3.对Resouces方法进行封装,动态加载资源
封装Resources的主要目的,在需要加载文件过多时,我想在不知道文件具体名称的时候,仅通过枚举类型找到,用一行代码找到自己想找的文件,而不用一步接一步的复制路径,方便资源管理。
首先对文件进行分类,并在代码中添加枚举,将要加载的资源进行分类。
对Resources方法进行封装,加载资源只需调用Load方法
#region Load 加载资源
/// <summary>
/// 加载资源
/// </summary>
/// <param name="type">资源类型</param>
/// <param name="path">短路径(文件名)</param>
/// <param name="cache">是否放入缓存</param>
/// <returns>预设克隆体</returns>
public GameObject Load(ResourceType type,string path,bool cache=false)
{
//当一个窗口被频繁的销毁或创建,势必为造成资源的浪费,所以需要将已经生成的窗口放入缓存中
GameObject obj = null;
if(m_PrefabTable.Contains(path))
{
Debug.Log("资源是从缓存中加载的");
obj = m_PrefabTable[path] as GameObject;
}
else
{
StringBuilder sbr = new StringBuilder();
switch (type)
{
case ResourceType.UIScene:
sbr.Append("UIPrefab/UIScene/");
break;
case ResourceType.UIWindow:
sbr.Append("UIPrefab/UIWindows/");
break;
case ResourceType.Role:
sbr.Append("RolePrefab/");
break;
case ResourceType.Effect:
sbr.Append("EffectPrefab");
break;
case ResourceType.UIOther:
sbr.Append("UIPrefab/UIOther/");
break;
}
sbr.Append(path);
obj = Resources.Load(sbr.ToString()) as GameObject;
if(cache)
{
m_PrefabTable.Add(path, obj);
}
}
return GameObject.Instantiate(obj);
}
若加载角色资源
/// <summary>
/// 角色管理器
/// </summary>
public class RoleMgr : Singleton<RoleMgr>
{
#region LoadRole 根据角色名称克隆角色
/// <summary>
/// 根据角色名称克隆角色
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public GameObject LoadRole(string name,RoleType type)
{
string path = string.Empty;
switch (type)
{
case RoleType.MainPlayer:
path = "Player";
break;
case RoleType.Monster:
path = "Monster";
break;
}
return ResourcesMgr.Instance.Load(ResourcesMgr.ResourceType.Role, string.Format("{0}/{1}", path, name), cache: true);
}
#endregion
}
若加载窗口
/// <summary>
/// 场景UI管理器
/// </summary>
public class SceneUIMgr : Singleton<SceneUIMgr>
{
/// <summary>
/// 场景UI的类型
/// </summary>
public enum SceneUIType
{
/// <summary>
/// 登录
/// </summary>
LogOn,
/// <summary>
/// 加载
/// </summary>
Loading,
/// <summary>
/// 主城
/// </summary>
MainCity
}
/// <summary>
/// 当前场景UI
/// </summary>
public UISceneBase CurrentUIScene;
#region LoadSceneUI 加载场景UI
/// <summary>
/// 加载场景UI
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public GameObject LoadSceneUI(SceneUIType type)
{
GameObject obj = null;
switch(type)
{
case SceneUIType.LogOn:
obj = ResourcesMgr.Instance.Load(ResourcesMgr.ResourceType.UIScene, "UI Root_LogOnScene");
CurrentUIScene = obj.GetComponent<UISceneLogOnCtrl>();
break;
case SceneUIType.Loading:
break;
case SceneUIType.MainCity:
obj = ResourcesMgr.Instance.Load(ResourcesMgr.ResourceType.UIScene, "UI Root_City");
CurrentUIScene = obj.GetComponent<UISceneCityCtrl>();
break;
}
return obj;
}
#endregion
}