using System.Collections; using System.Collections.Generic; 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_StartRealmPositionx; [SerializeField] float m_EndRealmPositionx; [SerializeField] float m_BigRealmBottomWidth; [SerializeField] float m_Spacing; [SerializeField] RectTransform m_ContainerRemind; [SerializeField] PropertyBehaviour m_SpecialProperty; [SerializeField] Text m_HurtRemind; RealmModel model { get { return ModelCenter.Instance.GetModel(); } } static readonly Vector2 middleLeft = new Vector2(0, 0.5f); static readonly Vector2 middleRight = new Vector2(1, 0.5f); static readonly Vector2 middleCenter = new Vector2(0.5f, 0.5f); float leftRatio = 0f; float rightRatio = 0; public void Display() { DisplayStages(); DisplayProgress(); } void DisplayStages() { var realmLevel = PlayerDatas.Instance.baseData.realmLevel; int start = 0; int end = 0; model.TryGetRealmStage(realmLevel, out start, out end); var index = 0; m_ContainerRemind.gameObject.SetActive(false); for (int i = start; i <= realmLevel; i++) { var rect = m_RealmStages[index].transform as RectTransform; rect.anchorMax = middleLeft; rect.anchorMin = middleLeft; rect.pivot = middleLeft; if (i == start) { rect.anchoredPosition = new Vector2(m_StartRealmPositionx, 0); leftRatio = (m_StartRealmPositionx + m_RealmStages[0].GetWidth(i)) / m_ContainerPoint.rect.width; } else { var width = 0f; for (int k = start; k < i; k++) { width += m_RealmStages[0].GetWidth(k); width += m_Spacing; } var positionx = m_StartRealmPositionx + width; rect.anchoredPosition = new Vector2(positionx, 0); if (i == realmLevel) { leftRatio = (positionx + m_RealmStages[0].GetWidth(i)) / m_ContainerPoint.rect.width; } } m_RealmStages[index].gameObject.SetActive(true); m_RealmStages[index].Display(i, false); index++; } end = end == model.realmMaxLevel ? end : (end + 1); for (int i = end; i > realmLevel; i--) { var rect = m_RealmStages[index].transform as RectTransform; rect.anchorMax = middleRight; rect.anchorMin = middleRight; if (i == end) { rect.pivot = middleCenter; rect.anchoredPosition = new Vector2(m_EndRealmPositionx, 0); rightRatio = Mathf.Abs(m_EndRealmPositionx - m_BigRealmBottomWidth / 2 + 30) / m_ContainerPoint.rect.width; } else { var width = 0f; for (int k = end - 1; k > i; k--) { width += m_RealmStages[0].GetWidth(k); width += m_Spacing; } rect.pivot = middleRight; var positionx = m_EndRealmPositionx - m_BigRealmBottomWidth / 2 - m_Spacing - width; rect.anchoredPosition = new Vector2(positionx, 0); if (i == realmLevel + 1) { rightRatio = (Mathf.Abs(positionx) + m_RealmStages[0].GetWidth(i)) / m_ContainerPoint.rect.width; } } m_RealmStages[index].gameObject.SetActive(true); m_RealmStages[index].Display(i, i == end); DisplayRemind(i); index++; } for (int i = index; i < m_RealmStages.Length; i++) { m_RealmStages[i].gameObject.SetActive(false); } } public void DisplayProgress(bool anim = false) { var deltaRatio = 1 - leftRatio - rightRatio; var realmPoint = PlayerDatas.Instance.extersion.realmPoint; var config = RealmConfig.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.AppendStringColor(realmPoint >= config.NeedPoint ? TextColType.Green : TextColType.Red, realmPoint.ToString()), "/", config.NeedPoint); m_OpenRemind.text = realmPoint < config.NeedPoint ? UIHelper.ReplaceNewLine(Language.Get("RealmCollectingTab", 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 = RealmConfig.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)); } } } }