Unity中Resources.Load加载资源及其封装

1.Resources介绍

Resources文件夹是Unity中标志性的目录(可以在1级目录,也可以在其他子目录),Resources目录下的文件不论使用与否,都会被强制打包到游戏包中,所以应尽可能去除不需要运行时加载的资源或者已经废弃掉的资源,否则会增大游戏包体积。且Resources下的文件不要直接当作预制体引用在场景中,否则会被Scene和Resources打包成两份,而应该在打开场景时加载Resources中的资源。

2.Resources.Load加载各类游戏资源

在不同目录下添加Resources文件,但是Unity会将所有的Resouces文件合并,所以加载时他们仍在同一目录下。
我们在两个目录下添加了Resources文件

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

}
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值