using Assets.Scripts; using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using Assets.Scripts.Apis.Models; using System; using System.Linq; using UnityEngine.UI; using Assets.Scripts.UI.Prefab.Login; using Newtonsoft.Json; public class RowerMultiModeScript : MonoBehaviour { // Start is called before the first frame update [SerializeField] GameObject rank; Transform scroll,m2; Vector3 startPosition,boatStartPosition; TKPanRecognizer pan; ScrollRect scrollRank; Dictionary caches; public class Trace { public int userId { get; set; } public Transform trace { get; set; } } public class TraceData { public List list { get; set; } public string NickName { get; set; } public string Avatar { get; set; } public int UserId { get; set; } public bool isMine { get; set; } public int currentDistance { get; set; } public string Country { get; set; } public int currentRank { get; set; } } List traceList; List initialPosYList; void Awake() { scroll = transform.Find("Rower/Modes/Scroll"); startPosition = scroll.localPosition; if (PlayerPrefs.GetFloat("RowerMultiModeLocationX") != 0f) { scroll.localPosition = new Vector3(PlayerPrefs.GetFloat("RowerMultiModeLocationX"), startPosition.y, startPosition.z); foreach (Transform t in transform.Find("Rower/Dots")) { t.GetComponent().color = Utils.HexToColorHtml("#ffffff"); } if (scroll.localPosition.x >= startPosition.x - (730 / 2)) { transform.Find("Rower/Dots/d1").GetComponent().color = Utils.HexToColorHtml("#f93086"); } else { transform.Find("Rower/Dots/d2").GetComponent().color = Utils.HexToColorHtml("#f93086"); } } AddTouchEvent(); m2 = transform.Find("Rower/Modes/Scroll/M2"); caches = new Dictionary(); traceList = new List() { new Trace{ userId=0, trace=m2.Find("Track/T1") }, new Trace{ userId=0, trace=m2.Find("Track/T2") }, new Trace{ userId=0, trace=m2.Find("Track/T3") }, new Trace{ userId=0, trace=m2.Find("Track/T4") }, new Trace{ userId=0, trace=m2.Find("Track/T5") }, }; initialPosYList = new List { m2.Find("Track/T1").localPosition.y, m2.Find("Track/T2").localPosition.y, m2.Find("Track/T3").localPosition.y, m2.Find("Track/T4").localPosition.y, m2.Find("Track/T5").localPosition.y, }; scrollRank = transform.Find("Rower/Modes/Scroll/M2/Rank/Scroll View").GetComponent(); var countryJson = Resources.Load("UI/flags-mini").text; countryList = JsonConvert.DeserializeObject>(countryJson); } public void HandleTimeTick(RowerChartModel data) { //rowerType = GetComponent().rowerType; currentSecond++; myData.list.Add(data); SortByCurrentDistance(); DisplayUserRanks(); DisplayTraces(); } private void SortByCurrentDistance() { if (currentSecond >= 0) { userList.ForEach(x => { var _list = x.list; var _distance = 0; if (_list.Count == 0) { _distance = 0; } else if (currentSecond >= _list.Count) { _distance = _list[_list.Count - 1].Distance; } else { _distance = _list[currentSecond].Distance; } x.currentDistance = _distance; if (x.isMine && rowerType.type == 1 && x.currentDistance > rowerType.value) { x.currentDistance = (int)rowerType.value; } }); } userList = userList.OrderByDescending(x => x.currentDistance).ToList(); for (int i = 0; i < userList.Count; i++) { userList[i].currentRank = i + 1; } } private List HandleData() { //仅取5个 var mineIndex = userList.FindIndex(x => x.isMine); if (mineIndex < 2) { return userList.Where((x, i) => i < 5).ToList(); } else if (mineIndex > userList.Count - 3) { return userList.Where((x, i) => i >= userList.Count - 5).ToList(); } else { return userList.Where((x, i) => i >= mineIndex - 2 && i <= mineIndex + 2).ToList(); } } List userList; TraceData myData; public List shadowList { get; private set; } public async void GetShadowList(RowerTaskPanel.RowerType rowerType) { this.rowerType = rowerType; currentSecond = -1; var res = await ConfigHelper.rowerApi.GetShadowList(rowerType); shadowList = res.data; var _tmpList = shadowList.Select(x => new TraceData { list = x.list, NickName = x.NickName, Avatar = x.WxHeadImg, UserId = x.UserId, isMine = false, currentDistance = 0, Country = x.Country }).ToList(); myData = new TraceData(); myData.list = new List(); myData.UserId = App.CurrentUser.Id; myData.NickName = App.CurrentUser.Nickname; myData.Avatar = App.CurrentUser.WxHeadImg; myData.isMine = true; myData.Country = App.CurrentUser.Country; _tmpList.Add(myData); userList = _tmpList.OrderByDescending(x => x.currentDistance).ToList(); for (int i = 0; i < userList.Count; i++) { userList[i].currentRank = i + 1; } DisplayUserRanks(true); DisplayTraces(); } private void DisplayTraces() { var list = HandleData(); //CompareTraceList(traceList, list); int i = 0; var mineData = list.FirstOrDefault(x => x.isMine); for (i = 0; i < list.Count;i++) { var sq = DOTween.Sequence(); var item = traceList[i]; var t = item.trace; var data = list[i]; t.gameObject.SetActive(true); TweenCallback callback = () => { if (string.IsNullOrEmpty(data.Avatar)) { t.Find("Left/Avatar").GetComponent().texture = null; } else { Utils.DisplayImageTempDict(t.Find("Left/Avatar").GetComponent(), data.Avatar, caches); } var _c = countryList.SingleOrDefault(x => x.country == data.Country); if (_c != null) { t.Find("Left/Avatar/Country").GetComponent().sprite = Resources.Load(_c.source); } t.Find("Left/NickName").GetComponent().text = data.NickName; if (data.list.Count == 0) { t.Find("Left/Time").GetComponent().text = TimeSpan.FromSeconds(0).ToString(@"mm\:ss"); } else if (currentSecond >= 0 && currentSecond < data.list.Count) { var _d = data.list[currentSecond]; t.Find("Left/Time").GetComponent().text = TimeSpan.FromSeconds(_d.Pace).ToString(@"mm\:ss"); } else { var _d = data.list[data.list.Count - 1]; t.Find("Left/Time").GetComponent().text = TimeSpan.FromSeconds(_d.Pace).ToString(@"mm\:ss"); } var diff = data.currentDistance - mineData.currentDistance; if (diff > 0) { t.Find("Main/Diff").GetComponent().text = diff.ToString("+#0M"); } else if (diff == 0) { t.Find("Main/Diff").GetComponent().text = data.isMine ? "" : diff.ToString("#0M"); } else { t.Find("Main/Diff").GetComponent().text = diff.ToString("#0M"); } if (data.isMine) { t.transform.Find("Left/Time").GetComponent().color = Utils.HexToColorHtml("#f93086"); t.transform.Find("Left/NickName").GetComponent().color = Utils.HexToColorHtml("#f93086"); } else { t.transform.Find("Left/Time").GetComponent().color = Utils.HexToColorHtml("#ffffff"); t.transform.Find("Left/NickName").GetComponent().color = Utils.HexToColorHtml("#ffffff"); } }; if (item.userId != data.UserId) { var sq1 = DOTween.Sequence(); var tmp = traceList[i].trace.DOLocalRotate(new Vector3(90, 0, 0), 0.3f); tmp.onComplete = callback; sq1.Append(tmp); sq1.Append(traceList[i].trace.DOLocalRotate(new Vector3(0, 0, 0), 0.3f)); sq.Join(sq1); } else { sq.AppendCallback(callback); } item.userId = data.UserId; if (currentSecond >= 0 && currentSecond < list[i].list.Count) { var _d = data.list[currentSecond]; if (currentSecond > 0) { var _pred = data.list[currentSecond - 1]; if (_pred.StrokeCount != _d.StrokeCount) { //上次划桨次数和这次不一样 说明需要划桨一次 var spDict = GetComponent().spriteDict; int spDictIndex = 0; sq.Join(DOTween.To(() => spDictIndex, x => t.Find("Main/Boat").GetComponent().sprite = spDict[x], 14, 0.3f)); sq.AppendCallback(() => { int spDictIndex2 = 14; DOTween.To(() => spDictIndex2, x => t.Find("Main/Boat").GetComponent().sprite = spDict[x], 0, 0.6f); }); } } } var width = t.Find("Main").GetComponent().sizeDelta.x - t.Find("Main/Boat").GetComponent().sizeDelta.x; var diffWidth = data.currentDistance - mineData.currentDistance + 50; if (data.currentDistance <= 50) { diffWidth = data.currentDistance; } else if (rowerType.type == 1 && rowerType.value - data.currentDistance <= 50) { diffWidth = 100 - ((int)rowerType.value - data.currentDistance); } //if (data.isMine) //{ // print("diff:" + diffWidth + ";"+ rowerType.type); //} if (diffWidth >= 0 && diffWidth <= 100) { var tWidth = (diffWidth / 100f) * width; t.Find("Main/Boat").gameObject.SetActive(true); //t.Find("Main/Boat").localPosition = new Vector3(25 + tWidth, t.Find("Main/Boat").localPosition.y, t.Find("Main/Boat").localPosition.z); sq.Join(t.Find("Main/Boat").DOLocalMoveX(21.5f + tWidth, 0.9f)); } else { t.Find("Main/Boat").localPosition = new Vector3(-21.5f, t.Find("Main/Boat").localPosition.y, t.Find("Main/Boat").localPosition.z); t.Find("Main/Boat").gameObject.SetActive(false); } sq.Play(); } for (; i < traceList.Count; i++) { traceList[i].userId = 0; traceList[i].trace.gameObject.SetActive(false); } } private void CompareTraceList(List traceList, List list) { if (traceList.Count(x => x.userId == 0) == 5) return; var originUserList = traceList.Select(x => x.userId).ToList(); var newUserList = list.Select(x => x.UserId).ToList(); if (newUserList.Count != 5) { for (int i = newUserList.Count; i < 5; i++) { newUserList.Add(0); } } var diffRank = new List(); for (int i = 0; i < 5; i++) { int _origin = originUserList[i], _new = newUserList[i]; if (_origin == _new) { //相等 则排名没变化 diffRank.Add(0); } else { //不相等 分情况 var newIndex = originUserList.FindIndex(x => x == _new); if (newIndex != -1) { diffRank.Add(newIndex - _origin); } else { diffRank.Add(null); } } } } private void SetRank(GameObject game, TraceData item,int i) { game.transform.Find("Content/Rank").GetComponent().text = item.currentRank.ToString("00"); game.transform.Find("Content/NickName").GetComponent().text = item.NickName; Utils.DisplayImageTempDict(game.transform.Find("Content/Avatar").GetComponent(), item.Avatar, caches); var _c = countryList.FirstOrDefault(x => item.Country == x.country); if (_c != null) { game.transform.Find("Content/Country").GetComponent().sprite = Resources.Load(_c.source); } int _d = 0, _p = 0; if (currentSecond < 0 || item.list.Count == 0) { } else if (currentSecond >= 0 && currentSecond < item.list.Count) { _d = item.list[currentSecond].Distance; _p = item.list[currentSecond].Power; } else { _d = item.list[item.list.Count - 1].Distance; _p = item.list[item.list.Count - 1].Power; } if (item.isMine && rowerType.type == 1 && _d > rowerType.value) { _d = (int)rowerType.value; } game.transform.Find("Content/Time").GetComponent().text = $"{_d}M"; game.transform.Find("Content/Power").GetComponent().text = $"{_p}W"; if (item.isMine) { game.transform.Find("Content/Time").GetComponent().color = Utils.HexToColorHtml("#f93086"); game.transform.Find("Content/Power").GetComponent().color = Utils.HexToColorHtml("#f93086"); game.transform.Find("Content/NickName").GetComponent().color = Utils.HexToColorHtml("#f93086"); game.transform.Find("Content/Rank").GetComponent().color = Utils.HexToColorHtml("#f93086"); } else { game.transform.Find("Content/Time").GetComponent().color = Utils.HexToColorHtml("#ffffff"); game.transform.Find("Content/Power").GetComponent().color = Utils.HexToColorHtml("#ffffff"); game.transform.Find("Content/NickName").GetComponent().color = Utils.HexToColorHtml("#ffffff"); game.transform.Find("Content/Rank").GetComponent().color = Utils.HexToColorHtml("#ffffff"); } } private List Get8UserList() { var resRanks = userList; var ind = resRanks.FindIndex(x => x.UserId == App.CurrentUser.Id); if (ind >= 8) { var tops = resRanks.Take(3).ToList(); List mys = null; if (resRanks.Count - 1 - ind < 2) { mys = resRanks.GetRange(resRanks.Count - 5, 5); } else { mys = resRanks.GetRange(ind - 2, 5); } resRanks = tops.Concat(mys).ToList(); } else { resRanks = resRanks.Take(8).ToList(); } return resRanks; } private void DisplayUserRanks(bool isRefresh = false) { if (isRefresh) { scrollRank.content.DestroyChildren(); } var list = Get8UserList(); if (scrollRank.content.childCount == 0) { for (int i = 0; i < list.Count; i++) { var item = list[i]; var game = Instantiate(rank); SetRank(game, item, i); game.transform.SetParent(scrollRank.content); game.transform.localScale = Vector3.one; game.SetActive(true); } } else { int i = 0; foreach (Transform t in scrollRank.content) { var item = list[i]; SetRank(t.gameObject, item, i); i++; } } transform.Find("Rower/Modes/Scroll/M2/Rank/MyRank").GetComponent().text = $"{userList.FindIndex(x => x.isMine) + 1} / {userList.Count}"; } private void AddTouchEvent() { pan = new TKPanRecognizer(); pan.gestureRecognizedEvent += (r) => { var startPoint = r.startPoint; if (((RectTransform)transform.Find("Rower/Modes")).isPointInTransfrom(startPoint)) { if (scroll.localPosition.x < startPosition.x - (730 / 2) && ((RectTransform)transform.Find("RankS")).isPointInTransfrom(startPoint)) { return; } var offset = pan.deltaTranslation; if (scroll.localPosition.x >= 30 || scroll.localPosition.x <= -760) return; scroll.localPosition += new Vector3(offset.x, 0, 0); } }; pan.gestureCompleteEvent += (r) => { float x = 0; string selDot = ""; if (Color.Equals(transform.Find("Rower/Dots/d1").GetComponent().color, Utils.HexToColorHtml("#f93086"))) { if (scroll.localPosition.x >= startPosition.x - ((730 * 1) / 10)) { x = startPosition.x; selDot = "d1"; } else { print(491); x = startPosition.x - 730; selDot = "d2"; } } else { if (scroll.localPosition.x >= startPosition.x - ((730 * 9) / 10)) { x = startPosition.x; selDot = "d1"; } else { x = startPosition.x - 730; selDot = "d2"; } } foreach (Transform t in transform.Find("Rower/Dots")) { t.GetComponent().color = Utils.HexToColorHtml("#ffffff"); } transform.Find($"Rower/Dots/{selDot}").GetComponent().color = Utils.HexToColorHtml("#f93086"); scroll.DOLocalMoveX(x, 0.5f); PlayerPrefs.SetFloat("RowerMultiModeLocationX", x); }; TouchKit.addGestureRecognizer(pan); print("注册触摸事件"); } private void OnDestroy() { TouchKit.removeAllGestureRecognizers(); } //交换A,B索引的赛道 void ChangeTrace(int indexA, int indexB) { if (indexA >= traceList.Count || indexB >= traceList.Count) { return; } if (traceList.Count(x => x.trace.gameObject.activeInHierarchy) == 0) return; Trace a = traceList[indexA], b = traceList[indexB]; //2个排名 //先视觉交换 float aniTime = 0.3f; Vector3 aloc = a.trace.localPosition; var sq = DOTween.Sequence(); sq.Join(a.trace.DOLocalMoveY(b.trace.localPosition.y, aniTime)); sq.Join(b.trace.DOLocalMoveY(aloc.y, aniTime)); //逻辑交换 var tmp = traceList[indexA]; traceList[indexA] = traceList[indexB]; traceList[indexB] = tmp; var sq1 = DOTween.Sequence(); if (traceList.Count(x => x.trace.gameObject.activeInHierarchy) != 5) return; if (indexA == 1 && indexB == 2) { for (int i = 0; i < 5; i++) { if (i == 4) { sq1.Join(traceList[i].trace.DOLocalMoveY(initialPosYList[4] - 50.4f, aniTime)); } else { sq1.Join(traceList[i].trace.DOLocalMoveY(initialPosYList[i + 1], aniTime)); } } sq1.AppendCallback(() => { traceList[4].trace.localPosition = new Vector3(traceList[0].trace.localPosition.x, initialPosYList[0] + 49.5f, traceList[0].trace.localPosition.z); }); sq1.Append(traceList[4].trace.DOLocalMoveY(initialPosYList[0], aniTime)); sq.Append(sq1); sq.Play().onComplete = () => { tmp = traceList[4]; for (int i = 4; i >= 1; i--) { traceList[i] = traceList[i - 1]; } traceList[0] = tmp; }; } else if (indexA == 2 && indexB == 3) { for (int i = 0; i < 5; i++) { if (i == 0) { sq1.Join(traceList[i].trace.DOLocalMoveY(initialPosYList[0] + 50.4f, aniTime)); } else { sq1.Join(traceList[i].trace.DOLocalMoveY(initialPosYList[i - 1], aniTime)); } } sq1.AppendCallback(() => { traceList[0].trace.localPosition = new Vector3(traceList[0].trace.localPosition.x, initialPosYList[4] - 49.5f, traceList[0].trace.localPosition.z); }); sq1.Append(traceList[0].trace.DOLocalMoveY(initialPosYList[4], aniTime)); sq.Append(sq1); sq.Play().onComplete = () => { tmp = traceList[0]; for (int i = 0; i < 4; i++) { traceList[i] = traceList[i + 1]; } traceList[4] = tmp; }; } } float timer = 1f; int currentSecond = -1; private List countryList; public RowerTaskPanel.RowerType rowerType { get; set; } // Update is called once per frame void Update() { #if UNITY_EDITOR timer -= Time.deltaTime; if (timer < 0) { //var r = new System.Random(); //int a = r.Next(1, 3); //print($"{a},{a+1}"); //ChangeTrace(a, a+1); HandleTimeTick(new RowerChartModel() { Distance = 15, }); timer += 1f; } #endif } }