Unity程序基础框架(五) 资源加载模块
ProjectBase中新建一个目录Res,再里面新建一个脚本——ResMgr.cs
需要注意的是,异步加载中,调用异步加载后,物体并没有被加载,需要等n帧才会被加载,所以我们不能直接返回物体,而是在方法中将物体传出去。
//资源加载模块 public class ResMgr : BaseManager<ResMgr> { //同步加载资源 public T Load<T>(string name) where T:Object{ T res = Resources.Load<T>(name); ; //如果对象是一个GameObject类型的,我把它实例化后,再返回出去直接使用。 if (res is GameObject) return GameObject.Instantiate(res); else //else情况示例:TextAsset、AudioClip return res; } //异步加载资源 public void LoadAsync<T>(string name,UnityAction<T> callback) where T:Object { //开启异步加载的协程 MonoMgr.GetInstance().StartCoroutine(ReallyLoadAsync<T>(name,callback)); } private IEnumerator ReallyLoadAsync<T>(string name,UnityAction<T> callback) where T:Object{ ResourceRequest r=Resources.LoadAsync<T>(name); yield return r; if (r.asset is GameObject) { //实例化一下再传给方法 callback(GameObject.Instantiate(r.asset) as T); } else { //直接传给方法 callback(r.asset as T); } } }
ResTest测试脚本,挂载到场景中。
public class ResTest : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if (Input.GetMouseButtonDown(0)) { var obj= ResMgr.GetInstance().Load<GameObject>("Prefabs/Capsule"); obj.transform.localScale *= 2; Debug.Log("资源加载成功!"+obj.name); } if (Input.GetMouseButtonDown(1)) { ResMgr.GetInstance().LoadAsync<GameObject>("Prefabs/Capsule",(obj)=> { obj.transform.localScale *= 2; Debug.Log("资源加载成功!" + obj.name); }); Debug.Log("没我啥事情!" ); } } }
为了方便,我们还可以直接使用Lambda表达式来方便书写
private void Update() { if (Input.GetMouseButtonDown(1)) { ResMgr.GetInstance().LoadAsync<GameObject>("cube", (obj) => { Debug.Log("调用了回调函数"); }); } }