Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- using UnityEngine.UI;
- using System.Collections.Generic;
- public class UI_RadialSlider : MonoBehaviour
- {
- public List<ModulBasys> modulList = new List<ModulBasys>();//Сюда передаём резултат значения слайдеров.
- public Text EngineValueText;//Сюда выводим сумму всех слайдеров
- public Image[] slider;//Масив слайдеров. Т.к. я использую "радиальные" слайдеры это массив Image. Если использовать обычные слайдеры, то этот масив должен быть типа Slider
- //В качестве значения слайдера используем images.fillAmount
- private bool lockHandler;
- const float maxSum = 100;//Максимальное значение любого слайдера
- private GraphicRaycaster raycaster;
- private Vector2 mousePosition;
- private float angle;
- void OnEnable()
- {
- raycaster = GetComponentInParent<GraphicRaycaster>();
- EnableAllSlider();//включаем все ранее отключонные слайдеры
- FindModul();//Находим экземпляры классов, чьё значение будем регулировать через слайдеры
- Show_HideSlider();//Включаем или выключаем нужные слайдеры
- ReCalculate();
- SetValueText();
- }
- void FindModul()//Находим экземпляры классов, чьё значение будем регулировать через слайдеры
- {
- modulList.Clear();
- for (int i = 0; i < slider.Length; i++)
- {
- modulList.Add(FindModulType(slider[i]));
- //Родительский обьект каждого слайдера содержит экземпляр класса, в котором
- //указатель (Enum). Это нужно, что бы каждый слайдер соответствовал
- //своему экземпляру класса modulBasys.
- //В modulBasys так же есть указатель (enum)
- }
- }
- void EnableAllSlider()//включаем все ранее отключонные слайдеры
- {
- for (int i = 0; i < slider.Length; i++)
- {
- slider[i].transform.parent.gameObject.SetActive(true);
- }
- }
- ModulBasys FindModulType(Image slider)
- {
- ModulType modulType = slider.GetComponentInParent<UI_Modul>().modulType;
- foreach (ModulBasys modul in PlayerController.botController.modulController)
- {
- if (modul.modulType == modulType)
- {
- return modul;
- }
- }
- return null;
- }
- void Show_HideSlider()//Включаем или выключаем нужные слайдеры
- {
- //Здесь мы проверяем условия, при которых слайдер может регулировать значение в данном modulBasys или нет.
- //На пример, если в списке нет modulBasys соответстующиго данному слайдеру, то слайдер отключается
- for (int i = 0; i < slider.Length; i++)
- {
- if (modulList.Count > i)
- {
- if (modulList[i] != null && modulList[i].useEnergy == true)
- {
- slider[i].fillAmount = modulList[i].energyReloadQuoue / 100;
- }
- else
- {
- slider[i].fillAmount = 0;
- slider[i].transform.parent.gameObject.SetActive(false);
- }
- }
- else
- {
- slider[i].fillAmount = 0;
- slider[i].gameObject.SetActive(false);
- }
- }
- }
- void ReCalculate(int index = 0)//пересчитываем значение всех слайдеров и регулируем так, что бы сумма была не больше maxSum
- {
- if (lockHandler == false)
- {
- if (GetSliderSum() <= maxSum)
- {
- return;
- }
- else
- {
- float sum = GetSliderSum() - (slider[index].fillAmount * 100);
- float sumToDistribut = 100 - (slider[index].fillAmount * 100);
- float mLocalHash = sumToDistribut / sum;
- lockHandler = true;
- foreach (Image nextSlider in slider)
- {
- if (nextSlider == slider[index])
- {
- continue;
- }
- else
- {
- nextSlider.fillAmount *= mLocalHash;
- }
- }
- lockHandler = false;
- }
- }
- }
- float GetSliderSum()//Получаем сумму значений всех слайдеров
- {
- float sum = 0;
- for (int i = 0; i < slider.Length; i++)
- {
- if (slider[i].gameObject.activeSelf == true)
- {
- sum += slider[i].fillAmount * 100;
- }
- }
- return sum;
- }
- public void ValueChange(int index)
- {
- RectTransformUtility.ScreenPointToLocalPointInRectangle(slider[index].transform as RectTransform, Input.mousePosition, raycaster.eventCamera, out mousePosition);
- angle = (Mathf.Atan2(-mousePosition.y, mousePosition.x) * 180f / Mathf.PI + 180f) / 360f;
- slider[index].fillAmount = angle;
- ReCalculate(index);
- SetValueText();
- }
- void SetValueText()
- {
- for (int i = 0; i < slider.Length; i++)
- {
- slider[i].GetComponentInChildren<Text>().text = (slider[i].fillAmount * 100).ToString("f0");
- if (modulList[i] != null)
- {
- modulList[i].energyReloadQuoue = slider[i].fillAmount * 100;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement