From de4292d55aa85b56af0118152ad07733db3344a6 Mon Sep 17 00:00:00 2001 From: lishuo Date: Tue, 7 Dec 2021 16:44:36 +0800 Subject: [PATCH] =?UTF-8?q?=E9=AA=91=E8=A1=8C=E8=AE=B0=E5=BD=95=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=E4=BF=9D=E5=AD=98=EF=BC=8C=E5=BC=82=E5=B8=B8=E4=B8=AD?= =?UTF-8?q?=E6=96=AD=E9=87=8D=E6=96=B0=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/App.cs | 2 + Assets/Scripts/PFConstants.cs | 13 ++ Assets/Scripts/Scenes/MainController.cs | 23 ++ .../Model/CyclingModels/CompetitionModel.cs | 1 + .../Ride/Model/CyclingModels/ReviewModel.cs | 1 + .../Ride/Model/CyclingModels/SingleModel.cs | 1 + .../Scenes/Ride/Model/RecorderDataModel.cs | 23 ++ .../Scenes/Ride/Scripts/BaseUIManager.cs | 2 + .../Scenes/Ride/Scripts/CyclingController.cs | 218 +++++++++++++----- .../Scenes/Ride/Scripts/PlayerController.cs | 13 +- .../Scenes/Ride/Scripts/SingleUIManager.cs | 24 +- 11 files changed, 254 insertions(+), 67 deletions(-) diff --git a/Assets/Scripts/App.cs b/Assets/Scripts/App.cs index 9e00e550..78813f9a 100644 --- a/Assets/Scripts/App.cs +++ b/Assets/Scripts/App.cs @@ -104,6 +104,8 @@ public static class App public static string WorkoutsUrl { get; internal set; } public static long delayTime { get; set; } public static List userList = new List(); + + public static TempRecordData tempRecordData { get; set; } private static string language { get; set; } public static Dictionary LanguageManager { get; set; } diff --git a/Assets/Scripts/PFConstants.cs b/Assets/Scripts/PFConstants.cs index e8d8dd24..c2570be9 100644 --- a/Assets/Scripts/PFConstants.cs +++ b/Assets/Scripts/PFConstants.cs @@ -37,6 +37,19 @@ public static class PFConstants return Application.persistentDataPath + "/MapWorkoutRecords/"; } } + + public static string MapWorkoutRecordTempFolder + { + get + { + if (!Directory.Exists(Application.persistentDataPath + "/MapWorkoutTempRecords/")) + { + Directory.CreateDirectory(Application.persistentDataPath + "/MapWorkoutTempRecords/"); + } + + return Application.persistentDataPath + "/MapWorkoutTempRecords/"; + } + } /// /// 设备连接缓存在本地的路径 /// diff --git a/Assets/Scripts/Scenes/MainController.cs b/Assets/Scripts/Scenes/MainController.cs index d7ccc9ea..83861f5a 100644 --- a/Assets/Scripts/Scenes/MainController.cs +++ b/Assets/Scripts/Scenes/MainController.cs @@ -1,4 +1,5 @@ using Assets.Scenes.Ride.Scripts; +using Assets.Scenes.Ride.Scripts.Model; using Assets.Scripts; using Assets.Scripts.Devices.Ant; using Assets.Scripts.Scenes; @@ -9,6 +10,7 @@ using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; +using UnityEngine.SceneManagement; using UnityEngine.UI; public class MainController : BaseScene @@ -109,6 +111,7 @@ public class MainController : BaseScene } UIManager.UpdateJoinCompetition();//查询当前我参加的赛事 + LastRide();//检查本地异常中断的骑行并弹窗提示继续 } @@ -144,4 +147,24 @@ public class MainController : BaseScene var result = await ConfigHelper.userApi.Login("13115011550", "laozhong", ""); App.CurrentUser = result.data; } + + + /// + /// 检查上次异常中断的骑行 + /// + private void LastRide() + { + var tempFileList = System.IO.Directory.GetFiles(PFConstants.MapWorkoutRecordTempFolder); + if (tempFileList.Length > 0) + { + var tempFile = tempFileList[0]; + var content = System.IO.File.ReadAllText(tempFile); + if (!string.IsNullOrEmpty(content)) + { + var tempRecordData = Newtonsoft.Json.JsonConvert.DeserializeObject(content); + App.tempRecordData = tempRecordData; + SceneManager.LoadScene("Ride"); + } + } + } } diff --git a/Assets/Scripts/Scenes/Ride/Model/CyclingModels/CompetitionModel.cs b/Assets/Scripts/Scenes/Ride/Model/CyclingModels/CompetitionModel.cs index 97ed7d41..f0665acd 100644 --- a/Assets/Scripts/Scenes/Ride/Model/CyclingModels/CompetitionModel.cs +++ b/Assets/Scripts/Scenes/Ride/Model/CyclingModels/CompetitionModel.cs @@ -65,6 +65,7 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels CurrentRouteStartDistance = param.EndDistance == 0 ? 0 : param.EndDistance, //DeviceNumber = DeviceNumber, //AntModelId = antModelId + selectParam = param, }; IsRecord = true; diff --git a/Assets/Scripts/Scenes/Ride/Model/CyclingModels/ReviewModel.cs b/Assets/Scripts/Scenes/Ride/Model/CyclingModels/ReviewModel.cs index 69e9ce1d..cb2a1336 100644 --- a/Assets/Scripts/Scenes/Ride/Model/CyclingModels/ReviewModel.cs +++ b/Assets/Scripts/Scenes/Ride/Model/CyclingModels/ReviewModel.cs @@ -53,6 +53,7 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels CurrentRouteStartDistance = 0, //DeviceNumber = DeviceNumber, //AntModelId = antModelId + selectParam = param }; if (param != null) diff --git a/Assets/Scripts/Scenes/Ride/Model/CyclingModels/SingleModel.cs b/Assets/Scripts/Scenes/Ride/Model/CyclingModels/SingleModel.cs index 58772c16..4bf9c4f9 100644 --- a/Assets/Scripts/Scenes/Ride/Model/CyclingModels/SingleModel.cs +++ b/Assets/Scripts/Scenes/Ride/Model/CyclingModels/SingleModel.cs @@ -28,6 +28,7 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels CurrentRoute = route, CurrentRouteStartDistance = 0, StartTime = UIManager.Now.GetDateTime(),//DateTime.Now + selectParam = param }; if (param != null) diff --git a/Assets/Scripts/Scenes/Ride/Model/RecorderDataModel.cs b/Assets/Scripts/Scenes/Ride/Model/RecorderDataModel.cs index f01e2588..d88ccb08 100644 --- a/Assets/Scripts/Scenes/Ride/Model/RecorderDataModel.cs +++ b/Assets/Scripts/Scenes/Ride/Model/RecorderDataModel.cs @@ -117,6 +117,8 @@ namespace Assets.Scenes.Ride.Scripts.Model public double? OneMinuteMaxAP { get; set; } public double? FiveMinutesMaxAp { get; set; } + public RouteResultParam selectParam { get; set; } + public void SaveWithLocalRecordAysnc(CyclingModel cyclingModel, RouteResultParam selectParam, string imageName,string recordId,string path) { Saved = true; @@ -261,4 +263,25 @@ namespace Assets.Scenes.Ride.Scripts.Model } } } + + + public class TempRecordData + { + public int RouteId { get; set; } + public RouteResultParam selectParam { get; set; } + public double CurrentRouteStartDistance { get; set; } + public DateTime StartTime { get; set; } + public double EndDistance { get; set; } + public int? ManufacturerId { get; set; } + + public string ManufacturerName { get; set; } + + public string Mode { get; set; } + + public int? AntModelId { get; set; } + /// + /// 骑行数据 + /// + public List RiderDatas = new List(); + } } diff --git a/Assets/Scripts/Scenes/Ride/Scripts/BaseUIManager.cs b/Assets/Scripts/Scenes/Ride/Scripts/BaseUIManager.cs index 4a9c2ea1..c67ae18d 100644 --- a/Assets/Scripts/Scenes/Ride/Scripts/BaseUIManager.cs +++ b/Assets/Scripts/Scenes/Ride/Scripts/BaseUIManager.cs @@ -469,6 +469,7 @@ namespace Assets.Scenes.Ride.Scripts //保存游戏 public virtual void SaveRide(BaseEventData baseEventData) { + mainController.ClearTempFile(); if (playerController?.TotalTicks > 0 && !mainController.isQuit) { mainController.SetQuit(); @@ -484,6 +485,7 @@ namespace Assets.Scenes.Ride.Scripts public virtual void CancelQuit(BaseEventData baseEventData) { quitPanel.SetActive(false); + mainController.ClearTempFile(); SceneManager.LoadScene("MainScene"); } //取消退出 diff --git a/Assets/Scripts/Scenes/Ride/Scripts/CyclingController.cs b/Assets/Scripts/Scenes/Ride/Scripts/CyclingController.cs index 38ceb052..6f9c0222 100644 --- a/Assets/Scripts/Scenes/Ride/Scripts/CyclingController.cs +++ b/Assets/Scripts/Scenes/Ride/Scripts/CyclingController.cs @@ -22,6 +22,7 @@ using System.IO; using ChartAndGraph; using UnityEngine.UI; using System.Diagnostics; +using UnityEngine.SceneManagement; public class CyclingController : DeviceServiceMonoBase { @@ -35,13 +36,13 @@ public class CyclingController : DeviceServiceMonoBase public Dictionary selectPlayerDic { set; get; } = new Dictionary(); - public int preticks; + public int preticks { get; set; } #region 参数 public MapRoute mapRoute { get; set; }//当前路书数据 public MapCompetition competition { get; set; }//当前赛事数据 private MapDataModel mapData { get; set; }//当前路书数据 - private Route route;//当前路书综合数据 + private Route route { get; set; }//当前路书综合数据 public List mapRouteRankingList { get; set; } private Vector2d coordiantes;//当前地图中心 @@ -73,17 +74,25 @@ public class CyclingController : DeviceServiceMonoBase protected override void Awake() { base.Awake(); - #if UNITY_EDITOR +#if UNITY_EDITOR if (App.CurrentUser == null) { Login(); } - #endif +#endif //获取路书信息 mapApi = ConfigHelper.mapApi; - routeId = App.RouteIdParam > 0? App.RouteIdParam : 2633; + routeId = App.RouteIdParam > 0 ? App.RouteIdParam : 2633; competitionId = App.CompetionId; App.CompetionId = 0;//清空比赛参数 + + //处理异常中断的骑行 + if (App.tempRecordData != null) + { + selectParamModel = App.tempRecordData.selectParam; + competitionId = selectParamModel.CompetitionId ?? 0; + routeId = selectParamModel.RouteId ?? 0; + } Resources.UnloadUnusedAssets(); } @@ -130,7 +139,7 @@ public class CyclingController : DeviceServiceMonoBase } return Graph4; } - + public Material GetMaterial1() { @@ -218,6 +227,9 @@ public class CyclingController : DeviceServiceMonoBase //loadingController = FindObjectOfType(); // loadingController.InjectController(this); + + SceneManager.activeSceneChanged += SceneManager_activeSceneChanged; + //进入比赛 if (competitionId > 0) { @@ -234,6 +246,33 @@ public class CyclingController : DeviceServiceMonoBase } float timer = 1f; bool clearLock = false; + + private void SceneManager_activeSceneChanged(Scene arg0, Scene arg1) + { + ClearTempFile(); + } + /// + /// 检测是否点击UI + /// + /// + /// + private bool IsPointerOverGameObject(Vector2 mousePosition) + { + //创建一个点击事件 + PointerEventData eventData = new PointerEventData(EventSystem.current); + eventData.position = mousePosition; + List raycastResults = new List(); + //向点击位置发射一条射线,检测是否点击UI + EventSystem.current.RaycastAll(eventData, raycastResults); + if (raycastResults.Count > 0) + { + return !raycastResults.Where(c => c.gameObject.name == "ToolBarPanel" || c.gameObject.name == "SettingPanel" || c.gameObject.name == "QuitPanel").Any(); + } + else + { + return false; + } + } protected override void Update() { base.Update(); @@ -242,11 +281,13 @@ public class CyclingController : DeviceServiceMonoBase if (competitionId == 0 && singleUIManager != null) { var mouse = Input.GetMouseButton(0); - if (mouse && clearLock && singleUIManager.clearLock) + + if (mouse && isStart && singleUIManager.clearLock) { - clearLock = false; - activeSeconds = 0; - singleUIManager?.ClearPanel(null); + if (IsPointerOverGameObject(Input.mousePosition)) + { + singleUIManager?.ClearPanel(null); + } } } #endif @@ -261,23 +302,41 @@ public class CyclingController : DeviceServiceMonoBase UIManager.SendCompetitionStartMessage("Ride"); } #if UNITY_IOS || UNITY_ANDROID - if (isStart) - { - activeSeconds++; - } - if (activeSeconds >= App.autoClearTimes && !clearLock) - { - if (competitionId == 0) - { - clearLock = true; - singleUIManager?.ClearPanel(null); - } - } + //if (isStart) + //{ + // activeSeconds++; + //} + //if (activeSeconds >= App.autoClearTimes && !clearLock) + //{ + // if (competitionId == 0) + // { + // clearLock = true; + // singleUIManager?.ClearPanel(null); + // } + //} #endif timer += 1.0f; } } + public bool isWatch { get; set; } + /// + /// 处理中断骑行 + /// + private void TempFileHandler() + { + //处理异常中断的骑行 + if (App.tempRecordData != null) + { + recorderData.EndDistance = App.tempRecordData.EndDistance; + recorderData.StartTime = App.tempRecordData.StartTime; + recorderData.RiderDatas = App.tempRecordData.RiderDatas; + coordiantes = Along(App.tempRecordData.EndDistance); + startTime = App.tempRecordData.StartTime; + preticks = recorderData.RiderDatas.Last().Ticks; + App.tempRecordData = null;//清空 + } + } private IEnumerator Init() { yield return new WaitForSeconds(1); @@ -289,7 +348,7 @@ public class CyclingController : DeviceServiceMonoBase MapUDPService.Init();//初始化TCP loadingController.AddProcess(10); } - public bool isWatch { get; set; } + //初始比赛 private IEnumerator InitRace() { @@ -315,15 +374,15 @@ public class CyclingController : DeviceServiceMonoBase mapData = mapApi.GetData(routeId);//获取路书地理数据 route = new Route(mapData, mapRoute); loadingController.AddProcess(10); -#region 其他场景传参处理 + #region 其他场景传参处理 //骑行结果 - if (App.routeResult != null ) + if (App.routeResult != null) { routeResult = App.routeResult; selectParamModel = App.routeResult.ContinueCyclingParam;//继续骑行 preticks = App.routeResult.Ticks; } - + if (selectParamModel == null) { selectParamModel = new RouteResultParam @@ -339,12 +398,14 @@ public class CyclingController : DeviceServiceMonoBase }; } + App.routeResult = null; -#endregion + #endregion + double endDistance = selectParamModel.EndDistance; - coordiantes = Along(endDistance); - var shaowList = mapApi.GetShadowList(App.RouteIdParam, "", 0, 10); + coordiantes = Along(endDistance); + var shaowList = mapApi.GetShadowList(routeId, "", 0, 10); if (shaowList.result) { mapRouteRankingList = shaowList.data.list; @@ -356,7 +417,7 @@ public class CyclingController : DeviceServiceMonoBase mapData = mapApi.GetData(routeId);//获取路书地理数据 route = new Route(mapData, mapRoute); loadingController.AddProcess(10); -#region 其他场景传参处理 + #region 其他场景传参处理 selectParamModel = new RouteResultParam { CompetitionId = competitionId, @@ -369,10 +430,9 @@ public class CyclingController : DeviceServiceMonoBase RouteId = App.RouteIdParam }; -#endregion - - //计算上次骑行距离调整地图中心点 + #endregion double endDistance = selectParamModel.EndDistance; + //计算上次骑行距离调整地图中心点 coordiantes = Along(endDistance); } @@ -400,7 +460,7 @@ public class CyclingController : DeviceServiceMonoBase map.gameObject.SetActive(true); player.SetActive(true); UIObject.SetActive(true); - singleUIManager = UIObject.AddComponent(); + singleUIManager = UIObject.AddComponent(); //miniMap.SetActive(true); map.OnTileFinished += Map_OnTileFinished; mapPos = map.transform.position; @@ -444,7 +504,7 @@ public class CyclingController : DeviceServiceMonoBase public void ChangeCurrentPlayer(int userId) { var coll = FindObjectsOfType(); - var selectedPlayer =coll.Where(c => c.UserId == userId).FirstOrDefault(); + var selectedPlayer = coll.Where(c => c.UserId == userId).FirstOrDefault(); if (selectedPlayer != null) { currentPlayer = selectedPlayer; @@ -459,7 +519,7 @@ public class CyclingController : DeviceServiceMonoBase ss.transform.localScale = Is3dView ? MAX_SIZE : MIN_SIZE; } } - + var unselectedPlayers = coll.Where(c => c.UserId != userId).ToList(); foreach (var item in unselectedPlayers) { @@ -477,6 +537,8 @@ public class CyclingController : DeviceServiceMonoBase //初始化人物位置角度 private void InitPlayer() { + TempFileHandler();//处理中断骑行继续骑的逻辑 + lockView = true; Vector2d lastLatLon = Along(recorderData.EndDistance); @@ -497,7 +559,12 @@ public class CyclingController : DeviceServiceMonoBase //初始化海拔图头像位置 var index = GetCurrentIndex(recorderData.EndDistance); InitGraph(index); - playerController.CurrentIndex = index; + int tick = 0; + if (recorderData.RiderDatas.Count > 0) + { + tick = recorderData.RiderDatas.Last().Ticks; + } + playerController.Init(index, recorderData.EndDistance, tick); } public void InitGraph(int index) { @@ -517,15 +584,15 @@ public class CyclingController : DeviceServiceMonoBase transform.Find("UI/Panel(Clone)/ToolBarPanel/StartOrPauseButton").GetComponent