using asap.core; using cfg; using DG.Tweening; using GameCore; using System.Collections; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; using UnityEngine.UI; public class DuelRandomMapPanel : MonoBehaviour { public Transform arrow1; public Transform arrow2; public float StartDelay = 0.5f; public float StartDuration = 0.4f; public int AccNum = 4; public float LoopDuration = 0.2f; /* * 选定阶段 在[0, 1]之间选一个参数,然后如下的3个参数都取相同的比例: 间隔多少张图:SelectedMapNumRand = [2,5] 回弹:最后一张图的回弹比例,必须大于0,[0.2, 0.4] 二次回弹:弹回去之后[0, 0.1] 回弹速度:在这段时间内,整体速度逐渐变成0 */ public int[] SelectedMapNumRand = new[] { 2, 5 }; public float[] BackRatioRand = new[] { 0.2f, 0.4f }; public float[] SecondBackRatioRand = new[] { 0f, 0.1f }; public int[] ArrowRotationRand = new[] { 10, 15 }; int MapNum = 2; float BackRatio; float SecondBackRatio; FishingDuelManager FDM; RectTransform Content; GameObject img_map; int allCount = 5; float height; IUIService uIService; GameObject text_title; TMP_Text text_map; Tables _tables; List mapDatas; List newIDs; bool isClose; [HideInInspector] public bool IsStop; private void Awake() { _tables = GContext.container.Resolve(); uIService = GContext.container.Resolve(); FDM = GContext.container.Resolve(); Content = transform.Find("Viewport/Content").GetComponent(); img_map = transform.Find("Viewport/Content/Item").gameObject; height = img_map.GetComponent().rect.height; img_map.SetActive(false); text_title = transform.Find("title").gameObject; text_map = transform.Find("title/text_map").GetComponent(); } public void StartMap() { float t = Random.Range(0f, 1f); MapNum = Mathf.RoundToInt(SelectedMapNumRand[0] + (SelectedMapNumRand[1] - SelectedMapNumRand[0]) * t); BackRatio = BackRatioRand[0] + (BackRatioRand[1] - BackRatioRand[0]) * t; SecondBackRatio = SecondBackRatioRand[0] + (SecondBackRatioRand[1] - SecondBackRatioRand[0]) * t; IsStop = false; text_title.SetActive(false); isClose = false; _tables = GContext.container.Resolve(); var lastMapID = GContext.container.Resolve().lastMapId; mapDatas = _tables.TbMapData.DataList; List indexs = new List { 0,1 }; for (int i = 2; i < mapDatas.Count; i++) { if (mapDatas[i].ID <= lastMapID) { indexs.Insert(Random.Range(0, indexs.Count), i); } else { break; } } while (indexs.Count < allCount + MapNum) { indexs.AddRange(indexs); } newIDs = indexs; for (int i = 0; i < allCount; i++) { SetMapBg(mapDatas[newIDs[i]].Bg); } SetMapBg(mapDatas[newIDs[0]].Bg); for (int i = 0; i < MapNum - 1; i++) { SetMapBg(mapDatas[newIDs[allCount + i]].Bg); } StartCoroutine(Play()); } public void SetClose() { int mapId = FDM.MapId; var mapData = _tables.TbMapData.DataMap[mapId]; SetMapBg(mapData.Bg); SetMapBg(mapDatas[newIDs[0]].Bg); text_map.text = LocalizationMgr.GetText(mapData.Name_l10n_key); isClose = true; //Content.DOKill(); //Content.anchoredPosition = new Vector2(0, allCount * height); //StartCoroutine(Close()); //FDM.SetMapId(mapId); } void SetMapBg(string bg) { GameObject go = Instantiate(img_map, Content); Image image = go.transform.GetChild(0).GetComponent(); go.SetActive(true); uIService.SetImageSprite(image, bg); } public void Stop() { StopAllCoroutines(); Content.DOKill(); } IEnumerator PlayArrow() { int cur = 1; float acc = (StartDuration - LoopDuration) / AccNum; float time = StartDuration; float arrowTime = time / 4; int ArrowRotation = Random.Range(ArrowRotationRand[0], ArrowRotationRand[1]); arrow1.DOLocalRotate(new Vector3(0, 0, ArrowRotation), arrowTime); arrow2.DOLocalRotate(new Vector3(0, 0, -ArrowRotation), arrowTime); yield return new WaitForSeconds(arrowTime); arrowTime = time / 4; while (cur < AccNum) { cur++; time -= acc; arrowTime = arrowTime + time / 4; ArrowRotation = Random.Range(ArrowRotationRand[0], ArrowRotationRand[1]); arrow1.DOLocalRotate(new Vector3(0, 0, -ArrowRotation), arrowTime); arrow2.DOLocalRotate(new Vector3(0, 0, ArrowRotation), arrowTime); yield return new WaitForSeconds(arrowTime); arrowTime = time / 2; ArrowRotation = Random.Range(ArrowRotationRand[0], ArrowRotationRand[1]); arrow1.DOLocalRotate(new Vector3(0, 0, ArrowRotation), arrowTime); arrow2.DOLocalRotate(new Vector3(0, 0, -ArrowRotation), arrowTime); yield return new WaitForSeconds(arrowTime); arrowTime = time / 4; } while (!IsStop) { arrowTime = LoopDuration / 2; ArrowRotation = Random.Range(ArrowRotationRand[0], ArrowRotationRand[1]); arrow1.DOLocalRotate(new Vector3(0, 0, -ArrowRotation), arrowTime); arrow2.DOLocalRotate(new Vector3(0, 0, ArrowRotation), arrowTime); yield return new WaitForSeconds(arrowTime); arrowTime = LoopDuration / 2; ArrowRotation = Random.Range(ArrowRotationRand[0], ArrowRotationRand[1]); arrow1.DOLocalRotate(new Vector3(0, 0, ArrowRotation), arrowTime); arrow2.DOLocalRotate(new Vector3(0, 0, -ArrowRotation), arrowTime); yield return new WaitForSeconds(arrowTime); } } Coroutine playArrow; IEnumerator Play() { Content.anchoredPosition = Vector2.zero; yield return new WaitForSeconds(StartDelay); int cur = 0; float acc = (StartDuration - LoopDuration) / AccNum; float time = StartDuration; playArrow = StartCoroutine(PlayArrow()); while (cur < AccNum) { cur++; Content.DOAnchorPosY(cur * height, time).SetEase(Ease.Linear); yield return new WaitForSeconds(time); time -= acc; } time = LoopDuration * (allCount - cur); Content.DOAnchorPosY(allCount * height, time).SetEase(Ease.Linear); yield return new WaitForSeconds(time); time = LoopDuration * allCount; while (!isClose) { Content.anchoredPosition = Vector2.zero; Content.DOAnchorPosY(allCount * height, time).SetEase(Ease.Linear); yield return new WaitForSeconds(time); } StartCoroutine(Close()); } IEnumerator Close() { var sequence = DOTween.Sequence(); //跑马灯动画 float index2 = allCount + MapNum + BackRatio; float time1 = (BackRatio + MapNum) * LoopDuration; float time2 = SecondBackRatio; sequence.Append(Content.DOAnchorPosY(index2 * height, time1).SetEase(Ease.Linear)); sequence.Append(Content.DOAnchorPosY((allCount + MapNum) * height, time2).SetEase(Ease.InSine)); sequence.Play(); yield return new WaitForSeconds(time1); StopCoroutine(playArrow); arrow1.DOKill(); arrow2.DOKill(); arrow1.DOLocalRotate(new Vector3(0, 0, 0), time2); arrow2.DOLocalRotate(new Vector3(0, 0, 0), time2); yield return new WaitForSeconds(time2); IsStop = true; GContext.Publish(new VibrationData(HapticTypes.HeavyImpact)); text_title.SetActive(true); } }