484 lines
16 KiB
C#
484 lines
16 KiB
C#
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<Bootstrap>
|
||
{
|
||
public LandMarksAndInfoController landMarkAndInfoCotroller;
|
||
/// <summary>
|
||
/// 0 省会 1 城市 2 区县
|
||
/// </summary>
|
||
public int currentLevel = 0;
|
||
public int currentDistCode;
|
||
|
||
private List<string> landMarks = new List<string>();
|
||
/// <summary>
|
||
/// 透明
|
||
/// </summary>
|
||
public Material[] opacity;
|
||
/// <summary>
|
||
/// 选中
|
||
/// </summary>
|
||
public Material[] select;
|
||
/// <summary>
|
||
/// 默认
|
||
/// </summary>
|
||
public Material[] mat;
|
||
/// <summary>
|
||
/// 当前选中板块
|
||
/// </summary>
|
||
//[HideInInspector]
|
||
public GameObject currentLand;
|
||
/// <summary>
|
||
/// 当前选择进入下一层级的板块
|
||
/// </summary>
|
||
public GameObject clickLand;
|
||
|
||
public CameraRT cameraRt;
|
||
/// <summary>
|
||
/// 省会
|
||
/// </summary>
|
||
public Transform provincialCapital;
|
||
/// <summary>
|
||
/// 城市
|
||
/// </summary>
|
||
public Transform cityParents;
|
||
/// <summary>
|
||
/// 县级区域
|
||
/// </summary>
|
||
public Transform areaParents;
|
||
|
||
///// <summary>
|
||
///// 省级视角
|
||
///// </summary>
|
||
//public Transform provincialCapitalView;
|
||
|
||
|
||
public LevelBtnAttach[] cityBtns;
|
||
|
||
|
||
public Transform lastCity;
|
||
public GameObject currentArea;
|
||
private Dictionary<Transform, Tween> _fadeTweens = new Dictionary<Transform, Tween>();
|
||
[HideInInspector]
|
||
public WebAdapter webAdapter;
|
||
[HideInInspector]
|
||
public RayHitTester rayHitTester;
|
||
[HideInInspector]
|
||
public DataController dataController;
|
||
public GameObject lastLand;
|
||
public GameObject lastCompanyPoint;
|
||
[Header("依附哪个层级上的物体")]
|
||
public List<DependencyLevel> dependencyLevel = new List<DependencyLevel>();
|
||
public int clickCurrentLevel = 2;
|
||
private RaycastHit hit;
|
||
[ContextMenu("1")]
|
||
private void Awake()
|
||
{
|
||
webAdapter = GetComponent<WebAdapter>();
|
||
rayHitTester = GetComponent<RayHitTester>();
|
||
dataController = GetComponent<DataController>();
|
||
}
|
||
|
||
void Start()
|
||
{
|
||
//landMarks = new List<string> { "网络负荷: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<CompanyInfo>().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<RectTransform>().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);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 展示地标
|
||
/// </summary>
|
||
/// <param name="land"></param>
|
||
public async void ShowLandMark()
|
||
{
|
||
if (currentLand == null) return;
|
||
currentLand.GetComponent<MeshRenderer>().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<CityInfo>().areaData;
|
||
string distCode = currentLand.GetComponent<CityInfo>().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<RectTransform>().position = new Vector3(worldToScreenPoint.x, worldToScreenPoint.y, 0);
|
||
if (currentLand != null)
|
||
landMarkAndInfoCotroller.SetMarksInfo(currentLand.name, landMarks);
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 关闭地标
|
||
/// </summary>
|
||
public void CloseLandMark()
|
||
{
|
||
landMarkAndInfoCotroller.gameObject.SetActive(false);
|
||
if (lastLand != null)
|
||
{
|
||
lastLand.GetComponent<MeshRenderer>().materials = mat;
|
||
lastLand = null;
|
||
}
|
||
currentLand = null;
|
||
lastCompanyPoint = null;
|
||
//SwitchLevel(currentLevel);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 2 省会 1 城市 0 区县
|
||
/// </summary>
|
||
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<CityInfo>().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<CityInfo>().distCode);
|
||
cityBtns[1].SetStates(true, true, 2, clickLand.GetComponent<CityInfo>().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<CityInfo>().distCode;
|
||
cityBtns[0].SetStates(true, true, 2, clickLand.GetComponent<CityInfo>().cityName);
|
||
cityBtns[1].SetStates(true, true, 1);
|
||
cityBtns[2].SetStates(true, false, 0);
|
||
if (!string.IsNullOrEmpty(disCodeTemp))
|
||
{
|
||
currentDistCode = int.Parse(disCodeTemp);
|
||
if (currentArea.GetComponent<CityInfo>().LA.x != 0)
|
||
{
|
||
currentArea.GetComponent<CityInfo>().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);
|
||
}
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 切换城市按钮
|
||
/// </summary>
|
||
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<Material> currentMaters = new List<Material>();
|
||
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<Collider>().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<AggregateStation>().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<Collider>().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<Material> currentMaters = new List<Material>();
|
||
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<MeshRenderer> GetMeshRenderers(Transform t)
|
||
{
|
||
List<MeshRenderer> renderers = new List<MeshRenderer>();
|
||
for (int i = 0; i < t.childCount; i++)
|
||
{
|
||
renderers.Add(t.GetChild(i).GetComponent<MeshRenderer>());
|
||
}
|
||
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;
|
||
|
||
}
|
||
}
|
||
|
||
|
||
}
|