Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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; // счетчик для ID баров
- public Canvas mainCanvas; // основной канвас
- 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
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement