using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.ResourceManagement.AsyncOperations; public class ResMgr : Singleton { public T Load(string name)where T:Object { T res = Resources.Load(name); if (res is GameObject) return Object.Instantiate(res); else return res; } public T Load(string name,Vector3 position,Quaternion rotation) where T : Object { T res = Resources.Load(name); if (res is GameObject) return Object.Instantiate(res, position, rotation); else return res; } public void LoadAsync(string name,UnityAction callback)where T:Object { MonoMgr.Instance.StartCoroutine(ReallyLoadAsync(name,callback)); } private IEnumerator ReallyLoadAsync(string name,UnityAction callback)where T:Object { ResourceRequest r = Resources.LoadAsync(name); yield return r; if (r.asset is GameObject) { callback(Object.Instantiate(r.asset) as T); } else { callback(r.asset as T); } } #region 异步加载使用方法(得到加载物体并设定位置等) //需要注意的是,异步加载中,调用异步加载后,物体并没有被加载,需要等n帧才会被加载,所以我们不能直接返回物体,而是在方法中将物体传出去。 //private void Update() //{ // if (Input.GetMouseButtonDown(1)) // { // ResMgr.Instance.LoadAsync("cube", DoSome); // } //} //private void DoSome(GameObject obj) //{ // Debug.Log("调用了回调函数"); //} ////为了方便,我们还可以直接使用Lambda表达式来方便书写 //private void Update() //{ // if (Input.GetMouseButtonDown(1)) // { // ResMgr.GetInstance().LoadAsync("cube", (obj) => // { // Debug.Log("调用了回调函数"); // }); // } //} #endregion //Addressable public void AALoadAsync(string name, UnityAction callback) where T : Object { MonoMgr.Instance.StartCoroutine(AAReallyLoadAsync(name, callback)); } private IEnumerator AAReallyLoadAsync(string name, UnityAction callback) where T : Object { AsyncOperationHandle async = Addressables.LoadAssetAsync(name); yield return async; if (async.Result is GameObject) { callback(Object.Instantiate(async.Result as GameObject) as T); } else { callback(async.Result as T); } } }