目录
简介
这里记录一个资源管理工具集,提供一些方法将一些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");