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; [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 CameraRT cameraRt; /// /// 省会 /// public Transform provincialCapital; /// /// 城市 /// public Transform cityParents; /// /// 县级区域 /// public Transform areaParents; private Transform lastCity; private GameObject currentArea; /// /// 城市 /// //public GameObject[] citys; private Dictionary _fadeTweens = new Dictionary(); [HideInInspector] public WebAdapter webAdapter; [HideInInspector] public RayHitTester rayHitTester; public GameObject lastLand; [Header("依附哪个层级上的物体")] public List dependencyLevel = new List(); public int clickCurrentLevel = 2; private RaycastHit hit; [ContextMenu("1")] private void Awake() { webAdapter = GetComponent(); rayHitTester = 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(); //webAdapter.OnDistCodeChange(currentDistCode); }; } private void Update() { hit = rayHitTester.HitTest(); if (hit.collider != null) { landMarks.Clear(); if (hit.collider.gameObject != lastLand) { CloseLandMark(); } currentLand = hit.collider.gameObject; if (currentLand == lastLand) return; 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; SwitchLand(clickCurrentLevel); cameraRt.SetTarget(hit.collider.transform); } } /// /// 展示地标 /// /// public 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; 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; SwitchLevel(currentLevel); } /// /// 2 省会 1 城市 0 区县 /// public void SwitchLand(int _currentLevel) { if (currentLand == null) return; landMarkAndInfoCotroller.gameObject.SetActive(false); currentLevel = _currentLevel; clickCurrentLevel = _currentLevel; switch (currentLevel) { case 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) { if (currentArea != null) currentArea.SetActive(false); string disCode = currentArea.GetComponent().distCode; currentDistCode = int.Parse(disCode.Substring(0, 4)); SwitchMatShow(lastCity); lastCity = null; } else { for (int i = 0; i < cityParents.childCount; i++) { var child = cityParents.GetChild(i).gameObject; child.SetActive(child.name == currentLand.name); } currentDistCode = int.Parse(currentLand.GetComponent().distCode); SwitchMatHide(provincialCapital); } break; case 0: lastCity = currentLand.transform.parent; SwitchMatHide(lastCity); for (int i = 0; i < areaParents.childCount; i++) { var child = areaParents.GetChild(i).gameObject; child.SetActive(child.name == currentLand.name); if (child.activeSelf) { currentArea = child; } } currentDistCode = int.Parse(currentArea.GetComponent().distCode); //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 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; } } }