2024-04-02 18:17:57 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2024-04-04 23:51:14 +08:00
|
|
|
|
using System.Threading.Tasks;
|
2024-04-03 14:38:44 +08:00
|
|
|
|
using Cysharp.Threading.Tasks;
|
2024-04-02 18:17:57 +08:00
|
|
|
|
using UnityEngine;
|
|
|
|
|
using UnityEngine.SceneManagement;
|
|
|
|
|
using YooAsset;
|
|
|
|
|
using Object = UnityEngine.Object;
|
|
|
|
|
|
|
|
|
|
namespace Game
|
|
|
|
|
{
|
|
|
|
|
public enum LoadType
|
|
|
|
|
{
|
|
|
|
|
Editor,
|
|
|
|
|
Single,
|
|
|
|
|
Online
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class ResourceManager : ManagerBase, IResourceManager
|
|
|
|
|
{
|
|
|
|
|
private List<string> _packageName = new List<string>();
|
|
|
|
|
private ResourcePackage _defaultPackage;
|
|
|
|
|
private Dictionary<string, AssetHandle> _assetHandles = new Dictionary<string, AssetHandle>();
|
|
|
|
|
private Dictionary<string, SceneHandle> _sceneHandles = new Dictionary<string, SceneHandle>();
|
|
|
|
|
private Dictionary<string, GameObject> _gameObjects = new Dictionary<string, GameObject>();
|
|
|
|
|
|
|
|
|
|
protected override void OnInit()
|
|
|
|
|
{
|
|
|
|
|
base.OnInit();
|
|
|
|
|
YooAssets.Initialize();
|
|
|
|
|
_defaultPackage = YooAssets.CreatePackage("DefaultPackage");
|
|
|
|
|
YooAssets.SetDefaultPackage(_defaultPackage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnUpdate(float dateTime)
|
|
|
|
|
{
|
|
|
|
|
base.OnUpdate(dateTime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void LoadPackage(string packageName)
|
|
|
|
|
{
|
|
|
|
|
if (_packageName.Contains(packageName)) return;
|
|
|
|
|
YooAssets.CreatePackage(packageName);
|
|
|
|
|
_packageName.Add(packageName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void UnloadPackage(string packageName)
|
|
|
|
|
{
|
|
|
|
|
var resourcePackage = YooAssets.GetPackage(packageName);
|
|
|
|
|
if (resourcePackage != null)
|
|
|
|
|
{
|
|
|
|
|
resourcePackage.UnloadUnusedAssets();
|
|
|
|
|
YooAssets.DestroyPackage(packageName);
|
|
|
|
|
_packageName.Remove(packageName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-03 14:38:44 +08:00
|
|
|
|
public async UniTask InitLoadModeAsync(LoadType _loadType)
|
2024-04-02 18:17:57 +08:00
|
|
|
|
{
|
|
|
|
|
switch (_loadType)
|
|
|
|
|
{
|
|
|
|
|
case LoadType.Editor:
|
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
|
Debug.Log("EditorMode-Loading");
|
2024-04-03 14:38:44 +08:00
|
|
|
|
await InitializeYooAsset_Editor();
|
2024-04-02 18:17:57 +08:00
|
|
|
|
#endif
|
|
|
|
|
break;
|
|
|
|
|
case LoadType.Single:
|
|
|
|
|
Debug.Log("SingleMode-Loading");
|
2024-04-03 14:38:44 +08:00
|
|
|
|
await InitializeYooAsset_Single();
|
2024-04-02 18:17:57 +08:00
|
|
|
|
break;
|
|
|
|
|
case LoadType.Online:
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw new ArgumentOutOfRangeException();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if UNITY_EDITOR
|
2024-04-03 14:38:44 +08:00
|
|
|
|
private async UniTask InitializeYooAsset_Editor()
|
2024-04-02 18:17:57 +08:00
|
|
|
|
{
|
|
|
|
|
var initParameters = new EditorSimulateModeParameters();
|
|
|
|
|
var simulateManifestFilePath =
|
|
|
|
|
EditorSimulateModeHelper.SimulateBuild(EDefaultBuildPipeline.BuiltinBuildPipeline, "DefaultPackage");
|
|
|
|
|
initParameters.SimulateManifestFilePath = simulateManifestFilePath;
|
2024-04-03 14:38:44 +08:00
|
|
|
|
await _defaultPackage.InitializeAsync(initParameters);
|
2024-04-02 18:17:57 +08:00
|
|
|
|
Debug.Log("EditorMode-LoadFinish");
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
2024-04-03 14:38:44 +08:00
|
|
|
|
private async UniTask InitializeYooAsset_Single()
|
2024-04-02 18:17:57 +08:00
|
|
|
|
{
|
|
|
|
|
var initParameters = new OfflinePlayModeParameters();
|
2024-04-03 14:38:44 +08:00
|
|
|
|
await _defaultPackage.InitializeAsync(initParameters);
|
2024-04-02 18:17:57 +08:00
|
|
|
|
Debug.Log("SingleMode-LoadFinish");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// private IEnumerator InitializeYooAsset_Online()
|
|
|
|
|
// {
|
|
|
|
|
// // 注意:GameQueryServices.cs 太空战机的脚本类,详细见StreamingAssetsHelper.cs
|
|
|
|
|
// string defaultHostServer = "http://127.0.0.1/CDN/Android/v1.0";
|
|
|
|
|
// string fallbackHostServer = "http://127.0.0.1/CDN/Android/v1.0";
|
|
|
|
|
// var initParameters = new HostPlayModeParameters();
|
|
|
|
|
// initParameters.BuildinQueryServices = new GameQueryServices();
|
|
|
|
|
// initParameters.DecryptionServices = new FileOffsetDecryption();
|
|
|
|
|
// initParameters.RemoteServices = new RemoteServices(defaultHostServer, fallbackHostServer);
|
|
|
|
|
// var initOperation = package.InitializeAsync(initParameters);
|
|
|
|
|
// yield return initOperation;
|
|
|
|
|
//
|
|
|
|
|
// if (initOperation.Status == EOperationStatus.Succeed)
|
|
|
|
|
// {
|
|
|
|
|
// Debug.Log("资源包初始化成功!");
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
// {
|
|
|
|
|
// Debug.LogError($"资源包初始化失败:{initOperation.Error}");
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
public AssetHandle LoadAssetSync(string name)
|
|
|
|
|
{
|
|
|
|
|
if (_assetHandles.TryGetValue(name, out var assetHandle))
|
|
|
|
|
{
|
|
|
|
|
return assetHandle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var loadAssetSync = YooAssets.LoadAssetSync(name);
|
|
|
|
|
_assetHandles.Add(name, loadAssetSync);
|
|
|
|
|
return loadAssetSync;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public GameObject LoadGameObjectSync(string name)
|
|
|
|
|
{
|
|
|
|
|
var loadAssetSync = LoadAssetSync(name);
|
|
|
|
|
var assetObject = loadAssetSync.AssetObject as GameObject;
|
|
|
|
|
var gameObject = Object.Instantiate(assetObject);
|
|
|
|
|
|
|
|
|
|
return gameObject;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-03 14:38:44 +08:00
|
|
|
|
public GameObject LoadUIGameObjectSync(string name)
|
|
|
|
|
{
|
|
|
|
|
var loadAssetSync = LoadAssetSync(name);
|
|
|
|
|
var assetObject = loadAssetSync.AssetObject as GameObject;
|
|
|
|
|
var parent = GameObject.Find("Global/UICanvas").transform;
|
|
|
|
|
|
2024-04-03 17:46:56 +08:00
|
|
|
|
var gameObject = Object.Instantiate(assetObject, parent);
|
2024-04-03 14:38:44 +08:00
|
|
|
|
|
|
|
|
|
return gameObject;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async UniTask LoadSceneAsync(string name, LoadSceneMode loadSceneMode = LoadSceneMode.Single,
|
2024-04-02 18:17:57 +08:00
|
|
|
|
bool suspendLoad = false)
|
|
|
|
|
{
|
|
|
|
|
// if (_assetHandles.TryGetValue(name, out var assetHandle))
|
|
|
|
|
// {
|
|
|
|
|
// return assetHandle;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
var loadSceneAsync = YooAssets.LoadSceneAsync(name, loadSceneMode, suspendLoad);
|
|
|
|
|
_sceneHandles.Add(name, loadSceneAsync);
|
|
|
|
|
await loadSceneAsync.Task;
|
|
|
|
|
Debug.Log($"{name}场景加载成功!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async void UnloadSceneAsync(string name, LoadSceneMode loadSceneMode = LoadSceneMode.Single,
|
|
|
|
|
bool suspendLoad = false)
|
|
|
|
|
{
|
|
|
|
|
if (_sceneHandles.TryGetValue(name, out var handle))
|
|
|
|
|
{
|
|
|
|
|
await handle.UnloadAsync().Task;
|
|
|
|
|
Debug.Log($"{name}场景卸载成功!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-03 14:38:44 +08:00
|
|
|
|
public async UniTask<Object> LoadAssetAsync(string name)
|
2024-04-02 18:17:57 +08:00
|
|
|
|
{
|
|
|
|
|
if (_assetHandles.TryGetValue(name, out var assetHandle))
|
|
|
|
|
{
|
|
|
|
|
return assetHandle.AssetObject;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var loadAssetSync = YooAssets.LoadAssetAsync(name);
|
|
|
|
|
await loadAssetSync.Task;
|
|
|
|
|
_assetHandles.Add(name, loadAssetSync);
|
|
|
|
|
return loadAssetSync.AssetObject;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-03 14:38:44 +08:00
|
|
|
|
public async UniTask<GameObject> LoadGameObjectAsync(string name)
|
2024-04-02 18:17:57 +08:00
|
|
|
|
{
|
|
|
|
|
var loadAssetSync = await LoadAssetAsync(name);
|
|
|
|
|
var assetObject = loadAssetSync as GameObject;
|
|
|
|
|
var gameObject = Object.Instantiate(assetObject);
|
|
|
|
|
|
|
|
|
|
return gameObject;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Release(string name)
|
|
|
|
|
{
|
|
|
|
|
if (_assetHandles.TryGetValue(name, out var assetHandle))
|
|
|
|
|
{
|
|
|
|
|
assetHandle.Release();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnDispose()
|
|
|
|
|
{
|
|
|
|
|
base.OnDispose();
|
|
|
|
|
while (_packageName.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
var packageName = _packageName[0];
|
|
|
|
|
UnloadPackage(packageName);
|
|
|
|
|
_packageName.Remove(packageName);
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-05 11:59:11 +08:00
|
|
|
|
// foreach (var handle in _sceneHandles.Values)
|
|
|
|
|
// {
|
|
|
|
|
// UnloadSceneAsync(handle.SceneName);
|
|
|
|
|
// }
|
2024-04-02 18:17:57 +08:00
|
|
|
|
|
|
|
|
|
_sceneHandles = null;
|
|
|
|
|
_packageName = null;
|
|
|
|
|
_gameObjects = null;
|
|
|
|
|
_assetHandles = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// public class GO_S
|
|
|
|
|
// {
|
|
|
|
|
// public string name;
|
|
|
|
|
// private AssetHandle AssetHandle;
|
|
|
|
|
// private GameObject go;
|
|
|
|
|
//
|
|
|
|
|
// public GO_S(string name, AssetHandle assetHandle, GameObject go)
|
|
|
|
|
// {
|
|
|
|
|
// this.name = name;
|
|
|
|
|
// AssetHandle = assetHandle;
|
|
|
|
|
// this.go = go;
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// public void Release()
|
|
|
|
|
// {
|
|
|
|
|
// AssetHandle.Release();
|
|
|
|
|
// GameObject.Destroy(go);
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
public interface IResourceManager
|
|
|
|
|
{
|
|
|
|
|
AssetHandle LoadAssetSync(string name);
|
2024-04-05 11:59:11 +08:00
|
|
|
|
GameObject LoadGameObjectSync(string path);
|
2024-04-04 23:51:14 +08:00
|
|
|
|
GameObject LoadUIGameObjectSync(string path);
|
|
|
|
|
|
|
|
|
|
UniTask LoadSceneAsync(string name, LoadSceneMode loadSceneMode = LoadSceneMode.Single,bool suspendLoad = false);
|
2024-04-02 18:17:57 +08:00
|
|
|
|
}
|
|
|
|
|
}
|