HPBarComponent.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 Jiang Yin. All rights reserved.
  4. // Homepage: https://gameframework.cn/
  5. // Feedback: mailto:ellan@gameframework.cn
  6. //------------------------------------------------------------
  7. using GameFramework.ObjectPool;
  8. using System.Collections.Generic;
  9. using UnityEngine;
  10. using UnityGameFramework.Runtime;
  11. namespace MetaClient
  12. {
  13. public class HPBarComponent : GameFrameworkComponent
  14. {
  15. [SerializeField]
  16. private HPBarItem m_HPBarItemTemplate = null;
  17. [SerializeField]
  18. private Transform m_HPBarInstanceRoot = null;
  19. [SerializeField]
  20. private int m_InstancePoolCapacity = 16;
  21. private IObjectPool<HPBarItemObject> m_HPBarItemObjectPool = null;
  22. private List<HPBarItem> m_ActiveHPBarItems = null;
  23. private Canvas m_CachedCanvas = null;
  24. private void Start()
  25. {
  26. if (m_HPBarInstanceRoot == null)
  27. {
  28. Log.Error("You must set HP bar instance root first.");
  29. return;
  30. }
  31. m_CachedCanvas = m_HPBarInstanceRoot.GetComponent<Canvas>();
  32. m_HPBarItemObjectPool = GameEntry.ObjectPool.CreateSingleSpawnObjectPool<HPBarItemObject>("HPBarItem", m_InstancePoolCapacity);
  33. m_ActiveHPBarItems = new List<HPBarItem>();
  34. }
  35. private void OnDestroy()
  36. {
  37. }
  38. private void Update()
  39. {
  40. for (int i = m_ActiveHPBarItems.Count - 1; i >= 0; i--)
  41. {
  42. HPBarItem hpBarItem = m_ActiveHPBarItems[i];
  43. if (hpBarItem.Refresh())
  44. {
  45. continue;
  46. }
  47. HideHPBar(hpBarItem);
  48. }
  49. }
  50. public void ShowHPBar(Entity entity, float fromHPRatio, float toHPRatio)
  51. {
  52. if (entity == null)
  53. {
  54. Log.Warning("Entity is invalid.");
  55. return;
  56. }
  57. HPBarItem hpBarItem = GetActiveHPBarItem(entity);
  58. if (hpBarItem == null)
  59. {
  60. hpBarItem = CreateHPBarItem(entity);
  61. m_ActiveHPBarItems.Add(hpBarItem);
  62. }
  63. hpBarItem.Init(entity, m_CachedCanvas, fromHPRatio, toHPRatio);
  64. }
  65. private void HideHPBar(HPBarItem hpBarItem)
  66. {
  67. hpBarItem.Reset();
  68. m_ActiveHPBarItems.Remove(hpBarItem);
  69. m_HPBarItemObjectPool.Unspawn(hpBarItem);
  70. }
  71. private HPBarItem GetActiveHPBarItem(Entity entity)
  72. {
  73. if (entity == null)
  74. {
  75. return null;
  76. }
  77. for (int i = 0; i < m_ActiveHPBarItems.Count; i++)
  78. {
  79. if (m_ActiveHPBarItems[i].Owner == entity)
  80. {
  81. return m_ActiveHPBarItems[i];
  82. }
  83. }
  84. return null;
  85. }
  86. private HPBarItem CreateHPBarItem(Entity entity)
  87. {
  88. HPBarItem hpBarItem = null;
  89. HPBarItemObject hpBarItemObject = m_HPBarItemObjectPool.Spawn();
  90. if (hpBarItemObject != null)
  91. {
  92. hpBarItem = (HPBarItem)hpBarItemObject.Target;
  93. }
  94. else
  95. {
  96. hpBarItem = Instantiate(m_HPBarItemTemplate);
  97. Transform transform = hpBarItem.GetComponent<Transform>();
  98. transform.SetParent(m_HPBarInstanceRoot);
  99. transform.localScale = Vector3.one;
  100. m_HPBarItemObjectPool.Register(HPBarItemObject.Create(hpBarItem), true);
  101. }
  102. return hpBarItem;
  103. }
  104. }
  105. }