_EagleOwle_

RadialSlider

Dec 24th, 2016
177
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEngine.UI;
  4. using System.Collections.Generic;
  5.  
  6. public class UI_RadialSlider : MonoBehaviour
  7. {
  8.     public List<ModulBasys> modulList = new List<ModulBasys>();//Сюда передаём резултат значения слайдеров.
  9.     public Text EngineValueText;//Сюда выводим сумму всех слайдеров
  10.  
  11.     public Image[] slider;//Масив слайдеров. Т.к. я использую "радиальные" слайдеры это массив Image. Если использовать обычные слайдеры, то этот масив должен быть типа Slider
  12.                           //В качестве значения слайдера используем images.fillAmount
  13.  
  14.     private bool lockHandler;
  15.     const float maxSum = 100;//Максимальное значение любого слайдера
  16.  
  17.     private GraphicRaycaster raycaster;
  18.     private Vector2 mousePosition;
  19.     private float angle;
  20.  
  21.     void OnEnable()
  22.     {
  23.         raycaster = GetComponentInParent<GraphicRaycaster>();
  24.  
  25.         EnableAllSlider();//включаем все ранее отключонные слайдеры
  26.         FindModul();//Находим экземпляры классов, чьё значение будем регулировать через слайдеры
  27.         Show_HideSlider();//Включаем или выключаем нужные слайдеры
  28.         ReCalculate();
  29.         SetValueText();
  30.     }
  31.  
  32.     void FindModul()//Находим экземпляры классов, чьё значение будем регулировать через слайдеры
  33.     {
  34.         modulList.Clear();
  35.  
  36.         for (int i = 0; i < slider.Length; i++)
  37.         {
  38.             modulList.Add(FindModulType(slider[i]));
  39.             //Родительский обьект каждого слайдера содержит экземпляр класса, в котором
  40.             //указатель (Enum). Это нужно, что бы каждый слайдер соответствовал
  41.             //своему экземпляру класса modulBasys.
  42.             //В modulBasys так же есть указатель (enum)
  43.         }
  44.     }
  45.  
  46.     void EnableAllSlider()//включаем все ранее отключонные слайдеры
  47.     {
  48.         for (int i = 0; i < slider.Length; i++)
  49.         {
  50.             slider[i].transform.parent.gameObject.SetActive(true);
  51.         }
  52.     }
  53.  
  54.     ModulBasys FindModulType(Image slider)
  55.     {
  56.         ModulType modulType = slider.GetComponentInParent<UI_Modul>().modulType;
  57.  
  58.         foreach (ModulBasys modul in PlayerController.botController.modulController)
  59.         {
  60.             if (modul.modulType == modulType)
  61.             {
  62.                 return modul;
  63.             }
  64.         }
  65.  
  66.         return null;
  67.     }
  68.  
  69.     void Show_HideSlider()//Включаем или выключаем нужные слайдеры
  70.     {
  71.         //Здесь мы проверяем условия, при которых слайдер может регулировать значение в данном modulBasys или нет.
  72.         //На пример, если в списке нет modulBasys соответстующиго данному слайдеру, то слайдер отключается
  73.         for (int i = 0; i < slider.Length; i++)
  74.         {
  75.             if (modulList.Count > i)
  76.             {
  77.                 if (modulList[i] != null && modulList[i].useEnergy == true)
  78.                 {
  79.                     slider[i].fillAmount = modulList[i].energyReloadQuoue / 100;
  80.                 }
  81.                 else
  82.                 {
  83.                     slider[i].fillAmount = 0;
  84.                     slider[i].transform.parent.gameObject.SetActive(false);
  85.                 }
  86.             }
  87.             else
  88.             {
  89.                 slider[i].fillAmount = 0;
  90.                 slider[i].gameObject.SetActive(false);
  91.             }
  92.         }
  93.     }
  94.  
  95.     void ReCalculate(int index = 0)//пересчитываем значение всех слайдеров и регулируем так, что бы сумма была не больше maxSum
  96.     {
  97.         if (lockHandler == false)
  98.         {
  99.             if (GetSliderSum() <= maxSum)
  100.             {
  101.                 return;
  102.             }
  103.             else
  104.             {
  105.                 float sum = GetSliderSum() - (slider[index].fillAmount * 100);
  106.                 float sumToDistribut = 100 - (slider[index].fillAmount * 100);
  107.                 float mLocalHash = sumToDistribut / sum;
  108.                 lockHandler = true;
  109.  
  110.                 foreach (Image nextSlider in slider)
  111.                 {
  112.                     if (nextSlider == slider[index])
  113.                     {
  114.                         continue;
  115.                     }
  116.                     else
  117.                     {
  118.                         nextSlider.fillAmount *= mLocalHash;
  119.                     }
  120.                 }
  121.  
  122.                 lockHandler = false;
  123.             }
  124.         }
  125.     }
  126.  
  127.     float GetSliderSum()//Получаем сумму значений всех слайдеров
  128.     {
  129.         float sum = 0;
  130.  
  131.         for (int i = 0; i < slider.Length; i++)
  132.         {
  133.             if (slider[i].gameObject.activeSelf == true)
  134.             {
  135.                 sum += slider[i].fillAmount * 100;
  136.             }
  137.         }
  138.  
  139.         return sum;
  140.     }
  141.  
  142.     public void ValueChange(int index)
  143.     {
  144.         RectTransformUtility.ScreenPointToLocalPointInRectangle(slider[index].transform as RectTransform, Input.mousePosition, raycaster.eventCamera, out mousePosition);
  145.  
  146.         angle = (Mathf.Atan2(-mousePosition.y, mousePosition.x) * 180f / Mathf.PI + 180f) / 360f;
  147.  
  148.         slider[index].fillAmount = angle;
  149.  
  150.         ReCalculate(index);
  151.         SetValueText();
  152.     }
  153.  
  154.     void SetValueText()
  155.     {
  156.         for (int i = 0; i < slider.Length; i++)
  157.         {
  158.             slider[i].GetComponentInChildren<Text>().text = (slider[i].fillAmount * 100).ToString("f0");
  159.  
  160.             if (modulList[i] != null)
  161.             {
  162.                 modulList[i].energyReloadQuoue = slider[i].fillAmount * 100;
  163.             }
  164.         }
  165.     }
  166. }
RAW Paste Data