작성
·
446
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
좋은 강의 감사합니다.
퀘스트를 제가 생각한 방식에 맞게 만들다보니 궁금한 점이 생겨서 질문드립니다.
만약에 예를 들어 몬스터 5마리를 잡고 해당 몬스터가 드랍하는 아이템을 얻어야한다. 라는 퀘스트가 있다면 해당 몬스터에 두개의 QuestReport를 달아줘야 하는건가요?
답변 1
0
수강해주셔서 감사합니다.
이건 어떻게 만드냐에 따라 다른데요, 가장 간단한 방법은 인벤토리에 아이템이 들어왔을 때 해당 아이템이 인벤토리에 총 몇개가 있는지 Report 해주는겁는다. 인벤토리에 아이템을 넣는 함수에 직접 Report하는 코드를 작성하시거나, onPickedUp 같은 event를 만들어서 아이템을 넣는 함수에서 호출되게 하시고, QuestItemReporter 스크립트를 따로 만들어서 event에 연결하여 대신 Report 해주는 형식으로 만드시면 됩니다. 아이템을 뺄 때도 마찬가지입니다.
Task는 SimpleSet Action을 조합하고, CanReceiveReportsDuringCompletion 옵션을 체크해서, 계속 Report 받으면서 Task를 완전히 끝낼 때까지 인벤토리에 퀘스트 아이템이 몇 개가 있는지 감시하면 됩니다.
MMORPG 게임을 해보셨다면 '슬라임이 드랍하는 점액을 가져와라'라는 퀘스트가 있을 때, 직접 몬스터를 잡아서 점액을 가져와도 되지만, 보통 그냥 사람들한테 점액을 사서와도 Complete가 되죠? 보통 아이템 수량 관련한 퀘스트는 말씀드린대로 인벤토리에 있는 아이템 수량을 체크하는 방식으로 만듭니다.
감사합니다.
제가 충분히 이해시켜드리지 못한 것 같습니다.
class Inventory
{
private List<Item> items
public void Push(Item newItem)
{
var item = items.FirstOrDefault(x => x.ID == newItem.ID);
if (item)
item.Count += newItem.Count;
else
{
items.Add(newItem);
item = newItem
}
// Ex. Category = "Item", CodeName = "슬라임 점액", Count = 3
// => '슬라임 점액'이 Target인 Task의 SuccessCount가 3으로 Update
QuestSystem.Instance.ReceiveReport("Item", item.CodeName, item.Count);
}
public Item Pull(string codeName)
{
// Pull 처리
...
//
QuestSystem.Instance.ReceiveReport("Item", item.CodeName, item.Count);
return item;
}
}
이런 식으로 Inventory의 Item을 넣고 빼는 함수(Push, Pull)에 Report 함수를 직접 작성해서 넣어주면, 따로 QuestGiver를 넣을 필요 없이 어떤 아이템이든 습득, 제거할 때마다 Task가 Report 받게 됩니다. 만약 인자로 들어온 newItem의 CodeName이 '슬라임 점액'일 경우, 슬라임 점액이 Target인 Task가 Report 받아서 SuccessCount가 Update 될겁니다. 슬라임 점액이 Target인 Task가 없으면 아무 일도 안 일어날거구요.
Task와 Target은 아래처럼 구성할 수 있을겁니다.
빠른 답변 감사합니다. 하지만 위와 같이 체크를 하더라도 만약에 여러가지 아이템을 모아야하는 상황이 온다면 제 질문과 같이 여러개의 QuestReport를 달아줘야하는거 아닌가요??
예를 들면 '슬라임의 점액과 슬라임의 물방울을 가져와라'라는 퀘스트가 있다고하면
타겟이 두개가 존재하게 되고
이것이 아니더라도 5레벨때는 '슬라임의 점액을 가져와라'라면 10레벨때는 '킹슬라임의 점액을 가져와라' 라는 퀘스트마다 타겟이 다를때는 어떻게 해줘야되는건가요?