inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템

Quest가 완료되었음을 알려주는 Quest Completion Notifier UI 제작

TryDequeue 확장메서드

828

호빵

작성한 질문수 2

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>(); 로 변경

unity

답변 2

0

bmkim

혹시, 이후에 강의 수강하시는 분들이 같은 문제를 겪는다면 유니티 재설치 또는 최신버전 사용을 권해드립니다.

이전에 'QuestTargetMarker 스크립트 오류'라는 제목으로 올라왔던 KeyValuePair<T Key, T Value>에 대한 정의를 찾지 못하는 에러와 이번 TryDequeue에 대한 정의를 찾지 못하는 에러 둘 다 발생을 하여 .NET버전을 점검하였고, 전부 최신버전임을 확인하였음에도 문제 해결이 안 되서 유니티 쪽 버전을 갈아치웠고(2020.3.12 -> 2021.3.6), 에러가 사라졌습니다.

다만, 이게 유니티 버전상의 에러인지 유니티 에디터의 에러인지는 의구심이 남습니다. 동일한 버전을 재설치 했더라도 문제는 똑같이 해결되지 않았을까 싶긴 합니다.

0

Developer G

수강해주셔서 감사합니다.

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버전 점검이나 유니티를 재설치해보시길 권장해드립니다.

감사합니다.

Task 구현 28:36 Equals 에서 잘 모르는 부분이 있습니다.

0

45

2

Quest System의 확장성에 대한 질문

0

111

1

공부 방향에 대해 궁금한 점이 있습니다.

0

152

2

End()와 Complete() 함수를 따로 구현한 의도

0

179

2

Target의 value에 Object 자료형 관련 질문입니다!

0

158

2

TaskGroupState에 대하여 질문이 있습니다

0

118

2

Elite와 Normal Germ의 IsTarget()질문입니다.

0

109

2

퀘스트 시스템을 확장하면서 생긴 의문점 입니다.

0

181

2

퀘스트 클리어해도 동일 퀘스트가 노출됩니다

1

141

3

퀘스트 누적 클리어 횟수에 대해 여쭤보고싶습니다.

0

93

1

프로퍼티 사용 질문입니다.

0

125

1

Task 에서 Object 타입 사용

0

131

2

파일 저장방식, 퀘스트 실패에 관하여 여쭤보고싶습니다.

0

240

1

Destroy() 지연 파괴에 관하여

0

147

1

Action & Delegate

0

184

2

강의에서 리워드 관련 언급은 없으셔서 질문드립니다.

0

286

1

궁금한게있습니다

0

304

1

스크립터블 오브젝트 Instantiate?

0

448

1

원하는 타이밍에 퀘스트를 등록하고 싶다면 어떻게 해야할까요

0

345

1

Quest Cancel() 메소드

0

273

2

Task의 IsEqual

0

234

1

실전예제 UI 자료

0

205

1

스크립터블 오브젝트

1

337

1

Task 예시

1

179

1