同步異步加載Resources下的資源

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class ResLoadMgrMono : MonoBehaviour {

// Use this for initialization
void Start () {
	
}

// Update is called once per frame
void Update () {
    if (Input.GetKeyDown(KeyCode.S))
    {
        //同步加載資源
        GameObject a = ResLoadMgr.Instance().Load<GameObject>("pool/Cube");
        //做一些資源真正加載出來後,想要做的事情
        a.transform.localScale = Vector3.one * 2;
    }
    if (Input.GetKeyDown(KeyCode.A))
    {
        //異步加載資源
        ResLoadMgr.Instance().LoadAsync<GameObject>("pool/Cube", OnLoadAsync);//委託
    }
}
/// <summary>
/// 委託
/// </summary>
/// <param name="obj"></param>
private void OnLoadAsync(GameObject obj)
{
    //做一些資源真正加載出來後,想要做的事情
    obj.transform.localScale = Vector3.one * 2;
}
/// <summary>
/// 同步加載資源
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="path"></param>
/// <returns></returns>
public T Load<T>(string path) where T : Object
{
    T res = Resources.Load<T>(path);
    if (res is GameObject)
    {
        return GameObject.Instantiate(res);
    }
    else
    {
        return res;
    }

}
/// <summary>
/// 開啓異步加載
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="path"></param>
/// <param name="action"></param>
public void LoadAsync<T>(string path, UnityAction<T> action) where T : Object
{
    //開啓攜程
    StartCoroutine(ResLoadAsync(path, action));
}
/// <summary>
/// 異步加載資源
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="path"></param>
/// <param name="action"></param>
/// <returns></returns>
private IEnumerator ResLoadAsync<T>(string path, UnityAction<T> action) where T : Object
{
    ResourceRequest r = Resources.LoadAsync<T>(path);

    yield return r;
    if (r.asset is GameObject)
    {
        action(GameObject.Instantiate(r.asset) as T);
    }
    else
    {
        action(r.asset as T);
    }
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章