ManaReso.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using UnityEngine.Events;
  4. using System;
  5. using System.Collections;
  6. using System.Linq.Expressions;
  7. using System.ComponentModel;
  8. using System.Collections.Generic;
  9. using Object = UnityEngine.Object;
  10. using Component = UnityEngine.Component;
  11. public enum Folder
  12. {
  13. Skill,
  14. Object,
  15. Shader,
  16. Garden,
  17. SpriteUI,
  18. PrefabUI,
  19. Character,
  20. }
  21. public enum ObjType
  22. {
  23. Null,
  24. Flower,
  25. HudText,
  26. FlowerItem,
  27. }
  28. public class ManaReso : MonoBehaviour
  29. {
  30. #region 变量
  31. public static Dictionary<string, Object> ObjDic;
  32. public static Dictionary<string, Transform> TraDic;
  33. public static Dictionary<ObjType, List<Transform>> ObjectPool;
  34. #endregion
  35. private void Awake()
  36. {
  37. TraDic = new Dictionary<string, Transform>();
  38. ObjDic = new Dictionary<string, Object>();
  39. ObjectPool = new Dictionary<ObjType, List<Transform>>();
  40. Transform objPool = new GameObject("ObjPool").transform;
  41. objPool.parent = transform;
  42. objPool.SetActive(false);
  43. TraDic.Add(objPool.name, objPool);
  44. }
  45. public static T Load<T>(string goName, Folder folder, ObjType objType = ObjType.Null) where T : Object
  46. {
  47. Object obj;
  48. if (ObjDic.TryGetValue(goName, out obj))
  49. {
  50. return (T)obj;
  51. }
  52. else
  53. {
  54. T t;
  55. if (folder == Folder.Skill)
  56. {
  57. t = Resources.Load<T>(@"Sprite\SpriteUI\Skill\" + goName);
  58. }
  59. else if (folder == Folder.Object)
  60. {
  61. t = Resources.Load<T>(@"Prefab\Object\" + goName);
  62. }
  63. else if (folder == Folder.Garden)
  64. {
  65. t = Resources.Load<T>(@"Sprite\Garden\" + goName);
  66. }
  67. else if (folder == Folder.SpriteUI)
  68. {
  69. t = Resources.Load<T>(@"Sprite\SpriteUI\" + goName);
  70. }
  71. else if (folder == Folder.Shader)
  72. {
  73. t = Resources.Load<T>(@"Shader\" + goName);
  74. }
  75. else if (folder == Folder.PrefabUI)
  76. {
  77. t = Resources.Load<T>(@"Prefab\PrefabUI\" + goName);
  78. }
  79. else if (folder == Folder.Character)
  80. {
  81. t = Resources.Load<T>(@"Sprite\Character\" + goName);
  82. }
  83. else
  84. {
  85. throw new Exception();
  86. }
  87. if (t == null)
  88. {
  89. throw new Exception(goName);
  90. }
  91. ObjDic.Add(goName, t);
  92. if (objType != ObjType.Null)
  93. {
  94. ObjectPool.Add(objType, new List<Transform>());
  95. }
  96. return t;
  97. }
  98. }
  99. public static Transform Get(string goName, Folder folder, bool compile, Transform par, Vector3 pos, ObjType objType = ObjType.Null)
  100. {
  101. Transform tra = Get(objType);
  102. if (tra != null)
  103. {
  104. tra.SetParent(par);
  105. tra.position = pos;
  106. return tra;
  107. }
  108. else
  109. {
  110. GameObject go = Load<GameObject>(goName, folder, objType);
  111. go = Instantiate(go, pos, Quaternion.identity, par);
  112. go.name = go.name.Replace("(Clone)", "");
  113. if (compile)
  114. {
  115. Auxiliary.CompileDic(go.transform, TraDic);
  116. }
  117. return go.transform;
  118. }
  119. }
  120. public static Transform Get(string goName, Folder folder, bool compile, Transform par, bool worldSpace, ObjType objType = ObjType.Null)
  121. {
  122. Transform tra = Get(objType);
  123. if (tra == null)
  124. {
  125. GameObject go = Load<GameObject>(goName, folder, objType);
  126. go = Instantiate(go, par, worldSpace);
  127. go.name = go.name.Replace("(Clone)", "");
  128. if (compile)
  129. {
  130. Auxiliary.CompileDic(go.transform, TraDic);
  131. }
  132. return go.transform;
  133. }
  134. else
  135. {
  136. tra.SetParent(par);
  137. return tra;
  138. }
  139. }
  140. public static Flower GetFlower(FlowerInfo flowerInfo, Slot slot, bool collider)
  141. {
  142. Transform tra = Get("Flower", Folder.Object, false, slot.transform, false, ObjType.Flower);
  143. Flower flower = tra.GetComponent<Flower>();
  144. if (flower == null)
  145. {
  146. flower = tra.AddComponent<Flower>();
  147. flower.ObjType = ObjType.Flower;
  148. flower.LocalPos = flower.transform.localPosition;
  149. }
  150. else
  151. {
  152. flower.transform.localPosition = flower.LocalPos;
  153. }
  154. flower.FlowerInfo = flowerInfo;
  155. flower.Slot = slot;
  156. flower.SetCollider(collider);
  157. return flower;
  158. }
  159. public static Flower GetFlower(FlowerInfo flowerInfo, Transform par)
  160. {
  161. Transform tra = Get("Flower", Folder.Object, false, par, false, ObjType.Flower);
  162. Flower flower = tra.GetComponent<Flower>();
  163. if (flower == null)
  164. {
  165. flower = tra.AddComponent<Flower>();
  166. flower.ObjType = ObjType.Flower;
  167. flower.LocalPos = flower.transform.localPosition;
  168. }
  169. else
  170. {
  171. flower.transform.localPosition = flower.LocalPos;
  172. }
  173. flower.FlowerInfo = flowerInfo;
  174. flower.SetCollider(false);
  175. return flower;
  176. }
  177. public static HudText GetHudText(string str, Color color, int size, Transform posTra, Transform parTra, bool scene)
  178. {
  179. Vector3 pos;
  180. if (scene)
  181. {
  182. pos = Camera.main.WorldToScreenPoint(posTra.position);
  183. }
  184. else
  185. {
  186. pos = posTra.position;
  187. }
  188. Transform tra = Get("HudText", Folder.PrefabUI, false, parTra, pos, ObjType.HudText);
  189. HudText hudText = tra.GetComponent<HudText>();
  190. if (hudText == null)
  191. {
  192. hudText = tra.AddComponent<HudText>();
  193. hudText.ObjType = ObjType.HudText;
  194. }
  195. hudText.Show(str, color, size);
  196. return hudText;
  197. }
  198. public static Transform GetSkillItem(SkillRoot skillRoot)
  199. {
  200. Transform tra;
  201. if (skillRoot.SkillTab == SkillTab.Elf)
  202. {
  203. tra = Get("SkillItem", Folder.PrefabUI, false, Get("Fd_Grid"), false);
  204. }
  205. else if (skillRoot.SkillTab == SkillTab.Store)
  206. {
  207. tra = Get("SkillItem", Folder.PrefabUI, false, Get("Fc_Grid"), false);
  208. }
  209. else if (skillRoot.SkillTab == SkillTab.Magic)
  210. {
  211. tra = Get("SkillItem", Folder.PrefabUI, false, Get("Fb_Grid"), false);
  212. }
  213. else if (skillRoot.SkillTab == SkillTab.Garden)
  214. {
  215. tra = Get("SkillItem", Folder.PrefabUI, false, Get("Fa_Grid"), false);
  216. }
  217. else
  218. {
  219. throw new Exception();
  220. }
  221. skillRoot.SkillItem = tra;
  222. return tra;
  223. }
  224. public static Transform GetFlowerItemH()
  225. {
  226. Transform tra = Get("FlowerItemH", Folder.PrefabUI, false, Get("H_Grid"), false, ObjType.FlowerItem);
  227. ObjRoot objRoot = tra.GetComponent<ObjRoot>();
  228. if (objRoot == null)
  229. {
  230. objRoot = tra.AddComponent<ObjRoot>();
  231. }
  232. objRoot.ObjType = ObjType.FlowerItem;
  233. return objRoot.transform;
  234. }
  235. #region TraDic
  236. public static T Get<T>(string goName)
  237. {
  238. Transform tra;
  239. if (TraDic.TryGetValue(goName, out tra))
  240. {
  241. T t = tra.GetComponent<T>();
  242. if (t == null)
  243. {
  244. throw new Exception();
  245. }
  246. return t;
  247. }
  248. else
  249. {
  250. throw new Exception(goName);
  251. }
  252. }
  253. public static Transform Get(string goName)
  254. {
  255. Transform tra;
  256. if (TraDic.TryGetValue(goName, out tra))
  257. {
  258. return tra;
  259. }
  260. else
  261. {
  262. throw new Exception(goName);
  263. }
  264. }
  265. #endregion
  266. #region ObjPool
  267. public static void Save<T>(T t) where T : Component
  268. {
  269. Transform tra = t.transform;
  270. ObjRoot objRoot = tra.GetComponent<ObjRoot>();
  271. if (objRoot == null)
  272. {
  273. throw new Exception();
  274. }
  275. List<Transform> traList;
  276. if (ObjectPool.TryGetValue(objRoot.ObjType, out traList))
  277. {
  278. if (traList.Contains(tra))
  279. {
  280. throw new Exception();
  281. }
  282. tra.SetActive(false);
  283. traList.Add(tra);
  284. tra.transform.SetParent(Get("ObjPool"));
  285. }
  286. else
  287. {
  288. throw new Exception();
  289. }
  290. }
  291. public static void Save(GameObject go)
  292. {
  293. ObjRoot objRoot = go.GetComponent<ObjRoot>();
  294. if (objRoot == null)
  295. {
  296. throw new Exception();
  297. }
  298. List<Transform> traList;
  299. if (ObjectPool.TryGetValue(objRoot.ObjType, out traList))
  300. {
  301. if (traList.Contains(go.transform))
  302. {
  303. throw new Exception();
  304. }
  305. go.SetActive(false);
  306. traList.Add(go.transform);
  307. go.transform.SetParent(Get("ObjPool"));
  308. }
  309. else
  310. {
  311. throw new Exception();
  312. }
  313. }
  314. public static void SaveUI<T>(T t) where T : Component
  315. {
  316. Transform tra = t.transform;
  317. ObjRoot objRoot = tra.GetComponent<ObjRoot>();
  318. if (objRoot == null)
  319. {
  320. throw new Exception();
  321. }
  322. List<Transform> traList;
  323. if (ObjectPool.TryGetValue(objRoot.ObjType, out traList))
  324. {
  325. if (traList.Contains(tra))
  326. {
  327. throw new Exception();
  328. }
  329. tra.SetActive(false);
  330. traList.Add(tra);
  331. tra.transform.SetParent(Get("J_ObjPool"));
  332. }
  333. else
  334. {
  335. throw new Exception();
  336. }
  337. }
  338. public static void SaveUI(GameObject go)
  339. {
  340. ObjRoot objRoot = go.GetComponent<ObjRoot>();
  341. if (objRoot == null)
  342. {
  343. throw new Exception();
  344. }
  345. List<Transform> traList;
  346. if (ObjectPool.TryGetValue(objRoot.ObjType, out traList))
  347. {
  348. if (traList.Contains(go.transform))
  349. {
  350. throw new Exception();
  351. }
  352. go.SetActive(false);
  353. traList.Add(go.transform);
  354. go.transform.SetParent(Get("J_ObjPool"));
  355. }
  356. else
  357. {
  358. throw new Exception();
  359. }
  360. }
  361. public static Transform Get(ObjType objType)
  362. {
  363. List<Transform> traList;
  364. if (ObjectPool.TryGetValue(objType, out traList))
  365. {
  366. if (traList.Count > 0)
  367. {
  368. Transform tra = traList[0];
  369. tra.SetActive(true);
  370. traList.RemoveAt(0);
  371. return tra.transform;
  372. }
  373. }
  374. return null;
  375. }
  376. #endregion
  377. #region ShortCut
  378. public static void SetText(string goName)
  379. {
  380. Text text = Get<Text>(goName);
  381. text.text = Language.GetStr("UI", goName);
  382. }
  383. public static void SetText(string goName, string str)
  384. {
  385. Text text = Get<Text>(goName);
  386. text.text = str;
  387. }
  388. public static void SetSprite(string goName, Sprite sprite)
  389. {
  390. Image image = Get<Image>(goName);
  391. image.sprite = sprite;
  392. }
  393. public static void SetActive(string goName, bool active)
  394. {
  395. Get(goName).SetActive(active);
  396. }
  397. public static void SetButtonEvent(string goName, params UnityAction[] onClicks)
  398. {
  399. Button button = Get<Button>(goName);
  400. button.onClick = new Button.ButtonClickedEvent();
  401. for (int i = 0; i < onClicks.Length; i++)
  402. {
  403. button.onClick.AddListener(onClicks[i]);
  404. }
  405. }
  406. public static void AddButtonEvent(string goName, params UnityAction[] onClicks)
  407. {
  408. Button button = Get<Button>(goName);
  409. for (int i = 0; i < onClicks.Length; i++)
  410. {
  411. button.onClick.AddListener(onClicks[i]);
  412. }
  413. }
  414. #endregion
  415. }