//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 Jiang Yin. All rights reserved. // Homepage: https://gameframework.cn/ // Feedback: mailto:ellan@gameframework.cn //------------------------------------------------------------ using GameFramework.ObjectPool; using System.Collections.Generic; using Entity; using StarForce; using UnityEngine; using UnityEngine.Serialization; using UnityGameFramework.Runtime; namespace CustomComponent { public class HPBarComponent : GameFrameworkComponent { [FormerlySerializedAs("m_HPBarItemTemplate")] [SerializeField] private HPBarItem _hpBarItemTemplate = null; [FormerlySerializedAs("m_HPBarInstanceRoot")] [SerializeField] private Transform _hpBarInstanceRoot = null; [FormerlySerializedAs("m_InstancePoolCapacity")] [SerializeField] private int _instancePoolCapacity = 16; private IObjectPool _hpBarItemObjectPool = null; private List _activeHPBarItems = null; private Canvas _cachedCanvas = null; private void Start() { if (_hpBarInstanceRoot == null) { Log.Error("You must set HP bar instance root first."); return; } _cachedCanvas = _hpBarInstanceRoot.GetComponent(); _hpBarItemObjectPool = GameEntry.ObjectPool.CreateSingleSpawnObjectPool("HPBarItem", _instancePoolCapacity); _activeHPBarItems = new List(); } private void OnDestroy() { } private void Update() { for (int i = _activeHPBarItems.Count - 1; i >= 0; i--) { HPBarItem hpBarItem = _activeHPBarItems[i]; if (hpBarItem.Refresh()) { continue; } HideHPBar(hpBarItem); } } public void ShowHPBar(EntityBase entity, float fromHPRatio, float toHPRatio) { if (entity == null) { Log.Warning("Entity is invalid."); return; } HPBarItem hpBarItem = GetActiveHPBarItem(entity); if (hpBarItem == null) { hpBarItem = CreateHPBarItem(entity); _activeHPBarItems.Add(hpBarItem); } hpBarItem.Init(entity, _cachedCanvas, fromHPRatio, toHPRatio); } private void HideHPBar(HPBarItem hpBarItem) { hpBarItem.Reset(); _activeHPBarItems.Remove(hpBarItem); _hpBarItemObjectPool.Unspawn(hpBarItem); } private HPBarItem GetActiveHPBarItem(EntityBase entity) { if (entity == null) { return null; } for (int i = 0; i < _activeHPBarItems.Count; i++) { if (_activeHPBarItems[i].Owner == entity) { return _activeHPBarItems[i]; } } return null; } private HPBarItem CreateHPBarItem(EntityBase entity) { HPBarItem hpBarItem = null; HPBarItemObject hpBarItemObject = _hpBarItemObjectPool.Spawn(); if (hpBarItemObject != null) { hpBarItem = (HPBarItem)hpBarItemObject.Target; } else { hpBarItem = Instantiate(_hpBarItemTemplate); Transform transform = hpBarItem.GetComponent(); transform.SetParent(_hpBarInstanceRoot); transform.localScale = Vector3.one; _hpBarItemObjectPool.Register(HPBarItemObject.Create(hpBarItem), true); } return hpBarItem; } } }