using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; using System; using System.Collections; using System.Linq.Expressions; using System.ComponentModel; using System.Collections.Generic; using Object = UnityEngine.Object; using Component = UnityEngine.Component; public enum Folder { Skill, Object, Shader, Garden, SpriteUI, PrefabUI, Character, } public enum ObjType { Null, Flower, HudText, FlowerItem, } public class ManaReso : MonoBehaviour { #region 变量 public static Dictionary ObjDic; public static Dictionary TraDic; public static Dictionary> ObjectPool; #endregion private void Awake() { TraDic = new Dictionary(); ObjDic = new Dictionary(); ObjectPool = new Dictionary>(); Transform objPool = new GameObject("ObjPool").transform; objPool.parent = transform; objPool.SetActive(false); TraDic.Add(objPool.name, objPool); } public static T Load(string goName, Folder folder, ObjType objType = ObjType.Null) where T : Object { Object obj; if (ObjDic.TryGetValue(goName, out obj)) { return (T)obj; } else { T t; if (folder == Folder.Skill) { t = Resources.Load(@"Sprite\SpriteUI\Skill\" + goName); } else if (folder == Folder.Object) { t = Resources.Load(@"Prefab\Object\" + goName); } else if (folder == Folder.Garden) { t = Resources.Load(@"Sprite\Garden\" + goName); } else if (folder == Folder.SpriteUI) { t = Resources.Load(@"Sprite\SpriteUI\" + goName); } else if (folder == Folder.Shader) { t = Resources.Load(@"Shader\" + goName); } else if (folder == Folder.PrefabUI) { t = Resources.Load(@"Prefab\PrefabUI\" + goName); } else if (folder == Folder.Character) { t = Resources.Load(@"Sprite\Character\" + goName); } else { throw new Exception(); } if (t == null) { throw new Exception(goName); } ObjDic.Add(goName, t); if (objType != ObjType.Null) { ObjectPool.Add(objType, new List()); } return t; } } public static Transform Get(string goName, Folder folder, bool compile, Transform par, Vector3 pos, ObjType objType = ObjType.Null) { Transform tra = Get(objType); if (tra != null) { tra.SetParent(par); tra.position = pos; return tra; } else { GameObject go = Load(goName, folder, objType); go = Instantiate(go, pos, Quaternion.identity, par); go.name = go.name.Replace("(Clone)", ""); if (compile) { Auxiliary.CompileDic(go.transform, TraDic); } return go.transform; } } public static Transform Get(string goName, Folder folder, bool compile, Transform par, bool worldSpace, ObjType objType = ObjType.Null) { Transform tra = Get(objType); if (tra == null) { GameObject go = Load(goName, folder, objType); go = Instantiate(go, par, worldSpace); go.name = go.name.Replace("(Clone)", ""); if (compile) { Auxiliary.CompileDic(go.transform, TraDic); } return go.transform; } else { tra.SetParent(par); return tra; } } public static Flower GetFlower(FlowerInfo flowerInfo, Slot slot, bool collider) { Transform tra = Get("Flower", Folder.Object, false, slot.transform, false, ObjType.Flower); Flower flower = tra.GetComponent(); if (flower == null) { flower = tra.AddComponent(); flower.ObjType = ObjType.Flower; flower.LocalPos = flower.transform.localPosition; } else { flower.transform.localPosition = flower.LocalPos; } flower.FlowerInfo = flowerInfo; flower.Slot = slot; flower.SetCollider(collider); return flower; } public static Flower GetFlower(FlowerInfo flowerInfo, Transform par) { Transform tra = Get("Flower", Folder.Object, false, par, false, ObjType.Flower); Flower flower = tra.GetComponent(); if (flower == null) { flower = tra.AddComponent(); flower.ObjType = ObjType.Flower; flower.LocalPos = flower.transform.localPosition; } else { flower.transform.localPosition = flower.LocalPos; } flower.FlowerInfo = flowerInfo; flower.SetCollider(false); return flower; } public static HudText GetHudText(string str, Color color, int size, Transform posTra, Transform parTra, bool scene) { Vector3 pos; if (scene) { pos = Camera.main.WorldToScreenPoint(posTra.position); } else { pos = posTra.position; } Transform tra = Get("HudText", Folder.PrefabUI, false, parTra, pos, ObjType.HudText); HudText hudText = tra.GetComponent(); if (hudText == null) { hudText = tra.AddComponent(); hudText.ObjType = ObjType.HudText; } hudText.Show(str, color, size); return hudText; } public static Transform GetSkillItem(SkillRoot skillRoot) { Transform tra; if (skillRoot.SkillTab == SkillTab.Elf) { tra = Get("SkillItem", Folder.PrefabUI, false, Get("Fd_Grid"), false); } else if (skillRoot.SkillTab == SkillTab.Store) { tra = Get("SkillItem", Folder.PrefabUI, false, Get("Fc_Grid"), false); } else if (skillRoot.SkillTab == SkillTab.Magic) { tra = Get("SkillItem", Folder.PrefabUI, false, Get("Fb_Grid"), false); } else if (skillRoot.SkillTab == SkillTab.Garden) { tra = Get("SkillItem", Folder.PrefabUI, false, Get("Fa_Grid"), false); } else { throw new Exception(); } skillRoot.SkillItem = tra; return tra; } public static Transform GetFlowerItemH() { Transform tra = Get("FlowerItemH", Folder.PrefabUI, false, Get("H_Grid"), false, ObjType.FlowerItem); ObjRoot objRoot = tra.GetComponent(); if (objRoot == null) { objRoot = tra.AddComponent(); } objRoot.ObjType = ObjType.FlowerItem; return objRoot.transform; } #region TraDic public static T Get(string goName) { Transform tra; if (TraDic.TryGetValue(goName, out tra)) { T t = tra.GetComponent(); if (t == null) { throw new Exception(); } return t; } else { throw new Exception(goName); } } public static Transform Get(string goName) { Transform tra; if (TraDic.TryGetValue(goName, out tra)) { return tra; } else { throw new Exception(goName); } } #endregion #region ObjPool public static void Save(T t) where T : Component { Transform tra = t.transform; ObjRoot objRoot = tra.GetComponent(); if (objRoot == null) { throw new Exception(); } List traList; if (ObjectPool.TryGetValue(objRoot.ObjType, out traList)) { if (traList.Contains(tra)) { throw new Exception(); } tra.SetActive(false); traList.Add(tra); tra.transform.SetParent(Get("ObjPool")); } else { throw new Exception(); } } public static void Save(GameObject go) { ObjRoot objRoot = go.GetComponent(); if (objRoot == null) { throw new Exception(); } List traList; if (ObjectPool.TryGetValue(objRoot.ObjType, out traList)) { if (traList.Contains(go.transform)) { throw new Exception(); } go.SetActive(false); traList.Add(go.transform); go.transform.SetParent(Get("ObjPool")); } else { throw new Exception(); } } public static void SaveUI(T t) where T : Component { Transform tra = t.transform; ObjRoot objRoot = tra.GetComponent(); if (objRoot == null) { throw new Exception(); } List traList; if (ObjectPool.TryGetValue(objRoot.ObjType, out traList)) { if (traList.Contains(tra)) { throw new Exception(); } tra.SetActive(false); traList.Add(tra); tra.transform.SetParent(Get("J_ObjPool")); } else { throw new Exception(); } } public static void SaveUI(GameObject go) { ObjRoot objRoot = go.GetComponent(); if (objRoot == null) { throw new Exception(); } List traList; if (ObjectPool.TryGetValue(objRoot.ObjType, out traList)) { if (traList.Contains(go.transform)) { throw new Exception(); } go.SetActive(false); traList.Add(go.transform); go.transform.SetParent(Get("J_ObjPool")); } else { throw new Exception(); } } public static Transform Get(ObjType objType) { List traList; if (ObjectPool.TryGetValue(objType, out traList)) { if (traList.Count > 0) { Transform tra = traList[0]; tra.SetActive(true); traList.RemoveAt(0); return tra.transform; } } return null; } #endregion #region ShortCut public static void SetText(string goName) { Text text = Get(goName); text.text = Language.GetStr("UI", goName); } public static void SetText(string goName, string str) { Text text = Get(goName); text.text = str; } public static void SetSprite(string goName, Sprite sprite) { Image image = Get(goName); image.sprite = sprite; } public static void SetActive(string goName, bool active) { Get(goName).SetActive(active); } public static void SetButtonEvent(string goName, params UnityAction[] onClicks) { Button button = Get