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; using Assets.Scripts.UI.UIEffect; public class RowerMultiModeScript : MonoBehaviour { // Start is called before the first frame update [SerializeField] GameObject rank,trace; Transform scroll,m1,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(); m1 = transform.Find("Rower/Modes/Scroll/M1"); m2 = transform.Find("Rower/Modes/Scroll/M2"); currentModeType = PlayerPrefs.GetInt("CurrentModeType"); Transform aniView = currentModeType == 0 ? m1 : m2, followAniView = currentModeType == 0 ? m2 : m1; aniView.localPosition = new Vector3(0, aniView.localPosition.y, aniView.localPosition.z); followAniView.localPosition = new Vector3(730, followAniView.localPosition.y, followAniView.localPosition.z); string selDot = currentModeType == 0 ? "d1" : "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"); print($"模块位置:{m1.localPosition.x},{m2.localPosition.x}"); caches = new Dictionary(); traceList = new List(); //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++) { int rank = i + 1, userId = userList[i].UserId; if (rankDiffDict.ContainsKey(userId)) { rankDiffDict[userId].rank = rank; rankDiffDict[userId].diff = userList[i].currentRank - rank; if (currentSecond % 3 == 0) { rankDiffDict[userId].sumdiff = rankDiffDict[userId].diff; } else { rankDiffDict[userId].sumdiff += rankDiffDict[userId].diff; } } userList[i].currentRank = rank; } } 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 class RankDiff { public int rank { get; set; } public int diff { get; set; } public int sumdiff { get; set; } } public Dictionary rankDiffDict; public async void GetShadowList(RowerTaskPanel.RowerType rowerType, RowerResultModel reRowData) { this.rowerType = rowerType; currentSecond = -1; //if(Application.internetReachability == NetworkReachability.NotReachable) var res = reRowData ==null? await ConfigHelper.rowerApi.GetShadowList(rowerType): await ConfigHelper.rowerApi.GetReRowShadowList(reRowData.Id); shadowList = res.data; //foreach (var t in traceList) //{ // t.userId = 0; // t.trace.gameObject.SetActive(false); //} 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.Insert(_tmpList.Count / 2, myData); //_tmpList.Add(myData); userList = _tmpList.OrderByDescending(x => x.currentDistance).ToList(); rankDiffDict = new Dictionary(); for (int i = 0; i < userList.Count; i++) { userList[i].currentRank = i + 1; rankDiffDict.Add(userList[i].UserId, new RankDiff { rank = userList[i].currentRank, diff = 0 }); } DisplayUserRanks(true); DisplayTraces(true); } float GetStrokeSpeed(uint rate) { //0 10 20 30 35 //0.9 0.8 0.7 0.6 0.5 if (rate < 10) return 0.9f; else if (rate < 20) return 0.7f; else if (rate < 30) return 0.5f; else if (rate < 35) return 0.4f; else return 0.3f; } //标识线 int leftWidth = 0, rightWidth = 100; private void DisplayTrace(Transform t,TraceData data,TraceData mineData,bool isAni = false) { //增加新设计稿逻辑 t.Find("Left").GetComponent().sprite = data.isMine ? Resources.Load("Images/RowerNew/动画用/bg_myself") : Resources.Load("Images/RowerNew/动画用/bg_other"); t.Find("Main/Boat/Head").GetComponent().sprite = data.isMine ? Resources.Load("Images/RowerNew/动画用/img_overline_myself") : Resources.Load("Images/RowerNew/动画用/img_overline_others"); t.Find("Main/Boat/Head").gameObject.SetActive(data.currentDistance > 0); t.Find("Main/Rowed").GetComponent().color = data.isMine ? Utils.HexToColorHtml("#f9308699") : Utils.HexToColorHtml("#27dfe399"); t.GetComponent().color = data.isMine ? Utils.HexToColorHtml("#f930861a") : Utils.HexToColorHtml("#27dfe31a"); 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"); } t.Find("Mine").gameObject.SetActive(data.isMine); var diff = data.currentDistance - mineData.currentDistance; if (diff > 0) { t.Find("Main/Diff").GetComponent().text = diff.ToString("+#0M"); } else if (diff == 0) { if (data.isMine) { var originstr = $"{userList.FindIndex(x => x.isMine) + 1} / {userList.Count}"; var str = originstr; var mytxt = t.Find("Main/Diff").GetComponent(); if (rankDiffDict[data.UserId].diff != 0) { var myranksq = DOTween.Sequence(); myranksq.AppendCallback(() => { mytxt.DOFade(0, 0); if (rankDiffDict[data.UserId].diff > 0) str = "↑"; else if (rankDiffDict[data.UserId].diff < 0) str = "↓"; mytxt.text = str; }); myranksq.Append(mytxt.DOFade(1, 0.2f)); myranksq.AppendInterval(0.3f); myranksq.Append(mytxt.DOFade(0, 0.2f)); myranksq.AppendCallback(() => { mytxt.text = originstr; }); myranksq.Append(mytxt.DOFade(1, 0.2f)); myranksq.Play(); } else { mytxt.text = originstr; } } else { t.Find("Main/Diff").GetComponent().text = 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"); } var width = t.Find("Main").GetComponent().sizeDelta.x - t.Find("Main/Boat").GetComponent().sizeDelta.x; var diffWidth = data.currentDistance - mineData.currentDistance + 50; if (mineData.currentDistance <= 50) { diffWidth = data.currentDistance; } else if (rowerType.type == 1 && rowerType.value - mineData.currentDistance <= 50) { diffWidth = 100 - ((int)rowerType.value - data.currentDistance); } Func is0to100 = a => a >= 0 && a <= 100; //标识线显示 if (data.isMine) { Transform leftLine = transform.Find("Rower/Modes/Scroll/M2/Track/TraceContainer/LineMeterLeft"), rightLine = transform.Find("Rower/Modes/Scroll/M2/Track/TraceContainer/LineMeterRight"), finishLine = transform.Find("Rower/Modes/Scroll/M2/Track/TraceContainer/LineFinish"); if (rightWidth <= mineData.currentDistance) { var tmp = leftLine; leftLine = rightLine; rightLine = tmp; leftLine.name = "LineMeterLeft"; rightLine.name = "LineMeterRight"; } leftWidth = (mineData.currentDistance / 100) * 100; rightWidth = leftWidth + 100; leftLine.gameObject.SetActive(leftWidth != 0); int leftDiff = leftWidth - mineData.currentDistance, rightDiff = rightWidth - mineData.currentDistance; leftLine.Find("Text").GetComponent().text = $"{leftWidth}M"; rightLine.Find("Text").GetComponent().text = $"{rightWidth}M"; float leftPositionX = ((diffWidth + leftDiff) / 100f) * width + 43, rightPositionX = ((diffWidth + rightDiff) / 100f) * width + 43; if (leftPositionX >= -30 && leftPositionX<=415) { StartCoroutine(MoveLine(leftLine, leftLine.localPosition, new Vector3(leftPositionX - 207.5f, leftLine.localPosition.y, leftLine.localPosition.z))); //leftLine.DOLocalMoveX(leftPositionX - 207.5f, 0.9f); } else { leftLine.localPosition = new Vector3(leftPositionX - 207.5f, leftLine.localPosition.y, leftLine.localPosition.z); } if (rightPositionX >= 0 && rightPositionX <= 415) { StartCoroutine(MoveLine(rightLine, rightLine.localPosition, new Vector3(rightPositionX - 207.5f, rightLine.localPosition.y, rightLine.localPosition.z))); //rightLine.DOLocalMoveX(rightPositionX - 207.5f, 0.9f); } else { rightLine.localPosition = new Vector3(rightPositionX - 207.5f, rightLine.localPosition.y, rightLine.localPosition.z); } if (rowerType.type == 1) { finishLine.gameObject.SetActive(true); //终点线 float finishWidth = rowerType.value; leftLine.gameObject.SetActive(Math.Abs(finishWidth - leftWidth) > 10 && leftWidth != 0); rightLine.gameObject.SetActive(Math.Abs(finishWidth - rightWidth) > 10); float finishDiff = finishWidth - mineData.currentDistance; float finishPositionX = ((diffWidth + finishDiff) / 100f) * width + 43; if (finishPositionX >= 0 && finishPositionX <= 415) { StartCoroutine(MoveLine(finishLine, finishLine.localPosition, new Vector3(finishPositionX - 207.5f, finishLine.localPosition.y, finishLine.localPosition.z))); //finishLine.DOLocalMoveX(finishPositionX - 207.5f, 0.9f); } else { finishLine.localPosition = new Vector3(finishPositionX - 207.5f, finishLine.localPosition.y, finishLine.localPosition.z); } } else { finishLine.gameObject.SetActive(false); rightLine.gameObject.SetActive(true); } } //if(!data.isMine) diffWidth = 101; if (is0to100(diffWidth)) { var tWidth = (diffWidth / 100f) * width; t.Find("Main/Boat").gameObject.SetActive(true); t.Find("Left/Rank").GetComponent().text = (userList.FindIndex(x => x.UserId == data.UserId) + 1).ToString("00"); if (isAni) { t.Find("Main/Boat").DOLocalMoveX(21.5f + tWidth, 0.9f); var rowed = t.Find("Main/Rowed").GetComponent(); //rowed.GetComponent().color1 = data.isMine ? Utils.HexToColorHtml("#f9308633") : Utils.HexToColorHtml("#27bac033"); //rowed.GetComponent().color2 = data.isMine ? Utils.HexToColorHtml("#f930864d") : Utils.HexToColorHtml("#27bac04d"); rowed.DOSizeDelta(new Vector2(tWidth, rowed.sizeDelta.y), 0.9f); } else { t.Find("Main/Boat").localPosition = new Vector3(21.5f + tWidth, t.Find("Main/Boat").localPosition.y, t.Find("Main/Boat").localPosition.z); } } else { t.Find("Main/Boat").localPosition = new Vector3(diffWidth < 0 ? -21.5f : 21.5f + width, t.Find("Main/Boat").localPosition.y, t.Find("Main/Boat").localPosition.z); t.Find("Main/Boat").gameObject.SetActive(false); var rowed = t.Find("Main/Rowed").GetComponent(); rowed.sizeDelta = new Vector2(diffWidth < 0 ? 0 : t.Find("Main").GetComponent().sizeDelta.x, rowed.sizeDelta.y); } if (isAni && currentSecond >= 0 && currentSecond < data.list.Count) { var ani = DOTween.Sequence(); var _d = data.list[currentSecond]; if (currentSecond > 0 && _d.Rate > 0) { var spDict = GetComponent().spriteDict2; int spDictIndex = 0; ani.Join(DOTween.To(() => spDictIndex, x => t.Find("Main/Boat/Image").GetComponent().sprite = spDict[x], 14, 0.225f)); ani.AppendCallback(() => { int spDictIndex2 = 14; DOTween.To(() => spDictIndex2, x => t.Find("Main/Boat/Image").GetComponent().sprite = spDict[x], 0, 0.675f); }); ani.Play(); //var _pred = data.list[currentSecond - 1]; //if (_pred.StrokeCount != _d.StrokeCount) //{ // //上次划桨次数和这次不一样 说明需要划桨一次 // var spDict = GetComponent().spriteDict; // int spDictIndex = 0; // ani.Join(DOTween.To(() => spDictIndex, x => t.Find("Main/Boat").GetComponent().sprite = spDict[x], 14, 0.2f)); // ani.AppendCallback(() => // { // int spDictIndex2 = 14; // DOTween.To(() => spDictIndex2, x => t.Find("Main/Boat").GetComponent().sprite = spDict[x], 0, 0.4f); // }); // ani.Play(); //} } } } private IEnumerator MoveLine(Transform line, Vector3 originLocation, Vector3 targetLocation) { float t = 0; while (t < 1) { t += Time.deltaTime; Vector3 v = Vector3.Lerp(originLocation, targetLocation, t); line.localPosition = v; yield return new WaitForEndOfFrame(); } } private int getStartIndexByMineData() { var list = userList; var mineIndex = list.FindIndex(x => x.isMine); if (mineIndex < 2) return 0; else if (mineIndex >= list.Count - 2) { mineIndex = list.Count - 5; if (mineIndex < 0) mineIndex = 0; return mineIndex; } else { return mineIndex - 2; } } private int[] getStartRangeByMineData() { var list = userList; var mineIndex = list.FindIndex(x => x.isMine); if (mineIndex < 2) { int sindex = 0,eIndex = 4; if (eIndex > list.Count - 1) eIndex = list.Count - 1; return new int[] { sindex, eIndex }; } else if (mineIndex >= list.Count - 2) { mineIndex = list.Count - 5; if (mineIndex < 0) mineIndex = 0; return new int[] { mineIndex, list.Count - 1 }; } else { return new int[] { mineIndex - 2, mineIndex + 2 }; } } private Color RandomColor() { //随机颜色的HSV值,饱和度不变,只改变H值 //H、S、V三个值的范围都是在0~1之间 float h = UnityEngine.Random.Range(0f, 1f);//随机值 float s = 0.3f;//设置饱和度为定值 Color color = Color.HSVToRGB(h, s, 1); return color; } private void DisplayTraces(bool isRefresh = false) { var list = userList; var listc = transform.Find("Rower/Modes/Scroll/M2/Track/Container/List"); var mineData = list.FirstOrDefault(x => x.isMine); var sindex = getStartIndexByMineData(); int i = 0; if (isRefresh) { traceList.Clear(); listc.localPosition = new Vector3(0, 115.5f); listc.GetComponent().sizeDelta = new Vector2(550f, 43 + 47 * (list.Count - 1)); print(listc.localPosition.ToString()); listc.DestroyChildren(); for (i = 0; i < list.Count; i++) { var data = list[i]; var g = Instantiate(trace); g.name = i.ToString(); DisplayTrace(g.transform.Find("T1/p1"), data, mineData); g.transform.parent = listc; g.SetActive(true); g.transform.localScale = Vector3.one; g.transform.localPosition = new Vector3(0, -21.5f - 47f * i); //g.transform.Find("T1/p1").GetComponent().color = RandomColor(); traceList.Add(new Trace { userId = data.UserId, trace = g.transform.Find("T1") }); } listc.DOLocalMoveY(47 * sindex + 115.5f, 0.8f); return; } if (currentSecond % 3 == 2) { var allsq = DOTween.Sequence(); // -21.5 allsq.Join(listc.DOLocalMoveY(47 * sindex + 115.5f, 1.5f)); var sq = DOTween.Sequence(); for (i = 0; i < list.Count; i++) { var data = list[i]; var t = traceList.FirstOrDefault(x => x.userId == data.UserId).trace; var diff = rankDiffDict[data.UserId]; DisplayTrace(t.Find("p1"), data, mineData, true); if (diff.sumdiff != 0) { if (diff.sumdiff > 0) { t.parent.SetAsLastSibling(); } //t.parent.gets sq.Join(t.parent.DOLocalMoveY(-47 * (diff.rank - 1) - 21.5f, 1.5f)); var sq1 = DOTween.Sequence(); if (diff.sumdiff < 0) { sq1.Append(t.GetComponent().DOFade(0.2f, 0.75f)); sq1.Append(t.GetComponent().DOFade(1f, 0.75f)); } sq.Join(sq1); //sq.SetEase(Ease.InOutCubic); //sq.Append(t.GetComponent) } //t.parent.name = i.ToString(); } allsq.Join(sq); allsq.Play(); } else { for (i = 0; i < list.Count; i++) { var data = list[i]; var t = traceList.FirstOrDefault(x => x.userId == data.UserId).trace; DisplayTrace(t.Find("p1"), data, mineData, true); } } //for (i = 0; i < list.Count; i++) //{ // traceList[i].trace = traceList[i].trace.parent.parent.Find($"{i.ToString()}/T1"); //} //return; //if (currentSecond % 2 == 1) //{ // //0-0.5 // allsq.Append(listc.DOLocalMoveY(47 * sindex + 115.5f, 0.5f)); // var indexRange = getStartRangeByMineData(); // var sq = DOTween.Sequence(); // for (i = 0; i < list.Count; i++) // { // var sq1 = DOTween.Sequence(); // var data = list[i]; // var t = traceList[i].trace; // if (i >= indexRange[0] && i <= indexRange[1]) // { // //需要做动画 // if (data.UserId != traceList[i].userId) // { // //var mysq = DOTween.Sequence(); // //if (traceList[i].userId == App.CurrentUser.Id) // //{ // // mysq.Join(t.GetComponent().DOFade(0, 0.5f).SetEase(Ease.OutSine)); // //} // //if (data.UserId != App.CurrentUser.Id) // //{ // // sq1.Append(t.GetComponent().DOFade(0.68f, 0.45f).SetEase(Ease.InSine)); // // sq1.AppendCallback(() => // // { // // DisplayTrace(t.Find("p1"), data, mineData); // // }); // // sq1.Append(t.GetComponent().DOFade(1, 0.45f)); // //} // //else // //{ // // mysq.Join(t.GetComponent().startAnimation(0.5f, () => // // { // // DisplayTrace(t.Find("p2"), data, mineData); // // }, rankDiffDict[data.UserId].sumdiff >= 0 ? 1 : 0)); // // allsq.Append(mysq); // //} // sq1.Append(t.GetComponent().startAnimation(0.8f, () => // { // DisplayTrace(t.Find("p2"), data, mineData); // }, rankDiffDict[data.UserId].sumdiff >= 0 ? 1 : 0).SetEase(Ease.OutBounce)); // //sq1.Append(t.GetComponent().startAnimation(0.8f, () => // //{ // // DisplayTrace(t.Find("p2"), data, mineData); // //}, 0).SetEase(Ease.OutBounce)); // } // else // { // sq1.AppendCallback(() => // { // DisplayTrace(t.Find("p1"), data, mineData, true); // }); // } // traceList[i].userId = data.UserId; // } // else // { // DisplayTrace(t.Find("p1"), data, mineData); // } // sq.Join(sq1); // } // allsq.Append(sq); // allsq.Play(); //} //else //{ // for (i = 0; i < list.Count; i++) // { // var data = list[i]; // var _trace = traceList.FirstOrDefault(x=>x.userId == data.UserId); // if (_trace != null) // { // DisplayTrace(_trace.trace.Find("p1"), data, mineData, true); // } // } //} ////for (i = 0; i < list.Count; i++) ////{ //// var sq = DOTween.Sequence(); //// var item = traceList[i]; //// var data = list[i]; //// var t = item.trace.Find("p2"); ////} //return; //var list = HandleData(); //CompareTraceList(traceList, list); //for (i = 0; i < list.Count;i++) //{ // var sq = DOTween.Sequence(); // var item = traceList[i]; // var data = list[i]; // var t = item.trace.Find("p2"); // TweenCallback callback = () => // { // }; // if (!item.trace.gameObject.activeInHierarchy) // { // t = item.trace.Find("p1"); // item.trace.gameObject.SetActive(true); // callback(); // continue; // } // //var rotatesq = item.trace.GetComponent().startAnimation(0.8f, callback); // //if (rotatesq != null) // //{ // // sq.Join(rotatesq); // //} // var isRotate = item.userId != data.UserId; // if (isRotate) // { // t = item.trace.Find("p2"); // var rotatesq = item.trace.GetComponent().startAnimation(0.8f, callback); // if (rotatesq != null) // { // sq.Join(rotatesq); // } // } // else // { // t = item.trace.Find("p1"); // 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); // if (isRotate) // { // t.Find("Main/Boat").localPosition = new Vector3(21.5f + tWidth, t.Find("Main/Boat").localPosition.y, t.Find("Main/Boat").localPosition.z); // } // else // { // 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); // } //排名变化 //var diffTransfrom = transform.Find("Rower/Modes/Scroll/M2/Track/RankDiff"+item.trace.name).GetComponent(); //if (rankDiffDict[data.UserId].diff > 0) //{ // diffTransfrom.text = "+" + rankDiffDict[data.UserId].diff; // var rankDiffSQ = DOTween.Sequence(); // rankDiffSQ.Append(diffTransfrom.DOColor(Utils.HexToColorHtml("#bd362bff"), 0.3f)); // rankDiffSQ.AppendInterval(0.4f); // rankDiffSQ.Append(diffTransfrom.DOColor(Utils.HexToColorHtml("#ffffff00"), 0.3f)); // sq.Join(rankDiffSQ); //} //else if (rankDiffDict[data.UserId].diff < 0) //{ // diffTransfrom.text = "" + rankDiffDict[data.UserId].diff; // var rankDiffSQ = DOTween.Sequence(); // rankDiffSQ.Append(diffTransfrom.DOColor(Utils.HexToColorHtml("#27bac0ff"), 0.3f)); // rankDiffSQ.AppendInterval(0.4f); // rankDiffSQ.Append(diffTransfrom.DOColor(Utils.HexToColorHtml("#ffffff00"), 0.3f)); // sq.Join(rankDiffSQ); //} //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}"; } // 0 单人 1 影子 int currentModeType = 0; private void AddTouchEvent() { pan = new TKPanRecognizer(); //0 730 0的位置是显示位置 Sequence sq = DOTween.Sequence(); pan.gestureRecognizedEvent += (r) => { if (sq.IsActive() && sq.IsPlaying()) return; var startPoint = r.startPoint; if (((RectTransform)transform.Find("Rower/Modes")).isPointInTransfrom(startPoint)|| ((RectTransform)transform.Find("RankS")).isPointInTransfrom(startPoint)) { //if (currentModeType == 1 && ((RectTransform)transform.Find("RankS")).isPointInTransfrom(startPoint)) //{ // return; //} var offset = pan.deltaTranslation; //if (scroll.localPosition.x >= 30 || scroll.localPosition.x <= -760) return; Transform aniView = currentModeType == 0 ? m1 : m2, followAniView = currentModeType == 1 ? m1 : m2; aniView.localPosition += new Vector3(offset.x, 0, 0); followAniView.localPosition = aniView.localPosition + new Vector3((aniView.localPosition.x < 0 ? 1 : -1) * 730, 0, 0); //scroll.localPosition += new Vector3(offset.x, 0, 0); } }; pan.gestureCompleteEvent += (r) => { if (sq.IsActive() && sq.IsPlaying()) return; sq = DOTween.Sequence(); Transform aniView = currentModeType == 0 ? m1 : m2, followAniView = currentModeType == 1 ? m1 : m2; if (Math.Abs(aniView.localPosition.x) <= 30) { sq.Join(aniView.DOLocalMoveX(0, 0.5f)); if (aniView.localPosition.x != 0) sq.Join(followAniView.DOLocalMoveX(aniView.localPosition.x > 0 ? -730 : 730, 0.5f)); } else { if (aniView.localPosition.x > 30) { sq.Join(aniView.DOLocalMoveX(730, 0.5f)); } else if (aniView.localPosition.x < -30) { sq.Join(aniView.DOLocalMoveX(-730, 0.5f)); } sq.Join(followAniView.DOLocalMoveX(0, 0.5f)); sq.onComplete = () => { currentModeType = (currentModeType + 1) % 2; string selDot = currentModeType == 0 ? "d1" : "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"); PlayerPrefs.SetInt("CurrentModeType", currentModeType); }; } sq.Play(); return; //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; } int _testdis = 0; // Update is called once per frame void Update() { #if UNITY_EDITOR //return; 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); _testdis += 5; HandleTimeTick(new RowerChartModel() { Distance = _testdis, Rate = 35, }); timer += 1f; } #endif } }