이제 Target도 만들었고 성공횟수 계산 모듈도 만들었는데,
Target으로 뭘 해야 성공횟수를 받을 수 있는지에 대한 정보가 없다.
이를 위해 분류의 목적으로 다용도로 사용될 Category를 만들것이다.
Category class 생성
ScriptableObject를 상속받아주고, 비교를 위한 string 변수 codeName과 인스펙터에 보여지는 displayName을 만들어준다.
프로퍼티도 만들어준다.
Category는 보통 코드네임을 이용해 비교를 하는 경우가 많은데, 편의성을 위해서 Category와 문자열을 바로 비교할 수 있도록
비교 연산자를 추가해준다.
using문 System과 IEquatable<> 인터페이스를 상속받는다.
Equals 함수를 만들어준다.
널체크, 값비교, 타입비교를 해주고 내 코드네임이 other의 코드네임과 같은지 리턴해주는 함수이다.
기타 비교와 관련된 함수들도 만들어준다.
다시 Task 스크립트로 돌아가, Category와 Category 프로퍼티를 추가해준다.
그 후 IsTarget 함수에 Category도 비교하는 로직을 추가하여
결과적으로, 시스템에 보고된 Category와 Target이 내가 가진것들과 같아야 true를 반환하게 된다.
Category SO를 만들어준다. Kill이라는 범주를 지닌 Category SO를 만들어주었다.
이제 Category SO를 Task SO에 넣어주고 문자열을 채워넣으면 Slime을 제거하는 Task가 만들어졌다.
Task에서 가장 중요한 부분들을 모두 만들어주었고, 이제 Task가 잘 작동하기 위한 나머지 부분들을 만드는 일만 남았다.
Task의 상태와 이벤트 구현
현재 Task가 진행중인지, 완료되었는지를 알 수 있어야 "Task를 다 했구나" 하고 Quest를 완료할 수 있을것이다.
따라서 Task 스크립트에서 enum으로 상태를 만들어준다.
TaskState 변수도 하나 만들어주고,
이제 State가 변할 때마다 알려주는 이벤트를 만들어야 한다.
이 이벤트는 다양한 곳에서 이용이 될것인데, 대표적으로 UI 코드를 이벤트에 연결해놓으면 Task의 상태를
Update에서 계속 추적할 필요 없이 상태가 바뀌면 UI도 자동으로 바뀌게 될 것이다.
State 변화 델리게이트를 만들어준다.
만든 델리게이트를 이벤트로 만들어주고
State 프로퍼티를 만들어준다.
State가 생겼으니 Task가 Complete 상태인지 알 수 있는 프로퍼티 만들어주고 IsTarget 함수의 조건으로 추가해야 한다.
그리고 CurrentSuccess의 값이 변했을 때 알려주는 event도 만들어준다. State와 마찬가지로 다른곳에서 Update로 계속
추적하지 않게 하기 위함이다.
프로퍼티도 만들어준다.
성공값 프로퍼티 로직 설명
prevSuccess라는 변수에 현재 성공값을 저장해둔다. 나중에 비교를 위한 이전 값이라고 보면 된다.
Mathf.Clamp시켜 set으로 들어온 value값의 최솟값과 최댓값을 정해둔다. 최댓값은 Task의 완료하기 위한 성공값이다.
이 value값을 _currentSuccess 값에 넣어준다.
_currentSuccess 값이 prevSuccess와 다르다면, State를 바꿔준다. 만약 현재 성공값이 최대 성공값과 같다면 Success를
State에 넣어주고, 아니라면 Running을 넣어준다.
그리고 델리게이트 이벤트를 실행한다.
정리
- prevSuccess에 현재 성공값 저장 (이전값 개념)
- 들어온 value값을 Clamp시키고 _currentSuccess에 저장
- prevSuccess와 _currentSuccess값을 비교하여 만약 다르다면 4번 로직 실행
- _currentSuccess값이 목표 성공값에 도달했으면 Success를, 아니면 Running을 현재 State에 넣어줌
- 델리게이트 이벤트 실행
기타 기능 추가
Task에서 내 Task를 가진 Quest가 어떤 Quest인지 알면 좋을 것이다.
퀘스트 프로퍼티를 하나 생성해준다. 퀘스트가 아직 없어서 오류가 나는 것일 뿐 나중에 구현할 것이기 때문에 괜찮다.
Awake 역할을 할 Setup함수를 만들어서 Owner를 세팅해준다.
또한 Task가 시작될 때 실행되는 Start 함수와 끝날 때 실행되는 End 함수를 만든다.
Start에서는 State를 Running 상태로 만들어주고, End에서는 모든 이벤트들을 리셋시켜준다.
현재 성공값을 목표 성공값으로 만들어 퀘스트를 즉시 완료시키는 함수도 만들어준다.
성공횟수 보고 옵션
bool 변수 하나를 만들어준다.
이 변수는 Task가 완료되었어도 성공 횟수를 계속 보고받을 것인지 체크하는 옵션이다.
예를 들어, Item 100개를 모으는 퀘스트가 있다고 해보겠다.
유저가 Item 100개를 다 모아 퀘스트를 완료한 후에 Item 50개를 버리면, 유저가 갖고 있는 Item의 개수는 50개인데도
Task는 완료된 상태일것이다. 이런 상황들을 방지하기 위해 이런 옵션값을 추가해주는 것이다.
변수를 만들었으면 IsTarget 함수를 조금 수정해준다.
완료된 상태인데, 성공 횟수를 계속 받는 옵션이 켜저있으면 true를 반환한다.
이렇게 QuestSystem의 Task가 완성되었다.
코드가 길지 않은데도 모듈식 프로그래밍 덕분에 다양한 Task를 만들 수 있는 상태이다.
강화하기, 사냥하기, 실패하기 등등 다양한 Task들을 내 맘대로 찍어낼 수 있다.
이것이 모듈식 프로그래밍의 좋은 점 같다. 재사용성이 굉장히 뛰어나다.
'강의 공부' 카테고리의 다른 글
[강의공부][모듈식으로 개발하는 퀘스트&업적 시스템] Quest 구현 (1) (0) | 2023.11.01 |
---|---|
[강의공부][모듈식으로 개발하는 퀘스트&업적 시스템] Task 구현 (2) Target 구현 (0) | 2023.10.30 |
[강의공부][모듈식으로 개발하는 퀘스트&업적 시스템] Task 구현 (1) Task 생성과 성공횟수 계산 모듈 제작 (1) | 2023.10.30 |
[강의공부][모듈식으로 개발하는 퀘스트&업적 시스템] 모듈식 프로그래밍 (0) | 2023.10.30 |