큐에다 패널을 저장하고 큐가 특정수가 쌓이면 첫번째 넣은 큐를 디큐시켜서 삭제해서 많이 쌓이는걸 방지할려는데 문제는
var manager = UImanager.manager;
if (manager.panelQueue.Count >= 5)//5개인상태에서 생성 시도하면
{
GameObject oldPanel = manager.panelQueue.Dequeue();
DOTween.Kill(oldPanel , true);
DOTween.Kill(oldPanel , false);
oldPanel.GetComponent<CanvasGroup>().DOFade(0, 1f).OnComplete(() => Destroy(oldPanel));
}
이런식으로 kill을 걸어도 이 오브젝트에 붙은 시퀸스가 계속 작동을해서 문제를 일으킴
public IEnumerator MakeInfo(string []? texts = null ,bool ? clear = null)
{
var manager = UImanager.manager;
if (manager.panelQueue.Count >= 5)//5개인상태에서 생성 시도하면
{
GameObject oldPanel = manager.panelQueue.Dequeue();
DOTween.Kill(oldPanel , true);
DOTween.Kill(oldPanel , false);
oldPanel.GetComponent<CanvasGroup>().DOFade(0, 1f).OnComplete(() => Destroy(oldPanel));
}
GameObject panelInstance = Instantiate(manager.DynamicUIs["infoAlarm"]);
panelInstance.transform.SetParent(manager.canvas.transform, false);
manager.panelQueue.Enqueue(panelInstance);
TextMeshProUGUI [] infotitleText = panelInstance.GetComponentsInChildren<TextMeshProUGUI>();
int index = 0;
if(infotitleText.Length == 2)
foreach (var info in infotitleText)
{
info.text = manager.sender[index++];
}
var canvas = panelInstance.GetComponent<CanvasGroup>();
canvas.alpha = 0f;
Sequence sequence = DOTween.Sequence();
sequence.Append(canvas.DOFade(1, 1f))
.AppendInterval(5f)
.AppendCallback(() => StartCoroutine(Clear()));
yield return sequence.WaitForCompletion();
}
여기서 만약 삭제를 하면 시퀸스를 멈추게만들어서 코루틴 호출이 안되야하는데 6번 패널 호출하면큐에서빼고 패널삭제는 정상적으로하는데 시퀸스가 살아서 코루틴을 호출하는바람에 문제가 생겨버림.. 시퀸스를 kill로 죽일수는 없나요 ?
이런식으로 6개 호출하면 1개는 삭제명령전에 이미따로 큐에서빼고 제거를해서 삭제명령이 5번만 떠야하는데 6번떠서 오류 뜨더라고요
DOTween.Sequence(); 해서 새로 생성된 시퀀스를 지역 변수로 두지 말고 따로 파둔 변수에 저장해놨다가 필요할 때 이 시퀀스를 직접 kill 하세용
시퀸스는 애니메이션과달리 오브젝트에 연결되는게아니라 참조할게 따로 필요하나보네요 . 일단 큐에다 튜플로엮어서 해결했습니다.
저도 윗댓처럼 따로 파둔 변수에 넣어뒀어요
SetTarget함수 사용하면 되지 않나?
캔슬레이션 토큰 개좋은데