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("调用了回调函数");
            });
        }
    }
posted @ 2021-09-20 18:48  专心Coding的程侠  阅读(283)  评论(0)    收藏  举报