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

385 lines
12 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;
[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;
public CameraRT cameraRt;
/// <summary>
/// 省会
/// </summary>
public Transform provincialCapital;
/// <summary>
/// 城市
/// </summary>
public Transform cityParents;
/// <summary>
/// 县级区域
/// </summary>
public Transform areaParents;
private Transform lastCity;
private GameObject currentArea;
/// <summary>
/// 城市
/// </summary>
//public GameObject[] citys;
private Dictionary<Transform, Tween> _fadeTweens = new Dictionary<Transform, Tween>();
[HideInInspector]
public WebAdapter webAdapter;
[HideInInspector]
public RayHitTester rayHitTester;
public GameObject lastLand;
[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>();
}
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();
//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);
}
}
/// <summary>
/// 展示地标
/// </summary>
/// <param name="land"></param>
public 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;
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;
SwitchLevel(currentLevel);
}
/// <summary>
/// 2 省会 1 城市 0 区县
/// </summary>
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<CityInfo>().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<CityInfo>().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<CityInfo>().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<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;
}
}
}