ShanDongVirtualPowerPlant/u3d-ShanDongVirtualPowerPlant/Assets/Adam/Scripts/Bootstrap.cs

484 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}