赞
踩
Resources文件夹是Unity中标志性的目录(可以在1级目录,也可以在其他子目录),Resources目录下的文件不论使用与否,都会被强制打包到游戏包中,所以应尽可能去除不需要运行时加载的资源或者已经废弃掉的资源,否则会增大游戏包体积。且Resources下的文件不要直接当作预制体引用在场景中,否则会被Scene和Resources打包成两份,而应该在打开场景时加载Resources中的资源。
在不同目录下添加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); } }
封装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 }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。