using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
public delegate float DelegateBarValue();
public class HPbar
{
public Transform transform;
public Image imageHP;
public Image imageBorder;
public DelegateBarValue value;
public float offsetY = 0f;
public int id = -1;
public HPbar(Transform _tr, Image _imageBG, Image _imageHP, DelegateBarValue _value, float _offsetY = 0f)
{
transform = _tr;
imageHP = _imageHP;
imageBorder = _imageBG;
value = _value;
offsetY = _offsetY;
}
}
public class UI_controller : MonoBehaviour {
public static UI_controller Instance { get; private set; }
private Dictionary<Transform, List<HPbar>> listHPbars = new Dictionary<Transform, List<HPbar>>();
new private Camera camera;
[SerializeField]
private Transform canvasHP;
public GameObject prefabHPbar;
private int barCounter = -1;
private void Awake()
{
camera = Camera.main;
Instance = this;
}
void Start () {
}
public void UpdateHPbars() {
foreach(var h in listHPbars)
{
SetHPbarPosition(h.Key);
}
}
#region БАРЫ
/// <summary>
/// Регистрация бара на объект
/// </summary>
/// <param name="_object">Холдер бара на объекте</param>
/// <param name="_prefab">Префаб бара</param>
/// <param name="_value">делегат, отдающий флоат для бара</param>
public int AddHPbar(Transform _object, GameObject _prefab, DelegateBarValue _value)
{
GameObject barHP = Instantiate(_prefab, Vector3.zero, Quaternion.identity, canvasHP);
Image imgBg = barHP.GetComponent<Image>();
Image imgHP = barHP.transform.GetChild(0).GetComponent<Image>();
if (!listHPbars.ContainsKey(_object))
{
var l = new List<HPbar>();
var h = new HPbar(barHP.transform, imgBg, imgHP, _value);
h.id = barCounter;
l.Add(h);
listHPbars.Add(_object, l);
return barCounter;
}
else
{
HPbar last = listHPbars[_object][listHPbars[_object].Count - 1];
HPbar hpBar = new HPbar(barHP.transform, imgBg, imgHP, _value,
last.offsetY+last.imageBorder.rectTransform.rect.height);
barCounter++;
hpBar.id = barCounter;
listHPbars[_object].Add(hpBar);
return barCounter;
}
}
/// <summary>
/// Установка позиции бара
/// </summary>
/// <param name="_object">Носитель бара</param>
public void SetHPbarPosition(Transform _object)
{
List<HPbar> hpBars = listHPbars[_object];
if (hpBars.Count == 0) return;
foreach (HPbar h in hpBars)
h.transform.position = camera.WorldToScreenPoint(_object.position) + new Vector3(0f, h.offsetY, 0f);
}
/// <summary>
/// Установка значения бара
/// </summary>
/// <param name="_object">Носитель бара</param>
public void SetBarsValue(Transform _object)
{
List<HPbar> hpBars = listHPbars[_object];
if (hpBars == null) return;
foreach (HPbar hpBar in hpBars)
{
hpBar.imageHP.fillAmount = hpBar.value();
}
}
// прячет бар
public void HideHPbar(Transform _object)
{
if (listHPbars.ContainsKey(_object))
foreach (HPbar hp in listHPbars[_object])
hp.transform.gameObject.SetActive(false);
}
// показывает бар
public void ShowHPbar(Transform _object)
{
if (listHPbars.ContainsKey(_object))
foreach (HPbar hp in listHPbars[_object])
hp.transform.gameObject.SetActive(true);
}
/// <summary>
/// Уничтожение баров
/// </summary>
/// <param name="_object">Носитель бара</param>
public void RemoveHPbar(Transform _object)
{
foreach (HPbar hp in listHPbars[_object])
Destroy(hp.transform.gameObject);
listHPbars.Remove(_object);
}
/// <summary>
/// Удаление одного бара из набора
/// </summary>
/// <param name="_object">Холдер бара</param>
/// <param name="_id">ID бара</param>
public void RemoveHPbar(Transform _object, int _id)
{
foreach (HPbar hp in listHPbars[_object])
if (hp.id == _id)
{
Destroy(hp.transform.gameObject);
listHPbars[_object].Remove(hp);
break;
}
for (int i=0; i<listHPbars[_object].Count; i++)
{
HPbar h = listHPbars[_object][i];
if (i == 0)
h.offsetY = 0f;
else
h.offsetY = listHPbars[_object][i - 1].offsetY + listHPbars[_object][i - 1].imageBorder.rectTransform.rect.height;
}
}
#endregion
}