资源加载,异步加载和同步加载
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class ResManager : SingletonMono<ResManager>
{
//同步加载资源
public T Load<T>(string resName) where T : Object
{
T resObj = Resources.Load<T>(resName);
if (resObj is GameObject)
return GameObject.Instantiate(resObj);
else
return resObj;
}
//异步加载资源
public void LoadAysnc<T>(string resName, UnityAction<T> callback) where T : Object
{
//开启异步加载的协程
MonoMgr.GetInstance().StartCoroutine(LoadAsyncCor(resName, callback));
}
//真正的协同程序函数 用于 开启异步加载对应的资源
public IEnumerator LoadAsyncCor<T>(string resName, UnityAction<T> callback) where T : Object
{
ResourceRequest R = Resources.LoadAsync<T>(resName);
yield return R;
if (R.asset is GameObject)
callback(GameObject.Instantiate(R.asset) as T);
else
callback(R.asset as T);
}
}
异步加载,场景不会卡,但是instantate会卡。
Load | 同步加载 |
LoadAysnc | 异步加载 |
测试:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ResLoadTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
ResManager.GetInstance().Load<GameObject>("Test/Cube1");
ResManager.GetInstance().LoadAysnc<GameObject>("Test/Sphere1", (obj) => {
obj.transform.localScale *= 2;
Debug.Log("资源加载测试成功");
});
}
}
}