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 TraDic; public static Dictionary ObjDic; public static Dictionary> ObjectPool; #endregion private void Awake() { TraDic = new Dictionary(); ObjDic = new Dictionary(); ObjectPool = new Dictionary>(); Get("ObjPool", Folder.Object, true, transform, true); Get("MainCamera", Folder.Object, false, null, true); } #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 { GameObject go = t.gameObject; ObjRoot objRoot = go.GetComponent(); if (objRoot == null) { throw new Exception(); } List goList; if (ObjectPool.TryGetValue(objRoot.ObjType, out goList)) { if (goList.Contains(go)) { throw new Exception(); } go.SetActive(false); goList.Add(go); go.transform.SetParent(Get("ObjPool")); } else { throw new Exception(); } } public static void SaveUI(T t) where T : Component { GameObject go = t.gameObject; ObjRoot objRoot = go.GetComponent(); if (objRoot == null) { throw new Exception(); } List goList; if (ObjectPool.TryGetValue(objRoot.ObjType, out goList)) { if (goList.Contains(go)) { throw new Exception(); } go.SetActive(false); goList.Add(go); go.transform.SetParent(Get("J_ObjPool")); } else { throw new Exception(); } } public static void Save(GameObject go) { ObjRoot objRoot = go.GetComponent(); if (objRoot == null) { throw new Exception(); } List goList; if (ObjectPool.TryGetValue(objRoot.ObjType, out goList)) { if (goList.Contains(go)) { throw new Exception(); } go.SetActive(false); goList.Add(go); go.transform.SetParent(Get("ObjPool")); } else { throw new Exception(); } } public static void SaveUI(GameObject go) { ObjRoot objRoot = go.GetComponent(); if (objRoot == null) { throw new Exception(); } List goList; if (ObjectPool.TryGetValue(objRoot.ObjType, out goList)) { if (goList.Contains(go)) { throw new Exception(); } go.SetActive(false); goList.Add(go); go.transform.SetParent(Get("J_ObjPool")); } else { throw new Exception(); } } public static T Get(ObjType objType) { List goList; if (ObjectPool.TryGetValue(objType, out goList)) { if (goList.Count > 0) { GameObject go = goList[0]; go.SetActive(true); goList.RemoveAt(0); T t = go.GetComponent(); if (t != null) { return t; } } } return default(T); } public static Transform Get(Transform par, Vector3 pos, ObjType objType) { List goList; if (ObjectPool.TryGetValue(objType, out goList)) { if (goList.Count > 0) { GameObject go = goList[0]; go.SetActive(true); go.SetParent(par); go.transform.position = pos; goList.RemoveAt(0); return go.transform; } } return null; } public static Transform Get(string prefabName, Folder folder, bool compile, Transform par, Vector3 pos, ObjType objType = ObjType.Null) { if (objType != ObjType.Null) { Transform tra = Get(par, pos, objType); if (tra != null) { return tra; } } GameObject go = Load(prefabName, 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 prefabName, Folder folder, bool compile, Transform par, bool worldSpace, ObjType objType = ObjType.Null) { GameObject go = Load(prefabName, folder, objType); go = Instantiate(go, par, worldSpace); go.name = go.name.Replace("(Clone)", ""); if (compile) { Auxiliary.CompileDic(go.transform, TraDic); } return go.transform; } public static void GetHudText(string str, Transform posTra, bool scene, int size, Color color) { HudText hudText = Get(ObjType.HudText); Vector3 pos; if (scene) { pos = Camera.main.WorldToScreenPoint(posTra.position); } else { pos = posTra.position; } if (hudText == null) { hudText = Get("HudText", Folder.PrefabUI, false, Get("HudParent"), pos, ObjType.HudText).AddComponent(); hudText.ObjType = ObjType.HudText; } else { hudText.transform.position = pos; hudText.transform.SetParent(Get("HudParent")); } hudText.Show(str, color, size); } public static Flower GetFlower(int id, bool collider, Transform posTra) { Flower flower = Get(ObjType.Flower); if (flower == null) { flower = Get("Flower", Folder.Object, false, posTra, false, ObjType.Flower).AddComponent(); flower.ObjType = ObjType.Flower; flower.LocalPos = flower.transform.localPosition; } else { flower.transform.parent = posTra; flower.transform.localPosition = flower.LocalPos; } flower.Id = id; flower.PosTra = posTra; flower.SetCollider(collider); return flower; } #endregion #region ShortCut public static void SetText(string goName, string text) { Text tempText = Get(goName); tempText.text = text; } 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