//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Monday, January 21, 2019 //-------------------------------------------------------- using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using System; namespace vnxbqy.UI { public class SkyTowerBehaviour : MonoBehaviour { [SerializeField] ScrollRect m_Tower; RectTransform m_RectTransform; RectTransform rectTransform { get { return m_RectTransform ?? (this.transform as RectTransform); } } float topHeight = 0f; float floorHeight = 0f; float bottomHeight = 0f; GameObject towerTop = null; GameObject towerBottom = null; SkyTowerFloorBehaviour towerTopBehaviour; bool hasCreateTowerResources = false; List floorBehaviours = new List(); SkyTowerModel model { get { return ModelCenter.Instance.GetModel(); } } public void Display() { var scrollRectTransform = m_Tower.transform as RectTransform; scrollRectTransform.localScale = Vector3.one; scrollRectTransform.anchoredPosition = Vector2.zero; DisplayTowerBaseInfo(); MoveToTargetFloor(model.currentFloor); } public void Dispose() { m_Tower.scrollSensitivity = 1f; } void MoveToTargetFloor(int floor) { var floors = model.GetShowFloors(); var floorIndex = floors.IndexOf(floor); if (floorIndex < 2) { m_Tower.verticalNormalizedPosition = 0f; } else if (floorIndex >= floors.Count - 2) { var hasTop = model.IsTopFloor(floors[floors.Count - 1]); if (hasTop) { if (floorIndex >= floors.Count - 1) { m_Tower.verticalNormalizedPosition = 1f; } else { m_Tower.verticalNormalizedPosition = 0.5f; } } else { m_Tower.verticalNormalizedPosition = 1f; } } else { m_Tower.verticalNormalizedPosition = 0.5f; } } private void DisplayTowerBaseInfo() { CreateTowerResources(); var floors = model.GetShowFloors(); var hasTop = model.IsTopFloor(floors[floors.Count - 1]); var normalCount = hasTop ? floors.Count - 1 : floors.Count; if (hasTop) { towerTopBehaviour.SetActive(true); towerTopBehaviour.Display(floors[floors.Count - 1]); } else { towerTopBehaviour.SetActive(false); } for (var i = 0; i < floorBehaviours.Count; i++) { var behaviour = floorBehaviours[i]; if (i < normalCount) { behaviour.SetActive(true); behaviour.Display(floors[floors.Count - (i + (hasTop ? 2 : 1))]); } else { behaviour.SetActive(false); } } var hasBottom = model.IsBottomFloor(floors[0]); towerBottom.SetActive(hasBottom); } private void CreateTowerResources() { if (hasCreateTowerResources) { return; } towerTop = UIUtility.CreateWidget("SkyTower_Top", "Top"); towerTop.transform.SetParentEx(m_Tower.content, Vector3.zero, Quaternion.identity, Vector3.one); towerTop.transform.SetAsFirstSibling(); topHeight = ((RectTransform)towerTop.transform).rect.height; towerTopBehaviour = towerTop.AddMissingComponent(); var floorPrefab = UILoader.LoadPrefab("SkyTower_Floor"); floorHeight = ((RectTransform)floorPrefab.transform).rect.height; for (int i = 0; i < 5; i++) { var instance = Instantiate(floorPrefab); var floorBehaviour = instance.AddMissingComponent(); instance.transform.SetParentEx(m_Tower.content, Vector3.zero, Quaternion.identity, Vector3.one); floorBehaviours.Add(floorBehaviour); } towerBottom = UIUtility.CreateWidget("SkyTower_Bottom", "Bottom"); towerBottom.transform.SetParentEx(m_Tower.content, Vector3.zero, Quaternion.identity, Vector3.one); towerBottom.transform.SetAsLastSibling(); bottomHeight = ((RectTransform)towerBottom.transform).rect.height; hasCreateTowerResources = true; } private void OnDisable() { StopAllCoroutines(); } } }