using Axibug; using Axibug.Event; using Axibug.Resources; using Axibug.Runtime; using System.Collections.Generic; using System.IO; using System.Linq; using TMPro; using UnityEditor; using UnityEngine; namespace Game { public class ResourcesComponent : GameComponent { public delegate void CallBackFunction(Object obj, CallbackType err, object userData = null); private Dictionary _dicAssetToFuns; private List _skillIcons = new List(); private string _rootPath = "Assets/GameAssets"; protected override void Awake() { base.Awake(); } private void Start() { _dicAssetToFuns = new Dictionary(); PrefabManager.LoadPrefabSuccess += OnLoadPrefabSuccess; PrefabManager.LoadPrefabFailure += OnLoadPrefabFailure; //TODO 如果需要初始化 } private void OnLoadPrefabSuccess(object sender, LogicEventArgs e) { LoadPrefabSuccessEventArgs prefab = (LoadPrefabSuccessEventArgs)e; if (prefab == null) throw new GameException("LoadPrefabSuccessEventArgs = null"); if (!_dicAssetToFuns.TryGetValue(prefab.AssetName, out CallBackFunction fun)) return; fun(prefab.obj, CallbackType.Success, prefab.UserData); } private void OnLoadPrefabFailure(object sender, LogicEventArgs e) { LoadPrefabFailureEventArgs prefab = (LoadPrefabFailureEventArgs)e; if (prefab == null) throw new GameException("LoadPrefabFailureEventArgs = null"); if (!_dicAssetToFuns.TryGetValue(prefab.AssetName, out CallBackFunction fun)) return; Log.Warning($"abName = {prefab.Name}, assetName = {prefab.AssetName}"); fun(null, CallbackType.NullAsset); } private string GetBundleName(string assetsName, bool isFolder = false) { //Assets/GameAssets/Character/Player/GS_M/Prefab/GS_M.prefab //Assets/GameAssets/Prefabs/UI/Loading/Loading.prefab if (string.IsNullOrEmpty(assetsName)) throw new GameException("GetBundleName---assetsName is invalid"); //Character/Player/GS_M/Prefab/GS_M.prefab //Prefabs/UI/Loading/Loading.prefab string tmp = assetsName.Remove(0, _rootPath.Length + 1); if (isFolder) return tmp.ToLower(); //Character/Player/GS_M/Prefab int idx = tmp.LastIndexOf('/'); string bundleName = tmp.Substring(0, idx); //if(bundleName.Contains("Character") || bundleName.Contains("Maps") // || bundleName.Contains("MiniMapTexture") || bundleName.Contains("TMPColor")) if (bundleName.Contains("Character") || bundleName.Contains("TMPColor")) { idx = bundleName.LastIndexOf('/'); //Character/Player/GS_M bundleName = bundleName.Substring(0, idx); } //prefabs/ui/loading return bundleName.ToLower(); } public void LoadAssetAsync(string assetName, CallBackFunction fun = null, object userData = null) { if (fun != null && !_dicAssetToFuns.ContainsKey(assetName)) _dicAssetToFuns.Add(assetName, fun); string abName = GetBundleName(assetName); if (AppEntry.Base.EditorResourceMode) LoadAssetByEditorAsync(abName, assetName, fun, userData); else LoadPrefabByABAsync(abName, assetName, null, userData); } public void LoadAssetAsync(string abName, string assetName, CallBackFunction fun = null, object userData = null) { if (fun != null && !_dicAssetToFuns.ContainsKey(assetName)) _dicAssetToFuns.Add(assetName, fun); if (AppEntry.Base.EditorResourceMode) LoadAssetByEditorAsync(abName, assetName, fun, userData); else LoadPrefabByABAsync(abName, assetName, null, userData); } // public Sprite LoadSprite(string atlas, string spriteName, bool isAtlas = true, string suffix = "png") // { // if (AppEntry.Base.EditorResourceMode) // { //#if UNITY_EDITOR // string assetName = Utility.Path.GetImageUIPath(atlas, spriteName, suffix); // return AssetDatabase.LoadAssetAtPath(assetName); //#endif // return null; // } // else // { // string atlasFullPath = $"Assets/GameAssets/Image/UI/{atlas}"; // if (atlas.Contains("Icon/")) // atlas = atlas.Split('/')[1]; // string abName = GetBundleName($"{atlasFullPath}/{atlas}"); // if (isAtlas) // return LoadAtlasSprite(abName, atlas, spriteName); // return AssetManager.LoadAsset(abName, spriteName); // } // } //public Sprite LoadAtlasSprite(string abName, string atlas, string spriteName) //{ // string assetName = Utility.Path.GetImageUIPath(atlas, spriteName); // if (AppEntry.Base.EditorResourceMode) // return LoadSpriteByEditor(assetName); //LoadAssetByEditor Obj强转Sprite无效 // else // return LoadPrefabByAB(abName, assetName, null); //} private Sprite LoadSpriteByEditor(string assetName) { #if UNITY_EDITOR Sprite asset = AssetDatabase.LoadAssetAtPath(assetName); return asset; #endif return null; } /* public TMP_ColorGradient LoadColorGradient(string ColorName) { if (AppEntry.Base.EditorResourceMode) { #if UNITY_EDITOR string assetName = Utility.Path.GetColorGradientPath(ColorName); return AssetDatabase.LoadAssetAtPath(assetName); #endif return null; } else { string atlasFullPath = $"Assets/GameAssets/Font/TMPColor/{ColorName}"; string abName = GetBundleName($"{atlasFullPath}"); return AssetManager.LoadAsset(abName, ColorName); } }*/ public T[] LoadAssets(string folder) where T : Object { string path = GetBundleName(folder, true); #if UNITY_EDITOR if(AppEntry.Base.EditorResourceMode) { FileInfo[] files = new DirectoryInfo(folder).GetFiles(); List objs = new List(); foreach (FileInfo file in files) { if (file.FullName.EndsWith(".meta")) continue; int idx = file.FullName.IndexOf("Assets"); path = file.FullName.Substring(idx); T obj = AssetDatabase.LoadAssetAtPath(path); objs.Add(obj); //var obj = LoadAssetByEditor(path); //objs.Add((T)obj); } return objs.ToArray(); } #endif return AssetManager.LoadAssets(path); } private void LoadAssetByEditorAsync(string abName, string assetName, CallBackFunction fun = null, object userData = null) { #if UNITY_EDITOR Object asset = AssetDatabase.LoadAssetAtPath(assetName); if (asset != null) { LoadPrefabSuccessEventArgs success = LoadPrefabSuccessEventArgs.Create(abName, assetName, 0, asset, userData); OnLoadPrefabSuccess(null, success); ReferencePool.Release(success); } else { LoadPrefabFailureEventArgs failure = LoadPrefabFailureEventArgs.Create(abName, assetName, 0); OnLoadPrefabFailure(null, failure); ReferencePool.Release(failure); } #endif } public void Clone(string assetName, CallBackFunction fun = null, Transform parent = null, object userData = null, string abSuffix = null) { if (fun != null) { if (!_dicAssetToFuns.ContainsKey(assetName)) _dicAssetToFuns.Add(assetName, fun); else _dicAssetToFuns[assetName] = fun; } string abName = GetBundleName(assetName); if (AppEntry.Base.EditorResourceMode) LoadPrefabByEditor(abName, assetName, parent, userData); else { LoadPrefabByABAsync(abName, assetName, parent, userData); } } // 同步实例化预制体 public GameObject CloneBySync(string assetName, Transform parent = null, string abSuffix = null) { string abName = GetBundleName(assetName); Object asset = null; if(AppEntry.Base.EditorResourceMode) { #if UNITY_EDITOR asset = AssetDatabase.LoadAssetAtPath(assetName); #endif } else { asset = LoadPrefabByAB(abName, assetName, parent); } if (asset == null) { Debug.LogError($"asset加载失败,path={assetName}"); return null; } GameObject go = Instantiate(asset, parent) as GameObject; if (go == null) { Debug.LogError("LoadPrefabByEditor2. go == null. asset:" + asset); int id = assetName.GetHashCode(); LoadPrefabFailureEventArgs failure = LoadPrefabFailureEventArgs.Create(abName, assetName, id); OnLoadPrefabFailure(null, failure); ReferencePool.Release(failure); } return go; } private void LoadPrefabByEditor(string abName, string assetName, Transform parent = null, object userData = null) { #if UNITY_EDITOR Object asset = AssetDatabase.LoadAssetAtPath(assetName); if(asset == null) { Log.Error($"asset加载失败,path={assetName}"); return; } GameObject go = Instantiate(asset, parent) as GameObject; int id = assetName.GetHashCode(); if (go != null) { LoadPrefabSuccessEventArgs success = LoadPrefabSuccessEventArgs.Create(abName, assetName, id, go, userData); OnLoadPrefabSuccess(null, success); ReferencePool.Release(success); } else { LoadPrefabFailureEventArgs failure = LoadPrefabFailureEventArgs.Create(abName, assetName, id); OnLoadPrefabFailure(null, failure); ReferencePool.Release(failure); } #endif } private void LoadPrefabByABAsync(string abName, string assetName, Transform parent = null, object userData = null) { int id = assetName.GetHashCode(); PrefabManager.LoadPrefabAsync(abName, assetName, id, parent, userData); } private T LoadPrefabByAB(string abName, string assetName, Transform parent = null) where T : Object { int id = assetName.GetHashCode(); return PrefabManager.LoadPrefab(abName, assetName, id, parent); } public void Destory(string assetName) { if (AppEntry.Base.EditorResourceMode) { int startIdx = assetName.LastIndexOf('/') + 1; int endIdx = assetName.IndexOf('.'); assetName = assetName.Substring(startIdx, endIdx - startIdx); assetName += "(Clone)"; Transform trans = GamePlayEntry.UI.transform.Find(assetName); if (trans == null) return; DestroyImmediate(trans.gameObject); } else PrefabManager.DestoryByAssetName(assetName); } public Object LoadAsset(string assetName) { string abName = GetBundleName(assetName); #if UNITY_EDITOR return AssetDatabase.LoadAssetAtPath(assetName); #else return AssetManager.LoadAsset(abName, assetName.ToLower()); #endif } public void RemoveAsset(string assetName) { if (!AppEntry.Base.EditorResourceMode) AssetManager.Unload(assetName); } } }