143 lines
4.9 KiB
C#
143 lines
4.9 KiB
C#
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using UnityEngine;
|
|||
|
using DG.Tweening;
|
|||
|
using UnityEngine.UI;
|
|||
|
|
|||
|
public class CardUIManager : MonoBehaviour
|
|||
|
{
|
|||
|
[SerializeField]
|
|||
|
private CanvasGroup canvasGroup;
|
|||
|
[SerializeField]
|
|||
|
private PuzzleCardItem m_cardItemPrefab;
|
|||
|
[SerializeField]
|
|||
|
private Transform m_cardItemParent;
|
|||
|
[SerializeField]
|
|||
|
private List<PuzzleCardAnimItem> m_cardList;
|
|||
|
[SerializeField]
|
|||
|
private ButtonInteraction m_selectBtn;
|
|||
|
[SerializeField]
|
|||
|
private Transform m_newCardParent;
|
|||
|
[SerializeField]
|
|||
|
private PuzzleTarotCardItem m_tarotCardItemPrefab;
|
|||
|
[SerializeField]
|
|||
|
private PuzzleTarotCardsConfig m_tarotCardList;
|
|||
|
|
|||
|
private List<PuzzleTarotCard> m_cardPool;
|
|||
|
|
|||
|
[SerializeField]
|
|||
|
private PuzzleExplainUI PuzzleExplainUI;
|
|||
|
private int currCardIndex;
|
|||
|
private List<PuzzleCardItem> puzzleCardItemList;
|
|||
|
public void Init(PuzzleDrawTarot PuzzleDrawTarot)
|
|||
|
{
|
|||
|
currCardIndex = 0;
|
|||
|
gameObject.SetActive(true);
|
|||
|
canvasGroup.alpha = 0f;
|
|||
|
canvasGroup.DOFade(1f, 1f);
|
|||
|
if(puzzleCardItemList==null)
|
|||
|
{
|
|||
|
puzzleCardItemList= new List<PuzzleCardItem>();
|
|||
|
}
|
|||
|
for(int j=0;j<puzzleCardItemList.Count;j++)
|
|||
|
{
|
|||
|
Destroy(puzzleCardItemList[j].gameObject);
|
|||
|
}
|
|||
|
puzzleCardItemList.Clear();
|
|||
|
if(puzzleTarotCardItemList==null)
|
|||
|
{
|
|||
|
puzzleTarotCardItemList= new List<PuzzleTarotCardItem>();
|
|||
|
}
|
|||
|
for(int j=0;j<puzzleTarotCardItemList.Count;j++)
|
|||
|
{
|
|||
|
Destroy(puzzleTarotCardItemList[j].gameObject);
|
|||
|
}
|
|||
|
puzzleTarotCardItemList.Clear();
|
|||
|
for(int j=0;j<PuzzleDrawTarot.DrawCount;j++)
|
|||
|
{
|
|||
|
GameObject go = Instantiate(m_cardItemPrefab.gameObject,m_cardItemParent);
|
|||
|
PuzzleCardItem currItem = go.GetComponent<PuzzleCardItem>();
|
|||
|
puzzleCardItemList.Add(currItem);
|
|||
|
}
|
|||
|
m_selectBtn.Init(SelectCard);
|
|||
|
|
|||
|
m_cardPool = new List<PuzzleTarotCard>(m_tarotCardList.Cards);
|
|||
|
}
|
|||
|
|
|||
|
public void SelectCard()
|
|||
|
{
|
|||
|
if(currCardIndex>=puzzleCardItemList.Count)return;
|
|||
|
PuzzleCardAnimItem currSelectItem = FindNearestImage();
|
|||
|
currSelectItem.Show(false);
|
|||
|
StartCoroutine(DelayShow(currSelectItem));
|
|||
|
GameObject go = Instantiate(currSelectItem.gameObject,m_newCardParent);
|
|||
|
go.transform.position = currSelectItem.transform.position;
|
|||
|
PuzzleCardAnimItem newItem = go.GetComponent<PuzzleCardAnimItem>();
|
|||
|
newItem.MoveTo(puzzleCardItemList[currCardIndex]);
|
|||
|
StartCoroutine(DelayCreateTarotCardItem(newItem,currCardIndex));
|
|||
|
currCardIndex++;
|
|||
|
}
|
|||
|
|
|||
|
List<PuzzleTarotCardItem> puzzleTarotCardItemList;
|
|||
|
IEnumerator DelayCreateTarotCardItem(PuzzleCardAnimItem newItem, int currIndex)
|
|||
|
{
|
|||
|
GameObject go = Instantiate(m_tarotCardItemPrefab.gameObject,m_newCardParent);
|
|||
|
go.transform.position = puzzleCardItemList[currCardIndex].transform.position;
|
|||
|
PuzzleTarotCardItem tarotCardItem = go.GetComponent<PuzzleTarotCardItem>();
|
|||
|
PuzzleTarotCard randomTarotCard = GetTarotCard();
|
|||
|
tarotCardItem.Init(randomTarotCard);
|
|||
|
puzzleTarotCardItemList.Add(tarotCardItem);
|
|||
|
m_cardPool.Remove(randomTarotCard);
|
|||
|
go.transform.localEulerAngles = new Vector3(0,90,0);
|
|||
|
yield return new WaitForSeconds(1f);
|
|||
|
newItem.transform.DORotate(new Vector3(0,90,0),1f).SetEase(Ease.Linear);
|
|||
|
yield return new WaitForSeconds(1f);
|
|||
|
go.transform.DORotate(new Vector3(0,0,0),1f).SetEase(Ease.Linear);
|
|||
|
yield return new WaitForSeconds(1f);
|
|||
|
if(currIndex>=puzzleCardItemList.Count-1)
|
|||
|
{
|
|||
|
canvasGroup.DOFade(0f, 1f).OnComplete(()=>
|
|||
|
{
|
|||
|
gameObject.SetActive(false);
|
|||
|
PuzzleExplainUI.Init(puzzleTarotCardItemList);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
PuzzleTarotCard GetTarotCard()
|
|||
|
{
|
|||
|
int currIndex = Random.Range(0, m_cardPool.Count);
|
|||
|
return m_cardPool[currIndex];
|
|||
|
}
|
|||
|
|
|||
|
IEnumerator DelayShow(PuzzleCardAnimItem currSelectItem)
|
|||
|
{
|
|||
|
yield return new WaitForSeconds(2f);
|
|||
|
currSelectItem.Show(true);
|
|||
|
}
|
|||
|
|
|||
|
public PuzzleCardAnimItem FindNearestImage()
|
|||
|
{
|
|||
|
if (m_cardList.Count == 0)
|
|||
|
{
|
|||
|
Debug.LogError("Image列表为空!");
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
PuzzleCardAnimItem nearestImage = m_cardList[0];
|
|||
|
float minDistance = Mathf.Abs(nearestImage.GetComponent<RectTransform>().position.x - m_selectBtn.GetComponent<RectTransform>().position.x);
|
|||
|
|
|||
|
foreach (PuzzleCardAnimItem image in m_cardList)
|
|||
|
{
|
|||
|
float distance = Mathf.Abs(image.GetComponent<RectTransform>().position.x - m_selectBtn.GetComponent<RectTransform>().position.x);
|
|||
|
if (distance < minDistance)
|
|||
|
{
|
|||
|
minDistance = distance;
|
|||
|
nearestImage = image;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return nearestImage;
|
|||
|
}
|
|||
|
}
|