using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using AX.MessageSystem; using UnityEngine.UI; using System.Linq; public struct FloorData { public string buildNum;//楼号 public int floorNum;//层号 public int interlayerNum;//夹层号,0表示不是夹层,1表示第一个夹层 public bool isOn; } public class UIFloor : BaseToggle { //楼层切换UI,发送楼层切换消息 public string buildNum;//楼号 public int floorNum;//层号 public int interlayerNum;//夹层号,0表示不是夹层,1表示第一个夹层 public List MyChildFloors = new List();//所含楼层 public FloorsPanelManager floorsPanelManager; public Text MyText; public GameObject HasChild;//显示该建筑(区域)下的所有楼层 public Transform MyTarget; private CameraManager cameraManager; private float FollowCameraDistance = 100f; public override void RespondFun(bool isOn) { var group = GetComponent().group; var anyIsOn = group.AnyTogglesOn(); var data = new FloorData { buildNum = buildNum, floorNum = floorNum, interlayerNum = interlayerNum, isOn = isOn }; if ((anyIsOn && isOn) || !anyIsOn) { GlobalVariable.CurrentFloor = data; MessageDispatcher.SendMessage("FloorNumChanged", data); } if (isOn) { if (MyChildFloors.Count > 0) { // Camera.main.GetComponent().SetCameraWhileSetFloor(MyTarget.position); foreach (var item in MyChildFloors) { item.gameObject.SetActive(true); } } ShowFloor(data); } else { if (MyChildFloors.Count > 0) { foreach (var item in MyChildFloors) { if (item.GetComponent().isOn) { item.GetComponent().isOn = false; } item.gameObject.SetActive(false); } } HideFloor(); } } private void HideFloor() { foreach (var item in floorsPanelManager.AllNei) { item.gameObject.SetActive(true); } foreach (var item in floorsPanelManager.AllWai) { item.gameObject.SetActive(true); } } private void ShowFloor(FloorData data) { if (Mathf.Abs(data.floorNum) > 0) { foreach (var item in floorsPanelManager.AllWai) { if (item.buildNum == data.buildNum && item.floorNum > data.floorNum && Mathf.Abs(item.floorNum) > 0) { item.gameObject.SetActive(false); } } foreach (var item in floorsPanelManager.AllNei) { if (item.buildNum == data.buildNum && item.floorNum > data.floorNum && Mathf.Abs(item.floorNum) > 0) { item.gameObject.SetActive(false); } if (item.buildNum == data.buildNum && item.floorNum == data.floorNum && item.interlayerNum > data.interlayerNum && Mathf.Abs(item.floorNum) > 0) { item.gameObject.SetActive(false); } } } if (MyTarget != null && floorNum == 0)//镜头拉近 { cameraManager.CameraFollowTarget(MyTarget.position, FollowCameraDistance); } if (ReplaySetting.PlayStatus == PlayStatus.isEditor && RecordManager.Instance.recordStatus == RecordStatus.normal) { AddRecordUIFloor(data); } } private void AddRecordUIFloor(FloorData data) { var eventData = new EventData(); eventData.time = RecordManager.Instance.RecordTimer; eventData.cloneObjType = CloneObjType.None; eventData.eventType = RecordEventType.UIFloor; eventData.json = JsonUtility.ToJson(data); RecordManager.Instance.jsonData.eventDataList.Add(eventData); } void Start() { MessageDispatcher.AddListener("ToChangeFloor", changeFloor); //MessageDispatcher.AddListener("ReplayFrame", ReplayFrameUIFloor); //MessageDispatcher.AddListener("ReplayEvent", ReplayUIFloor); cameraManager = Camera.main.GetComponent(); } private void ReplayUIFloor(IMessage obj) { var eventData = (EventData)obj.Data; if (eventData.eventType == RecordEventType.UIFloor) { FloorData data = JsonUtility.FromJson(eventData.json); Setting(data); } } private void Setting(FloorData data) { foreach (Transform item in floorsPanelManager.FloorBtnsParentPanel) { if (item.gameObject.activeSelf && item.GetComponent().isOn) item.GetComponent().isOn = false; } if (data.buildNum == buildNum && data.floorNum == floorNum && data.interlayerNum == interlayerNum) { if (data.isOn) { if (Mathf.Abs(data.floorNum) > 0) { GetComponentInParent().isOn = true; GetComponent().isOn = true; } else { GetComponent().isOn = true; } } } } private void ReplayFrameUIFloor(IMessage obj) { var objectData = (ObjectData)obj.Data; if (objectData.cloneObjType == CloneObjType.UIFloor) { FloorData data = JsonUtility.FromJson(objectData.json); Setting(data); } } public override void OnDestroy() { base.OnDestroy(); MessageDispatcher.RemoveListener("ToChangeFloor", changeFloor); //MessageDispatcher.RemoveListener("ReplayFrame", ReplayFrameUIFloor); //MessageDispatcher.RemoveListener("ReplayEvent", ReplayUIFloor); } private void changeFloor(IMessage msg) { var data = (FloorData)msg.Data; if (data.buildNum == buildNum && data.floorNum == floorNum && data.interlayerNum == interlayerNum) { GetComponent().isOn = true; } } }