当前位置:   article > 正文

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

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述

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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

若加载角色资源

/// <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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

若加载窗口

/// <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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/566289
推荐阅读
相关标签
  

闽ICP备14008679号