MiniPrefabTextLoader.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using System;
  2. using James;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. /// <summary>
  6. /// 自动加载迷你预设
  7. /// </summary>
  8. [DisallowMultipleComponent]
  9. public class MiniPrefabTextLoader : UIBehaviour
  10. {
  11. [Tooltip("迷你预设类别"), SerializeField]
  12. private MiniPrefabType miniPrefabType;
  13. /// <summary>
  14. /// 预设实例
  15. /// </summary>
  16. protected GameObject p_prefab;
  17. /// <summary>
  18. /// 工作协程
  19. /// </summary>
  20. private Coroutine s_coroutine;
  21. /// <summary>
  22. /// 缓存的参数列表
  23. /// </summary>
  24. private object[] s_paramList;
  25. protected override void OnEnable()
  26. {
  27. base.OnEnable();
  28. //取消销毁程序
  29. if (s_coroutine != null)
  30. {
  31. JamesGame.Game.CancelCall(s_coroutine);
  32. }
  33. if (p_prefab == null)
  34. {
  35. // p_prefab = GetPrefab(miniPrefabType);
  36. // SetObjectData();
  37. GetPrefab(miniPrefabType, obj =>
  38. {
  39. p_prefab = obj;
  40. SetObjectData();
  41. });
  42. }
  43. }
  44. protected override void OnDisable()
  45. {
  46. base.OnDisable();
  47. s_coroutine = JamesGame.Game.DelayedCall(() =>
  48. {
  49. if (p_prefab != null)
  50. {
  51. DestroyPrefab(p_prefab);
  52. /*清除缓存数据*/
  53. p_prefab = null;
  54. }
  55. }, 0.01f);
  56. }
  57. /// <summary>
  58. /// 设置数据
  59. /// </summary>
  60. /// <param name="paramList">数据列表</param>
  61. public void SetData(params object[] paramList)
  62. {
  63. s_paramList = paramList;
  64. VoluationData(paramList);
  65. }
  66. /// <summary>
  67. /// 设置数据
  68. /// </summary>
  69. /// <param name="paramList">数据列表</param>
  70. protected virtual void VoluationData(object[] paramList) { }
  71. /// <summary>
  72. /// 设置实例的数据
  73. /// </summary>
  74. protected virtual void SetObjectData()
  75. {
  76. //Transform信息校准
  77. p_prefab.transform.SetParent(transform);
  78. p_prefab.transform.localPosition = Vector3.zero;
  79. p_prefab.transform.localRotation = Quaternion.identity;
  80. p_prefab.transform.localScale = Vector3.one;
  81. if (!p_prefab.activeSelf) p_prefab.SetActive(true);
  82. if (s_paramList != null)
  83. {
  84. //适用于先执行了SetData,再执行SetObjectData的情况
  85. VoluationData(s_paramList);
  86. }
  87. }
  88. /// <summary>
  89. /// 获取预设加载地址
  90. /// </summary>
  91. /// <param name="miniPrefabType">预设类别</param>
  92. /// <returns></returns>
  93. private static string GetPrefabLoadPath(MiniPrefabType miniPrefabType)
  94. {
  95. return string.Format("NEW_Prefabs/Mini/{0}.prefab", miniPrefabType);
  96. }
  97. /// <summary>
  98. /// 获取预设实例
  99. /// </summary>
  100. /// <param name="miniPrefabType">迷你预设类别</param>
  101. /// <param name="onLoaded"></param>
  102. /// <returns></returns>
  103. private static void GetPrefab(MiniPrefabType miniPrefabType, Action<GameObject> onLoaded)
  104. {
  105. ObjectPool.Instance.Pop(new ObjectPool.PoolLabel() { poolType = ObjectPool.PoolType.UI_permanent, key = miniPrefabType.ToString() }, GetPrefabLoadPath(miniPrefabType), onLoaded);
  106. }
  107. /// <summary>
  108. /// 销毁预设实例
  109. /// </summary>
  110. /// <param name="obj">预设实例</param>
  111. private static void DestroyPrefab(GameObject obj)
  112. {
  113. ObjectPool.Instance.Push(obj);
  114. }
  115. /// <summary>
  116. /// 迷你预设类别
  117. /// </summary>
  118. public enum MiniPrefabType
  119. {
  120. /// <summary>
  121. /// 倍数
  122. /// </summary>
  123. Multiple,
  124. /// <summary>
  125. /// 能力
  126. /// </summary>
  127. Power,
  128. /// <summary>
  129. /// 通用按钮
  130. /// </summary>
  131. Button,
  132. /// <summary>
  133. /// 金币buff
  134. /// </summary>
  135. GoldBuffer,
  136. }
  137. }