powerfun-unity/Assets/Scripts/UI/Prefab/Panel/BigMapController.cs

476 lines
14 KiB
C#

using Assets.Scripts.Apis;
using Mapbox.Unity.Map;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Linq;
using Mapbox.Unity.MeshGeneration.Data;
using Newtonsoft.Json.Linq;
using Assets.Scripts;
using Mapbox.Utils;
using UnityEngine.UI;
using Assets.Scripts.Apis.Models;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
using Mapbox.Examples;
using DG.Tweening;
public class BigMapController : PFUIPanel
{
MapApi mapApi;
MapBoxApi mapboxApi;
AbstractMap mapManager;
//GameObject cube;
//GameObject cube1;
GameObject canvas;
GameObject content;
Text keyword;
UnityEngine.Object begin;
Sprite end;
private Dictionary<int, LineItem> linesCache = new Dictionary<int, LineItem>();
UnityEngine.Object tipsObject;
private Tips _tips;
private Tips tips
{
get
{
if (_tips == null)
{
_tips = ((GameObject)Instantiate(tipsObject, canvas.transform.Find("TipsContainer"))).GetComponent<Tips>();
}
return _tips;
}
set
{
_tips = value;
}
}
int timer = 0;
protected override void Awake()
{
var cg = this.transform.Find("Canvas").GetComponent<CanvasGroup>();
cg.alpha = 0;
mapApi = new MapApi();
mapboxApi = new MapBoxApi();
begin = Resources.Load("UI/Prefab/BigMap/Begin");
mapManager = this.transform.Find("Map").GetComponent<AbstractMap>();
mapManager.MaxZoom = 4;
mapManager.OnInitialized += MapManager_OnInitialized;
mapManager.OnUpdated += MapManager_OnUpdated;
//// mapManager.OnTileFinished += MapManager_OnTileFinished;
//mapManager.SetZoom(13);
//mapManager.SetCenterLatitudeLongitude(new Mapbox.Utils.Vector2d(32.051203, 118.771572));
this.transform.Find("Map").GetComponent<QuadTreeCameraMovement>()._referenceCamera = Camera.main;
canvas = this.transform.Find("Canvas").gameObject;
canvas.GetComponent<Canvas>().worldCamera = Camera.main;
var goList = canvas.transform.Find("SwitchMode");
SetRounded(goList, 64);
UIManager.AddEvent(goList.gameObject, EventTriggerType.PointerClick, (e) =>
{
mapManager.Destroy();
UIManager.ShowMapListPanel();
//this.gameObject.SetActive(false);
//DestroyImmediate(this.gameObject);
});
var panel = canvas.transform.Find("Panel");
base.SetRounded(panel,30f);
content = panel.Find("Scroll View").Find("Viewport").Find("Content").gameObject;
var input = panel.Find("InputField");
base.SetRounded(input, 20f);
keyword = input.Find("Text").GetComponent<Text>();
var searchBtn = input.Find("Search").gameObject;
UIManager.AddEvent(searchBtn, EventTriggerType.PointerClick, Search);
tipsObject = Resources.Load("UI/Prefab/BigMap/Tips");
//tips = ((GameObject)Instantiate(tipsObject, canvas.transform.Find("TipsContainer"))).GetComponent<Tips>();
//tips.Hide();
BindHeadImage();
}
/// <summary>
/// 绑定头像
/// </summary>
void BindHeadImage()
{
var headImage = canvas.transform.Find("HeadImage").GetComponent<RawImage>();
//var material = Instantiate(Resources.Load<Material>("UI/Material/RoundedCornersTextureMaterial"));
var rect = ((RectTransform)headImage.transform).rect;
//material.SetVector(Shader.PropertyToID("_WidthHeightRadius"), new Vector4(rect.width, rect.height, rect.height, 0));
//headImage.material = material;
SetRounded(headImage.transform, rect.height);
Utils.DisplayImage(StartCoroutine, headImage, App.CurrentUser.WxHeadImg);
UIManager.AddEvent(headImage.gameObject, EventTriggerType.PointerClick, (e) =>
{
UIManager.ShowUserInfoPanel();
});
}
// Start is called before the first frame update
protected override void Start()
{
//var mapObject = this.transform.Find("Map");
}
private void Search(BaseEventData e)
{
if (string.IsNullOrWhiteSpace(keyword.text))
{
return;
}
var infoStr = mapboxApi.GetAddressInfo(keyword.text);
//Debug.Log(info);
var info = Newtonsoft.Json.Linq.JObject.Parse(infoStr);
var center = (info["features"] as JArray).First()["center"];
mapManager.UpdateMap(new Vector2d(Convert.ToDouble(center[1]), Convert.ToDouble(center[0])));
//mapManager.SetCenterLatitudeLongitude(new Vector2d(31.325053, 120.623564));
//mapManager.UpdateMap(new Vector2d(31.325053, 120.623564));
}
private void MapManager_OnInitialized()
{
Load();
}
private void MapManager_OnUpdated()
{
Debug.Log("update");
foreach (var item in linesCache)
{
//if(item.Value.LineObject != null)
//{
// item.Value.LineObject.Destroy();
// item.Value.LineObject = null;
//}
//if(item.Value.BeginMarker != null)
//{
// item.Value.BeginMarker.Destroy();
// item.Value.BeginMarker = null;
//}
CreateLine(item.Key, item.Value);
}
timer += 1;
Invoke("Load", 0.3f);
//Load();
}
async void Load()
{
if (timer >1)
{
timer--;
return;
}
timer = 0;
var s1 = Camera.main.ScreenToWorldPoint(new Vector3(340f, 0f, 180f));
//Debug.Log(s1);
var start = mapManager.WorldToGeoPosition(s1);
//Debug.Log(start);
var worldPoint = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, 180f));
var end = mapManager.WorldToGeoPosition(worldPoint);
//cube.transform.position = worldPoint;
//cube1.transform.position = s1;
//Debug.Log(end);
//Screen.width
//map.WorldToGeoPosition(start)
var bounds = $"{ start.y },{ start.x };{ end.y },{ end.x }";
var res = await mapApi.GetNearRouteAsync((float)mapManager.CenterLatitudeLongitude.x, (float)mapManager.CenterLatitudeLongitude.y,
mapManager.Zoom, bounds);
if(res.result == false)
{
Debug.LogError(res.errMsg);
return;
}
//Debug.Log("条数:"+res.data.Count);
var lines = await mapApi.GetDetailsAsync(res.data.Select(d => d.Id).ToArray());
var aa = Newtonsoft.Json.Linq.JObject.Parse(lines);
//var points = (aa["data"] as JArray).First()["Points"] as JArray;
var ids = new List<int>();
foreach (var line in (aa["data"] as JArray))
{
var id = line.Value<int>("Id");
ids.Add(id);
var points = line["Points"] as JArray;
if (linesCache.ContainsKey(id))
{
continue;
}
var pp1 = new List<Vector2d>();
foreach (var item in points)
{
pp1.Add(new Mapbox.Utils.Vector2d(item[0].ToObject<double>(), item[1].ToObject<double>()));
}
if (!linesCache.ContainsKey(id))
{
linesCache.Add(id, new LineItem { Points = pp1, Model = res.data.Single(d=>d.Id == id) });
}
CreateLine(id, linesCache[id]);
//Load();
}
foreach (var item in linesCache.ToList())
{
if(ids.All(id=>id != item.Key))
{
item.Value.Destroy();
linesCache.Remove(item.Key);
if(item.Value.Selected)
{
tips.Hide();
tips = null;
}
}
}
}
//GameObject direct;
void CreateLine(int id, LineItem line)
{
#region 线
List<Vector2d> pp1 = line.Points;
var dat = new List<Vector3>();
foreach (var item in pp1)
{
var pp = mapManager.GeoToWorldPosition(item);
pp.y += 0.3f;
dat.Add(pp);
}
var feat = new VectorFeatureUnity();
feat.Points.Add(dat);
var direct = line.LineObject;
LineRenderer lineRender;
if (direct == null)
{
direct = new GameObject($"MapRoute-{ id }");
direct.transform.SetParent(this.transform);
lineRender = direct.AddComponent<LineRenderer>();
lineRender.material = new Material(Shader.Find("Sprites/Default"));
line.LineObject = direct;
lineRender.startColor = lineRender.endColor = Utils.HexToColor("F93086");
//设置宽度
lineRender.startWidth = 1.2f;
lineRender.endWidth = 1.2f;
lineRender.numCornerVertices = 90;
}
else
{
lineRender = direct.GetComponent<LineRenderer>();
}
//lineRender.SetWidth(0.5f, 0.5f);
lineRender.positionCount = dat.Count;
//lineRender.SetVertexCount(dat.Count);
lineRender.SetPositions(feat.Points[0].ToArray());
#endregion
#region
if (linesCache[id].Item == null)
{
var itemObject = Resources.Load("UI/Prefab/BigMap/Item");
var itemObject1 = (GameObject)Instantiate(itemObject, content.transform, false);
var iii = itemObject1.GetComponent<Item>();
iii.SetModel(line.Model);
line.Item = iii;
iii.onClick = () =>
{
if(tips != null)
{
tips.Hide();
tips = null;
}
if (line.Selected)
{
line.Selected = false;
//tips.Hide();
//tips = null;
return;
}
line.Selected = true;
//iii.Selected(true);
var position = line.BeginMarker.transform.position;
//position.z += 25;
tips.Show(position, line.Model);
foreach (var item in linesCache)
{
if(item.Key != line.Model.Id)
{
item.Value.Selected = false;
//item.Value.Item.Selected(false);
}
}
};
}
#endregion
#region marker
if (line.BeginMarker == null)
{
var beginInstance = (GameObject)Instantiate(begin, canvas.transform.Find("MarkerContainer").transform);
line.BeginMarker = beginInstance;
UIManager.AddEvent(line.BeginMarker, EventTriggerType.PointerClick, new UnityAction<BaseEventData>((e) =>
{
if (line.Selected)
{
line.Selected = false;
tips.Hide();
return;
}
line.Selected = true;
var position = line.BeginMarker.transform.position;
//position.z += 25;
tips.Show(position, line.Model);
foreach (var item in linesCache)
{
if (item.Key != line.Model.Id)
{
item.Value.Selected = false;
//item.Value.Item.Selected(false);
}
}
}));
}
line.BeginMarker.transform.localScale = new Vector3(2,2);
//beginInstance.transform.localRotation = new Quaternion(90,0,0,0);
line.BeginMarker.transform.position = ConverToPosition(line.Points.First());
#endregion
if (line.Selected)
{
line.Selected = true;
var position = line.BeginMarker.transform.position;
//position.z += 25;
//tips.Show(position, line.Model);
tips.Move(position);
}
}
/// <summary>
/// 转换地理坐标到屏幕坐标
/// </summary>
/// <param name="vector"></param>
/// <returns></returns>
Vector3 ConverToPosition(Vector2d vector)
{
var worldPosition = mapManager.GeoToWorldPosition(vector);//32.061255, 118.80925
var vp = Camera.main.WorldToViewportPoint(worldPosition);
vp.z = 180f;
////Debug.Log(vp);
//var wd = Camera.main.WorldToScreenPoint(worldPosition);
var wd = Camera.main.ViewportToWorldPoint(vp);
return wd;
}
// Update is called once per frame
void Update()
{
//Debug.Log(Input.mousePosition.x + "," + Input.mousePosition.y + "," + Input.mousePosition.z);
//timer += Time.deltaTime;
}
public override void Show()
{
var cg = this.transform.Find("Canvas").GetComponent<CanvasGroup>();
cg.alpha = 0;
base.Show();
cg.DOFade(1f, 0.3f);
}
public override void Close()
{
//base.Close();
DestroyImmediate(this.gameObject);
}
class LineItem
{
public List<Vector2d> Points { get; set; }
public GameObject LineObject { get; set; }
public GameObject BeginMarker { get; set; }
public NearRouteModel Model { get; set; }
public Item Item { get; set; }
private bool _Selected = false;
public bool Selected {
get
{
return _Selected;
}
set
{
_Selected = value;
Item.Selected(value);
var lineRender = LineObject.GetComponent<LineRenderer>();
if (value)
{
lineRender.startColor = lineRender.endColor = Color.white;
}
else
{
lineRender.startColor = lineRender.endColor = Utils.HexToColor("F93086");
}
}
}
public void Destroy()
{
//Debug.Log($"销毁{ item.Key }, { item.Value.Item != null }");
LineObject.Destroy();
BeginMarker.Destroy();
Item.gameObject.Destroy();
}
}
}