using FairyGUI; using System.Collections.Generic; using System.IO; using UnityEngine; using VEngine; namespace GFGGame { public class GFGUIPackage { private static Dictionary _packages = new Dictionary(); private static Dictionary> _assetDic = new Dictionary>(); private static Dictionary _assetCount = new Dictionary(); public static UIPackage AddPackage(string descFilePath) { int count = _assetCount.ContainsKey(descFilePath) ? _assetCount[descFilePath] : 0; if (_packages.ContainsKey(descFilePath)) { _assetCount[descFilePath] = count + 1; return _packages[descFilePath]; } var asset = Asset.Load($"{descFilePath}_fui.bytes", typeof(TextAsset)); AddAsset(descFilePath, asset); var uiPackage = UIPackage.AddPackage((asset.asset as TextAsset).bytes, descFilePath, (string name, string extension, System.Type type, out DestroyMethod destroyMethod) => { destroyMethod = DestroyMethod.Unload; string path = name + extension; if (Versions.Contains(path)) { var asset = Asset.Load(path, type); AddAsset(descFilePath, asset); return asset.asset; } return null; }); _assetCount.Add(descFilePath, count + 1); _packages.Add(descFilePath, uiPackage); return uiPackage; } public static void RemovePackage(string descFilePath) { UIPackage package; if (_packages.TryGetValue(descFilePath, out package)) { int count = _assetCount[descFilePath] - 1; _assetCount[descFilePath] = count; if (count > 0) return; _assetCount.Remove(descFilePath); _packages.Remove(descFilePath); UIPackage.RemovePackage(package.name); List list = null; if (_assetDic.TryGetValue(descFilePath, out list)) { foreach (var asset in list) { asset.Release(); } } } } private static void AddAsset(string key, Asset asset) { List list = null; if (!_assetDic.TryGetValue(key, out list)) { list = new List(); _assetDic.Add(key, list); } list.Add(asset); } } }