using DG.Tweening; using OneP.InfinityScrollView; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class SlotSpin : MonoBehaviour { RectTransform rect; CanvasGroup canvasGroup; public InfinityScrollView infinityScroll; public Transform content; RectTransform contentRectTransform; public Animation animation; bool INIT = false; System.Action OnSelect; /// /// 슬롯을 초기화 합니다 /// /// 스프라이트 리스트 필요 /// -1 = Random /// 스핀 종료 이벤트 public void OnInitialized(List sprites, int idxSlot, System.Action OnSelect) { if (contentRectTransform == null) contentRectTransform = content.GetComponent(); if(rect == null) rect = GetComponent(); if(canvasGroup == null) canvasGroup = GetComponent(); this.idxSlot = idxSlot < sprites.Count ? idxSlot : sprites.Count - 1; this.OnSelect = OnSelect; this.sprites.Clear(); spritesOrigin = new List(sprites); max = sprites.Count; StartCoroutine(Initialized()); } public List items; IEnumerator Initialized() { yield return null; if (!INIT) { SlotSpinItem item = null; for (int i = 0; i < infinityScroll.listItem.Count; i++) { item = infinityScroll.listItem[i].GetComponent(); item.OnGeted = DataGet; items.Add(item); } yield return null; INIT = true; } LoadAsync(); } void LoadAsync() { int idx = 0; if (idxSlot == -1) { for (int i = 0; i < listCount; i++) sprites.AddRange(spritesOrigin); idx = Random.Range((int)(sprites.Count * percent), sprites.Count - max); idxSlot = idx % max; } else { //idx = sprites.Count - (max * 2) + idxSlot; //idxSlot = idx % max; for (int i = 0; i < listCount - 1; i++) sprites.AddRange(spritesOrigin); idx = sprites.Count + spritesOrigin.Count - 1; Sprite sprite = spritesOrigin[idxSlot]; spritesOrigin.Remove(sprite); Util.ListShuffle.Shuffle(spritesOrigin); spritesOrigin.Add(sprite); sprites.AddRange(spritesOrigin); } contentRectTransform.anchoredPosition = Vector2.zero; if (animation != null) Util.AnimationStop(animation, animation.clip.name); content.transform.DOLocalMoveY(-(infinityScroll.itemSize * idx + infinityScroll.itemSize / 2f), duration).SetEase(ease).OnComplete(() => { if (animation != null) animation.Play(); if (OnSelect != null) OnSelect(sprites[idxSlot]); }); infinityScroll.Setup(sprites.Count); infinityScroll.InternalReload(); } List spritesOrigin; public List sprites;//보유 스킬 목록 [Space(10)] [Header("리스트 총 갯수 = 3 * listCount")] public int listCount = 8; int max = 0; float percent = 0.2f; [Range(0, 5)] public float duration = 1f; public AnimationCurve ease; Sprite DataGet(int i) { return sprites[i]; } [Space(10)] public int idxSlot = 0; }