using DG.Tweening; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using Adam; using System; using System.IO; using Newtonsoft.Json; using UnityEngine.UI; using TMPro; [Serializable] public class DependencyLevel { public int level; public GameObject[] objs; } public class Bootstrap : MonoSingleton { public LandMarksAndInfoController landMarkAndInfoCotroller; /// /// 0 省会 1 城市 2 区县 /// public int currentLevel = 0; public int currentDistCode; private List landMarks = new List(); /// /// 透明 /// public Material[] opacity; /// /// 选中 /// public Material[] select; /// /// 默认 /// public Material[] mat; /// /// 当前选中板块 /// //[HideInInspector] public GameObject currentLand; /// /// 当前选择进入下一层级的板块 /// public GameObject clickLand; public CameraRT cameraRt; /// /// 省会 /// public Transform provincialCapital; /// /// 城市 /// public Transform cityParents; /// /// 县级区域 /// public Transform areaParents; ///// ///// 省级视角 ///// //public Transform provincialCapitalView; public LevelBtnAttach[] cityBtns; public Transform lastCity; public GameObject currentArea; private Dictionary _fadeTweens = new Dictionary(); [HideInInspector] public WebAdapter webAdapter; [HideInInspector] public RayHitTester rayHitTester; [HideInInspector] public DataController dataController; public GameObject lastLand; public GameObject lastCompanyPoint; [Header("依附哪个层级上的物体")] public List dependencyLevel = new List(); public int clickCurrentLevel = 2; private RaycastHit hit; [ContextMenu("1")] private void Awake() { webAdapter = GetComponent(); rayHitTester = GetComponent(); dataController = GetComponent(); } void Start() { //landMarks = new List { "网络负荷:49.84 kw", "上网负荷:49.84 kw", "削峰负荷:49.84 kw", "填谷负荷:49.84 kw", "发电负荷:49.84 kw" }; landMarkAndInfoCotroller.gameObject.SetActive(false); cameraRt.onLimitScroll += (s) => { //SwitchLand(s); //webAdapter.OnLevelChange(s); //webAdapter.OnDistCodeChange(currentDistCode); }; cameraRt.onLeftMouseDown += () => { OnLeftClick(); }; for (int i = 0; i < cityBtns.Length; i++) { int index = i; cityBtns[index].selfBtns.onClick.AddListener(() => { if (index == 1) SwitchLand(index, true); else SwitchLand(index); webAdapter.OnLevelChange(clickCurrentLevel); webAdapter.OnDistCodeChange(currentDistCode); SwitchLevel(currentLevel); }); } cityBtns[2].SetStates(true, true, 2, "山东省"); cityBtns[1].SetStates(false); cityBtns[0].SetStates(false); } private void Update() { hit = rayHitTester.HitTest(); if (hit.collider != null) { landMarks.Clear(); if (!hit.collider.CompareTag("companyInfo")) { if (hit.collider.gameObject != lastLand) { CloseLandMark(); } currentLand = hit.collider.gameObject; if (currentLand == lastLand) return; } else { if (hit.collider.gameObject != lastCompanyPoint) { Debug.Log("公司"); landMarks = hit.collider.GetComponent().GetCompanyInfo(); Vector3 worldToScreenPoint = Camera.main.WorldToScreenPoint(new Vector3(hit.collider.gameObject.transform.position.x, hit.collider.gameObject.transform.position.y, hit.collider.gameObject.transform.position.z)); landMarkAndInfoCotroller.gameObject.SetActive(true); landMarkAndInfoCotroller.GetComponent().position = new Vector3(worldToScreenPoint.x, worldToScreenPoint.y, 0); if (currentArea != null) landMarkAndInfoCotroller.SetMarksInfo(currentArea.name, landMarks); lastCompanyPoint = hit.collider.gameObject; } } ShowLandMark(); } else { CloseLandMark(); } } public void OnLeftClick() { if (hit.collider != null) { //Debug.Log("clickCurrentLevel==" + clickCurrentLevel); if (cameraRt.currentLevelIndex == 0) return; clickCurrentLevel--; if (clickCurrentLevel <= 0) { clickCurrentLevel = 0; } cameraRt.currentLevelIndex = clickCurrentLevel; //currentLevel = clickCurrentLevel; clickLand = hit.collider.gameObject; SwitchLand(clickCurrentLevel); webAdapter.OnLevelChange(clickCurrentLevel); webAdapter.OnDistCodeChange(currentDistCode); SwitchLevel(currentLevel); } } /// /// 展示地标 /// /// public async void ShowLandMark() { if (currentLand == null) return; currentLand.GetComponent().materials = select; Vector3 worldToScreenPoint = Camera.main.WorldToScreenPoint(new Vector3(currentLand.transform.position.x, currentLand.transform.position.y, currentLand.transform.position.z)); lastLand = currentLand; //SwitchLevel(-1); //AreaData areaData = currentLand.GetComponent().areaData; string distCode = currentLand.GetComponent().distCode; if (string.IsNullOrEmpty(distCode)) return; AreaData areaData = await dataController.GetAreaPopUpDataByDistCode(distCode); landMarks.Clear(); if (areaData != null && !string.IsNullOrEmpty(areaData.success) && bool.Parse(areaData.success)) { for (int i = 0; i < areaData.data.items.Count; i++) { string info = $"{areaData.data.items[i].label}:{areaData.data.items[i].value}{areaData.data.items[i].unit}"; landMarks.Add(info); } landMarkAndInfoCotroller.gameObject.SetActive(true); landMarkAndInfoCotroller.GetComponent().position = new Vector3(worldToScreenPoint.x, worldToScreenPoint.y, 0); if (currentLand != null) landMarkAndInfoCotroller.SetMarksInfo(currentLand.name, landMarks); } } /// /// 关闭地标 /// public void CloseLandMark() { landMarkAndInfoCotroller.gameObject.SetActive(false); if (lastLand != null) { lastLand.GetComponent().materials = mat; lastLand = null; } currentLand = null; lastCompanyPoint = null; //SwitchLevel(currentLevel); } /// /// 2 省会 1 城市 0 区县 /// public void SwitchLand(int _currentLevel, bool isBtnClick = false) { //if (currentLand == null) return; landMarkAndInfoCotroller.gameObject.SetActive(false); currentLevel = _currentLevel; clickCurrentLevel = _currentLevel; dataController.RemoveCompanyPoint(); switch (currentLevel) { case 2: cameraRt.SetTarget(provincialCapital, 120f); cityBtns[1].SetStates(false); cityBtns[2].SetStates(true, true, 2); //Debug.Log("省会"); for (int i = 0; i < cityParents.childCount; i++) { cityParents.GetChild(i).gameObject.SetActive(false); } lastCity = null; SwitchMatShow(provincialCapital); currentDistCode = 37; break; case 1: //Debug.Log("城市"); if (lastCity) { cameraRt.SetTarget(lastCity, 30f); if (currentArea != null) currentArea.SetActive(false); cityBtns[0].SetStates(false); cityBtns[1].SetStates(true, true, 2); cityBtns[2].SetStates(true, true, 1); string disCode = currentArea.GetComponent().distCode; if (!string.IsNullOrEmpty(disCode)) currentDistCode = int.Parse(disCode.Substring(0, 4)); SwitchMatShow(lastCity); lastCity = null; } else { if (!isBtnClick) { cameraRt.SetTarget(clickLand.transform, 30f); for (int i = 0; i < cityParents.childCount; i++) { var child = cityParents.GetChild(i).gameObject; child.SetActive(child.name == clickLand.name); } currentDistCode = int.Parse(clickLand.GetComponent().distCode); cityBtns[1].SetStates(true, true, 2, clickLand.GetComponent().cityName); cityBtns[2].SetStates(true, true, 1); SwitchMatHide(provincialCapital); } } break; case 0: lastCity = clickLand.transform.parent; cameraRt.SetTarget(clickLand.transform); SwitchMatHide(lastCity); for (int i = 0; i < areaParents.childCount; i++) { var child = areaParents.GetChild(i).gameObject; child.SetActive(child.name == clickLand.name); if (child.activeSelf) { currentArea = child; } } string disCodeTemp = currentArea.GetComponent().distCode; cityBtns[0].SetStates(true, true, 2, clickLand.GetComponent().cityName); cityBtns[1].SetStates(true, true, 1); cityBtns[2].SetStates(true, false, 0); if (!string.IsNullOrEmpty(disCodeTemp)) { currentDistCode = int.Parse(disCodeTemp); if (currentArea.GetComponent().LA.x != 0) { currentArea.GetComponent().SetOriginalVectorAndL(); } dataController.GetAllCompanyInfo(disCodeTemp); } //Debug.Log("区县"); break; } for (int i = 0; i < dependencyLevel.Count; i++) { for (int j = 0; j < dependencyLevel[i].objs.Length; j++) { dependencyLevel[i].objs[j].SetActive(dependencyLevel[i].level == currentLevel); } } } /// /// 切换城市按钮 /// public void SwitchCityBtns(int currentLevel) { switch (currentLevel) { case 0: break; case 1: break; case 2: break; } } public void SwitchMatShow(Transform parent) { if (_fadeTweens.TryGetValue(parent, out var tween)) { tween.Kill(true); _fadeTweens.Remove(parent); } var renderers = GetMeshRenderers(parent); List currentMaters = new List(); for (int i = 0; i < renderers.Count; i++) { renderers[i].gameObject.SetActive(true); for (int j = 0; j < renderers[i].materials.Length; j++) { currentMaters.Add(renderers[i].materials[j]); } } tween = DOVirtual.Float(1, 0, 0.5f, t => { for (int i = 0; i < currentMaters.Count; i++) { currentMaters[i].SetFloat("_Opacity", t); } }).OnComplete(() => { for (int i = 0; i < renderers.Count; i++) { renderers[i].GetComponent().enabled = true; renderers[i].materials = mat; if (renderers[i].transform.childCount > 0) { for (int j = 0; j < renderers[i].transform.childCount; j++) { bool isShow = renderers[i].transform.GetChild(j).GetComponent().isHaveValue; renderers[i].transform.GetChild(j).gameObject.SetActive(isShow); } } } _fadeTweens.Remove(parent); }); _fadeTweens.Add(parent, tween); } private void SwitchMatHide(Transform parent) { if (_fadeTweens.TryGetValue(parent, out var tween)) { tween.Kill(true); _fadeTweens.Remove(parent); } var renderers = GetMeshRenderers(parent); for (int i = 0; i < renderers.Count; i++) { renderers[i].GetComponent().enabled = false; renderers[i].materials = opacity; if (renderers[i].transform.childCount > 0) { for (int j = 0; j < renderers[i].transform.childCount; j++) { renderers[i].transform.GetChild(j).gameObject.SetActive(false); } } } List currentMaters = new List(); for (int i = 0; i < renderers.Count; i++) { for (int j = 0; j < renderers[i].materials.Length; j++) { currentMaters.Add(renderers[i].materials[j]); } } tween = DOVirtual.Float(0, 1, 0.5f, t => { for (int i = 0; i < currentMaters.Count; i++) { currentMaters[i].SetFloat("_Opacity", t); } }).OnComplete(() => { for (int i = 0; i < renderers.Count; i++) { renderers[i].gameObject.SetActive(false); } _fadeTweens.Remove(parent); }); _fadeTweens.Add(parent, tween); } private List GetMeshRenderers(Transform t) { List renderers = new List(); for (int i = 0; i < t.childCount; i++) { renderers.Add(t.GetChild(i).GetComponent()); } return renderers; } private void SwitchLevel(int currentLevel) { switch (currentLevel) { case -1: cameraRt.SetMaxMinDistance(10f, 120f); break; case 0: cameraRt.SetMaxMinDistance(10f, 20f); break; case 1: cameraRt.SetMaxMinDistance(30f, 60f); break; case 2: cameraRt.SetMaxMinDistance(70f, 120f); break; } } }