using System.Collections; using System.Collections.Generic; using TableConfig; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { public class RealmProgressBehaviour : MonoBehaviour { [SerializeField] RealmStageBehaviour[] m_RealmStages; [SerializeField] SmoothSlider m_ItemSlider; [SerializeField] Text m_RealmPoint; [SerializeField] Text m_OpenRemind; [SerializeField] RectTransform m_ContainerPoint; [SerializeField] float[] m_StageLeftRatio; [SerializeField] float[] m_StageRightRatio; [SerializeField] RectTransform m_ContainerRemind; [SerializeField] PropertyBehaviour m_SpecialProperty; [SerializeField] Text m_HurtRemind; RealmModel model { get { return ModelCenter.Instance.GetModel(); } } float leftRatio = 0; float rightRatio = 0; public void Display() { leftRatio = 0; rightRatio = 0; DisplayStages(); DisplayProgress(); } void DisplayStages() { var realmLevel = PlayerDatas.Instance.baseData.realmLevel; int start = 0;int end = 0; model.TryGetRealmStage(realmLevel, out start, out end); var leftIndex = 0; var rightIndex = 0; var index = 0; m_ContainerRemind.gameObject.SetActive(false); for (int i = start; i <= realmLevel; i++) { m_RealmStages[index].transform.localPosition = GetStagePosition(true, leftIndex); m_RealmStages[index].gameObject.SetActive(true); m_RealmStages[index].Display(i, false, true, leftIndex); leftRatio = m_StageLeftRatio[leftIndex]; leftIndex++; index++; } end = end == model.realmMaxLevel ? end : (end + 1); for (int i = end; i > realmLevel; i--) { m_RealmStages[index].transform.localPosition = GetStagePosition(false, rightIndex); m_RealmStages[index].gameObject.SetActive(true); m_RealmStages[index].Display(i, i == end, false, rightIndex); DisplayRemind(i); rightRatio = m_StageRightRatio[rightIndex]; rightIndex++; index++; } for (int i = index; i < m_RealmStages.Length; i++) { m_RealmStages[i].gameObject.SetActive(false); } } public void DisplayProgress(bool anim = false) { var deltaRatio = rightRatio - leftRatio; var realmPoint = PlayerDatas.Instance.extersion.realmPoint; var config = Config.Instance.Get(PlayerDatas.Instance.baseData.realmLevel); var progress = leftRatio + deltaRatio * (Mathf.Min((float)realmPoint / config.NeedPoint, 1)); m_ItemSlider.delay = anim ? 0.2f : 0f; m_ItemSlider.value = progress; m_RealmPoint.transform.localPosition = m_RealmPoint.transform.localPosition.SetX(m_ContainerPoint.rect.width * (leftRatio + deltaRatio * 0.5f)); m_RealmPoint.text = StringUtility.Contact(UIHelper.GetTextColorByItemColor(realmPoint >= config.NeedPoint ? TextColType.Green : TextColType.Red, realmPoint.ToString()), "/", config.NeedPoint); m_OpenRemind.text = realmPoint < config.NeedPoint ? Language.Get("RealmCollecting", config.NeedPoint - realmPoint) : string.Empty; m_OpenRemind.transform.localPosition = m_OpenRemind.transform.localPosition.SetX(m_ContainerPoint.rect.width * (leftRatio + deltaRatio * 0.5f)); } public void DisplayRemind(int _realmLv) { var config = Config.Instance.Get(_realmLv); if (config.specialProperty != 0) { m_ContainerRemind.gameObject.SetActive(true); var index = 0; for (int i = 0; i < config.AddAttrType.Length; i++) { if (config.AddAttrType[i] == config.specialProperty) { index = i; break; } } m_SpecialProperty.DisplayColon(config.specialProperty, config.AddAttrNum[index]); m_HurtRemind.text = UIHelper.ReplaceNewLine(Language.Get("RealmSuppressHurt", UIHelper.GetRealmName(config.Lv), (float)model.realmSuppressHurt / 100)); } } Vector3 GetStagePosition(bool left, int index) { if (left && index >= m_StageLeftRatio.Length) { return Vector3.zero; } if (!left && index >= m_StageRightRatio.Length) { return Vector3.zero; } var ratio = left ? m_StageLeftRatio[index] : m_StageRightRatio[index]; Vector3 localpos = Vector3.zero.SetX(m_ContainerPoint.rect.width * ratio); return localpos; } #if UNITY_EDITOR private void LateUpdate() { for (int i = 0; i < m_RealmStages.Length; i++) { if (m_RealmStages[i].gameObject.activeSelf) { m_RealmStages[i].transform.localPosition = GetStagePosition(m_RealmStages[i].left, m_RealmStages[i].index); } } } #endif } }