강의

멘토링

커뮤니티

Inflearn Community Q&A

gangnam's profile image
gangnam

asked

[Unity Level Up!] Quest & Achievement System Developed Modularly

Quest Detail View

Written on

·

208

0

Quest Detail View는 Tracker랑 다르게 몬스터를 잡으면 퀘스트 진행도가 바로바로 업데이트가 안되고 퀘스트를 클릭 했을 때 업데이트가 되는데 이걸 어떻게 고쳐야 Tracker랑 똑같이 바로바로 업데이트가 될까요?

unity

Answer 1

0

Developer G님의 프로필 이미지
Developer G
Instructor

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

방법은 여러가지가 될 수 있습니다만, 실시간 업데이트로 가장 간편한 방법은 역시 이벤트 등록일겁니다.
QuestDetailView의 Show 함수에서 Target = quest;를 해줄 때 Quest의 onTaskSuccessChanged 이벤트 변수에 진행도를 업데이트하는 이벤트를 만들어서 등록해주면 됩니다.

예를 들면 아래와 같습니다.
QuestDetailView.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public void ShowTasks(Quest quest)
{
        int taskIndex = 0;
        foreach (var taskGroup in quest.TaskGroups)
        {
            foreach (var task in taskGroup.Tasks)
            {
                var poolObject = taskDescriptorPool[taskIndex++];
                poolObject.gameObject.SetActive(true);
 
                if (taskGroup.IsComplete)
                    poolObject.UpdateTextUsingStrikeThrough(task);
                else if (taskGroup == quest.CurrentTaskGroup)
                    poolObject.UpdateText(task);
                else
                    poolObject.UpdateText("● ??????????");
            }
        }
}
 
private void OnTaskSuccessChanged(Quest quest, Task task, int currentSuccess, int prevSuccess)
         => ShowTasks(quest);
 
public void Show(Quest quest)
{
        displayGroup.SetActive(true);
 
        if (Target != null)
          Target.onTaskSuccessChanged -= OnTaskSuccessChanged;
        Target = quest;
        Target.onTaskSuccessChanged += OnTaskSuccessChanged;
 
        title.text = quest.DisplayName;
        description.text = quest.Description;
 
        ShowTasks(Target);
...
...
...
}
 
public void Hide()
{
        if (Target != null)
          Target.onTaskSuccessChanged -= OnTaskSuccessChanged;
        Target = null;
        displayGroup.SetActive(false);
        cancelButton.gameObject.SetActive(false);
}
cs

 

가이드 정도만 할 목적으로 작성된 코드이기 때문에 최적화할 부분이 많으니 그 부분을 생각해보시면서 코드를 작성해보시면 좋을 것 같습니다.

gangnam's profile image
gangnam

asked

Ask a question