// // GameApp.cs // Create: // 2019-10-29 // Description: // 资源实现类,对 XAsset的 Asset进行绑定。 // Author: // 薛林强 <545626463@qq.com> // // Copyright (c) 2026 虚幻骑士科技 using System; using System.Collections; using System.IO; using System.Text; using System.Xml; using log4net; using log4net.Appender; using log4net.Config; using UnityEngine; using UnityEngine.Networking; using log4net.Util; using System.Collections.Generic; using Plugins.XAsset; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.ResourceProviders; using UnityEngine.SceneManagement; namespace Skyunion { class AddressAsset : IAsset where T :UnityEngine.Object { private AsyncOperationHandle mHanddler; private Queue mAttackObjects = new Queue(); int mRefCount = 0; private string mAssetName; private float fReleaseTime = 0.0f; public AddressAsset(AsyncOperationHandle handdler, string name, float fTime = 30.0f) { mHanddler = handdler; mAssetName = name; fReleaseTime = Time.realtimeSinceStartup + fTime; } public string assetName() { return mAssetName; } public UnityEngine.Object asset() { return mHanddler.Result; } public Scene scene() { return default(Scene); } public void UnloadScene() { } public void Attack(UnityEngine.Object obj) { mAttackObjects.Enqueue(obj); Retain(); } public void Release() { mRefCount--; if (mRefCount <= 0) { mRefCount = 0; //CoreUtils.logService.Info($"Release Handdle:{mHanddler.Result.name}", Color.green); Addressables.Release(mHanddler); mAttackObjects.Clear(); } } public void Retain() { mRefCount++; } public int Process() { if (Time.realtimeSinceStartup < fReleaseTime) return 0; // 目前先处理,只有绑定的才会处理自动销毁 if (mAttackObjects.Count > 0) { if (mAttackObjects.Peek() == null) { mAttackObjects.Dequeue(); Release(); } if (mRefCount == 0) return 1; return 2; } else { return 1; } } } class AddressSceneAsset : IAsset { private AsyncOperationHandle mHanddler; private Queue mAttackObjects = new Queue(); int mRefCount = 0; private string mAssetName; private float fReleaseTime = 0.0f; public AddressSceneAsset(AsyncOperationHandle handdler, string name, float fTime) { mHanddler = handdler; mAssetName = name; fReleaseTime = Time.realtimeSinceStartup + fTime; } public string assetName() { return mAssetName; } public Scene scene() { return mHanddler.Result.Scene; } public void UnloadScene() { Addressables.UnloadSceneAsync(mHanddler); } public UnityEngine.Object asset() { return null; } public void Attack(UnityEngine.Object obj) { mAttackObjects.Enqueue(obj); Retain(); } public void Release() { mRefCount--; if(mRefCount <= 0) { mRefCount = 0; Addressables.Release(mHanddler); mAttackObjects.Clear(); } } public void Retain() { mRefCount++; } public int RefCount() { return mRefCount; } public int Process() { if (Time.realtimeSinceStartup < fReleaseTime) return 0; // 目前先处理,只有绑定的才会处理自动销毁 if (mAttackObjects.Count > 0) { if (mAttackObjects.Peek() == null) { mAttackObjects.Dequeue(); Release(); } if (mRefCount == 0) return 1; return 2; } else { return 1; } } } }