강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

코리니님의 프로필 이미지
코리니

작성한 질문수

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

Quest System 구현

Quest System의 확장성에 대한 질문

작성

·

48

0

안녕하세요.

Quest System을 보고 참고하면서 구현을 하다가 확장성과 유연성에 대한 궁금증이 생겨 의견을 물어보고 싶어서 질문드립니다.

 

Quest의 경우 다양한 조건이 있을 수 있는데

예를 들면, 제한 시간 안에 clear를 했는가, 특정 스킬을 사용하지 않았는가, 특정 아이템을 보유하고 있는 상태로 완료했는가 등등

 

이런 경우에 가능하면 관리하기 쉬우면서 의존성도 낮추는 방향으로 계속 고민해 보고 있는데 어떤 방식으로 구현하는 게 좋을까요??

해봤을 때 Task 단위로 요구사항이 달라지니 Task에서 event를 연결하는게 직관적이긴한데 너무 하드코딩 방식인 것 같고(하드 코딩이 나쁘다는 것은 아니고 필요하면 해야 겠지만 좀 더 좋은 방법이 있을 것 같아서 일단은 스킵하고 찾아보고 있습니다), Event Hub 같은 기능을 만들어서 관리해보려고도 해봤는데 DynamicInvoke나 object를 쓰게 되서 프레임마다 update하는 경우도 생기는데 성능이 부담되는 것 같습니다..

답변 1

1

Developer G님의 프로필 이미지
Developer G
지식공유자

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

-제한 시간 안에 클리어 했는가
이건 아래와 같이 무언가를 클리어시 그 정보를 Target으로 만들어 Report를 보내면 됩니다.
// ClearInfo
struct ClearInfo { int stageLevel, flaot clearTime }

// QuesrSystem
QuestSystem.Instance.ReceiveReport(CATEGORY_STAGE_CLEAR, clearInfo, 1);

// TaskTarget.IsEqual
// 스테이지 클리어 정보가 조건에 맞다면 true를 return.
if (target is ClearInfo clearInfo)
return clearInfo.level == targetStageLevel && clearInfo.clearTime <= targetTime
else
return false;

 

-특정 스킬을 사용하지 않았는가, 특정 아이템을 보유하고 있는 상태로 완료했는가
Task쪽에 Task 동작마다 호출되는 모듈을 추가하면 됩니다.

// Task의 각 단계에서 실행될 Module
// TaskCustomAction.cs
public virtual OnStart(Task task) {} // Task의 Start 함수에서 실행
public virtual OnEnd(Task task) {} // Task의 End 함수에서 실행

// Task
void Start()
{
...
customAction.OnStart(this);
}

void End()
{
...
customAction.OnEnd(this);
}

OnStart에서 캐릭터가 어떤 스킬을 사용하는지 이벤트로 감시하는 모듈을 만들고,
특정 스킬을 사용하면 Task가 실패되게 만들면 되겠죠.

// SkillObservingAction : TaskCustomAction
public override OnStart(Task task)
{
// 특정 스킬을 사용하면 Task 실패
task.Owner.Owner.onSkillUsed += OnSkillUsed;
}

public overrride OnEnd(Task task)
{
// Task가 끝났으니 추적 종료
task.Owner.Owner.onSkillUsed -= OnSkillUsed;
}

보시는 것처럼 Task의 조건을 만드는건 여러 방법이 있기 때문에
'QuestReport로 보낼 Target Data를 다듬을 것인가? 아니면 Task의 Module을 만들 것인가?'
Quest를 만들 때 판단이 필요합니다.
아울러 Task의 Module 같은 경우는 만들어둔 Module을 차곡차곡 잘 쌓아두면 이후에 다른 게임을 개발할 때도 사용할 수 있으니 가능하면 내용을 범용적으로 사용할 수 있도록 만드시는게 좋습니다.
Module에 대한 Reference를 작성해둔다면, 기획자나 디자이너가 참고해서 만들어둔 Module들을 사용해 직접 Quest를 제작하고 테스트 해볼 수도 있을 겁니다.

감사합니다.

코리니님의 프로필 이미지
코리니

작성한 질문수

질문하기