Advertisement
KpoKec

UI bar controller

Jul 22nd, 2018
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.36 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using UnityEngine.Events;
  6.  
  7. public delegate float DelegateBarValue();
  8. public class HPbar {
  9.     public Transform transform;
  10.     public Image imageHP;
  11.     public Image imageBorder;
  12.     public DelegateBarValue value;
  13.     public float offsetY = 0f;
  14.     public int id = -1;
  15.     public HPbar(Transform _tr, Image _imageBG, Image _imageHP, DelegateBarValue _value, float _offsetY = 0f) {
  16.         transform = _tr;
  17.         imageHP = _imageHP;
  18.         imageBorder = _imageBG;
  19.         value = _value;
  20.         offsetY = _offsetY;
  21.     }
  22. }
  23.  
  24. public class UI_controller : MonoBehaviour {
  25.  
  26.     public static UI_controller Instance { get; private set; }
  27.     private Dictionary<Transform, List<HPbar>> listHPbars = new Dictionary<Transform, List<HPbar>>();
  28.     new private Camera camera; // камера сцены
  29.     [SerializeField]
  30.     private Transform canvasHP; // канвас для баров
  31.     public GameObject prefabHPbar; // дефолтовый префаб бара
  32.     private int barCounter = -1; // счетчик для ID баров
  33.     public Canvas mainCanvas; // основной канвас
  34.  
  35.     private void Awake() {
  36.         camera = Camera.main;
  37.         Instance = this;
  38.     }
  39.  
  40.     void Start() {
  41.     }
  42.  
  43.     // обновление положения баров
  44.     public void UpdateHPbars() {
  45.         foreach (var h in listHPbars) {
  46.             SetHPbarPosition(h.Key);
  47.         }
  48.     }
  49.  
  50.     #region БАРЫ
  51.     /// <summary>
  52.     /// Регистрация бара на объект
  53.     /// </summary>
  54.     /// <param name="_object">Холдер бара на объекте</param>
  55.     /// <param name="_prefab">Префаб бара</param>
  56.     /// <param name="_value">делегат, отдающий флоат для бара</param>
  57.     public int AddHPbar(Transform _object, GameObject _prefab, DelegateBarValue _value) {
  58.         GameObject barHP = Instantiate(_prefab, Vector3.zero, Quaternion.identity, canvasHP);
  59.         Image imgBg = barHP.GetComponent<Image>();
  60.         Image imgHP = barHP.transform.GetChild(0).GetComponent<Image>();
  61.         if (!listHPbars.ContainsKey(_object)) {
  62.             var l = new List<HPbar>();
  63.             var h = new HPbar(barHP.transform, imgBg, imgHP, _value);
  64.             h.id = barCounter;
  65.             l.Add(h);
  66.             listHPbars.Add(_object, l);
  67.             return barCounter;
  68.         }
  69.         else {
  70.             HPbar last = listHPbars[_object][listHPbars[_object].Count - 1];
  71.             HPbar hpBar = new HPbar(barHP.transform, imgBg, imgHP, _value,
  72.                 last.offsetY + last.imageBorder.rectTransform.rect.height);
  73.             barCounter++;
  74.             hpBar.id = barCounter;
  75.             listHPbars[_object].Add(hpBar);
  76.             return barCounter;
  77.         }
  78.     }
  79.  
  80.     /// <summary>
  81.     /// Установка позиции бара
  82.     /// </summary>
  83.     /// <param name="_object">Носитель бара</param>
  84.     public void SetHPbarPosition(Transform _object) {
  85.         List<HPbar> hpBars = listHPbars[_object];
  86.         if (hpBars.Count == 0) return;
  87.         foreach (HPbar h in hpBars)
  88.             h.transform.position = camera.WorldToScreenPoint(_object.position) + new Vector3(0f, h.offsetY, 0f);
  89.     }
  90.  
  91.     /// <summary>
  92.     /// Установка значения бара
  93.     /// </summary>
  94.     /// <param name="_object">Носитель бара</param>
  95.     public void SetBarsValue(Transform _object) {
  96.         List<HPbar> hpBars = listHPbars[_object];
  97.         if (hpBars == null) return;
  98.         foreach (HPbar hpBar in hpBars) {
  99.             hpBar.imageHP.fillAmount = hpBar.value();
  100.         }
  101.     }
  102.  
  103.     // прячет бар
  104.     public void HideHPbar(Transform _object) {
  105.         if (listHPbars.ContainsKey(_object))
  106.             foreach (HPbar hp in listHPbars[_object])
  107.                 hp.transform.gameObject.SetActive(false);
  108.     }
  109.     // показывает бар
  110.     public void ShowHPbar(Transform _object) {
  111.         if (listHPbars.ContainsKey(_object))
  112.             foreach (HPbar hp in listHPbars[_object])
  113.                 hp.transform.gameObject.SetActive(true);
  114.     }
  115.  
  116.     /// <summary>
  117.     /// Уничтожение баров
  118.     /// </summary>
  119.     /// <param name="_object">Носитель бара</param>
  120.     public void RemoveHPbar(Transform _object) {
  121.         foreach (HPbar hp in listHPbars[_object])
  122.             Destroy(hp.transform.gameObject);
  123.         listHPbars.Remove(_object);
  124.     }
  125.     /// <summary>
  126.     /// Удаление одного бара из набора
  127.     /// </summary>
  128.     /// <param name="_object">Холдер бара</param>
  129.     /// <param name="_id">ID бара</param>
  130.     public void RemoveHPbar(Transform _object, int _id) {
  131.         foreach (HPbar hp in listHPbars[_object])
  132.             if (hp.id == _id) {
  133.                 Destroy(hp.transform.gameObject);
  134.                 listHPbars[_object].Remove(hp);
  135.                 break;
  136.             }
  137.         for (int i = 0; i < listHPbars[_object].Count; i++) {
  138.             HPbar h = listHPbars[_object][i];
  139.             if (i == 0)
  140.                 h.offsetY = 0f;
  141.             else
  142.                 h.offsetY = listHPbars[_object][i - 1].offsetY + listHPbars[_object][i - 1].imageBorder.rectTransform.rect.height;
  143.         }
  144.     }
  145.  
  146.     #endregion
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement