작성
·
710
0
강사님께서 알려주신 방법으로는 TryDequeue가 확장메서드가 없다고 에러가 떠서 아래와 같은 방식으로 사용하였습니다. 혹시 이렇게 사용해도 되는지 궁금하여 질문 남깁니다.
using System.Collections;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Text;
using UnityEngine;
using TMPro;
private ConcurrentQueue<Quest> reservedQuests = new ConcurrentQueue<Quest>();
private IEnumerator ShowNotice()
{
var waitSeconds = new WaitForSeconds(showTime);
Quest quest;
while (reservedQuests.TryDequeue(out quest))
{
titleText.text = titleDescription.Replace("%{dn}", quest.DisplayName);
foreach (var reward in quest.Rewards)
{
stringBuilder.Append(reward.Description);
stringBuilder.Append(" ");
stringBuilder.Append(reward.Quantity);
stringBuilder.Append(" ");
}
rewardText.text = stringBuilder.ToString();
stringBuilder.Clear();
yield return waitSeconds;
}
gameObject.SetActive(false);
}
변경
1. using System.Collections.Concurrent; 추가
2. private ConcurrentQueue<Quest> reservedQuests = new ConcurrentQueue<Quest>(); 로 변경
답변 2
0
혹시, 이후에 강의 수강하시는 분들이 같은 문제를 겪는다면 유니티 재설치 또는 최신버전 사용을 권해드립니다.
이전에 'QuestTargetMarker 스크립트 오류'라는 제목으로 올라왔던 KeyValuePair<T Key, T Value>에 대한 정의를 찾지 못하는 에러와 이번 TryDequeue에 대한 정의를 찾지 못하는 에러 둘 다 발생을 하여 .NET버전을 점검하였고, 전부 최신버전임을 확인하였음에도 문제 해결이 안 되서 유니티 쪽 버전을 갈아치웠고(2020.3.12 -> 2021.3.6), 에러가 사라졌습니다.
다만, 이게 유니티 버전상의 에러인지 유니티 에디터의 에러인지는 의구심이 남습니다. 동일한 버전을 재설치 했더라도 문제는 똑같이 해결되지 않았을까 싶긴 합니다.
0
수강해주셔서 감사합니다.
ConcurrentQueue는 쓰레드 안정성을 보장하는 Queue로 사용 상황에 맞지 않기 때문에 아래와 같이 바꿔주시면 될 것 같습니다.
while (reservedQuests.Count > 0)
{
var quest = reservedQuests.Dequeue();
titleText.text = titleDescription.Replace("%{dn}", quest.DisplayName);
foreach (var reward in quest.Rewards)
{
stringBuilder.Append(reward.Description);
stringBuilder.Append(" ");
stringBuilder.Append(reward.Quantity);
stringBuilder.Append(" ");
}
rewardText.text = stringBuilder.ToString();
stringBuilder.Clear();
yield return waitSeconds;
}
기존와 코드와 위의 코드는 취향 차이일뿐 다를게 전혀 없습니다.
다만 TryDequeue는 C# Net 2.0부터 있던 초기 함수이기 때문에 TryDequeue가 정의되어 있지 않다고 에러가 나온다면 향후를 위해 Net버전 점검이나 유니티를 재설치해보시길 권장해드립니다.
감사합니다.