目录

简介

加载资源的几种方式

资源加载的管理器Resload.cs

ResLoad类的应用举例


简介

  这里记录一个资源管理工具集,提供一些方法将一些Object、Prefab直接从Assets文件夹中加载到场景中。

加载资源的几种方式

  在项目中我们经常需要使用一些随时取用的东西,可能是预制体格式,也可能是任何格式,如材质、文档甚至场景。在之前的文章中主要采取了下面的1、2两种方式获取:

  1. 设置public变量并在面板中指定相应资源

  这个方法之前使用过非常多了,只要在脚本中public一个变量,然后到面板中拖入相应的对象即可。如:  

public GameObject Bullet;//加入一个子弹

 

  优点:直观

  缺点:一旦脚本修改或重新挂载很容易忘记设置

  2. 在场景中寻找

  也就是一开始就将资源加载到场景中,在脚本中使用GameObject.Find来查找,比如之前在机械臂场景2中,脚本中根据路径去找机械臂的子节点:

  优点:方便,不用做过多设置

  缺点:GameObject.Find或transform.Find等,运行时会遍历场上所有节点(包括所有子节点),比较消耗资源。

  3. 从Assets文件夹下加载

 

   将资源放置在“Assets/Resources”文件夹下,且这个文件夹名字不能改。需要使用时,用Unity的API“Resources.Load”加载。定义如下,其中的参数 path,就是以Resources文件夹作为父目录的:

        public static Object Load(string path)

        public static T Load<T>(string path) where T : Object

资源加载的管理器Resload.cs

  Unity的Resources类中有许多有用的资源加载方法。在它的基础上,我们可以根据自身项目的需要,建立一个资源管理文件ResLoad.cs,以便于在项目中方便地调用各种类型的文件。下面的ResLoad.cs中定义了3个加载资源的方法,包括泛型方法,以便于能够加载任何类型的文件,之后可能会根据需要再增加其他方法。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//从Assets加载资源的方法集合
public class ResLoad : SingleMono<ResLoad>  //继承Mono的单例
{
    public GameObject LoadPrefab(string resName)
    {//通过资源名添加预制体,资源需要放在Resources根目录
        GameObject go = Resources.Load<GameObject>(resName);
        if(go==null)
        {//判断是否加载成功
            Debug.LogError(resName+"ResLoad:Resources加载路径失败");
            return null;
        }
        return Instantiate(go);  //如果加载成功,则实例化它
        //因为ResLoad类是继承了SingleMono<ResLoad>的单例,
        //这个单例是继承MonoBehaviour的,因此直接可以使用Instantiate方法实例化
        //否则就需要用GameObject来调用
        //return GameObject.Instantiate(go);
    }

    public T LoadAsset<T>(string pathName,string resName) where T:Object
    {//通过路径加载资源,当然也可以先判空一下
        return Resources.Load<T>(pathName + "/" + resName);
    }

    public T LoadAsset<T>(string resName)
        where T :Object
    {//通过资源名加载,比如这个资源直接放在根目录下
        return Resources.Load<T>(resName);
    }
}

ResLoad类的应用举例

 ResLoad类继承了SingleMono,因此在使用时不需要每次new对象,使用Instance字段就可以新建或访问到项目内唯一的实例。以下是调用举例:

  1. 在工具集Tools.cs中,加载了Resources文件夹中名为“line”的材质文件:

line.material=Resload.Instance.LoadAsset<Material>("line"); 

  2. 主角使用子弹时,按下Space按键,加载Resources文件夹中名为“Bullet”的预制体:

Bullet = Resload.Instance.LoadPrefab("Bullet");

Logo

苏州本地的技术开发者社区,在这里可以交流本地的好吃好玩的,可以交流技术,可以交流招聘等等,没啥限制。

更多推荐