퀘스트에서 Target이란?
퀘스트에서 Target이란 "모험 전투 5회 도전하기"에서 "모험 전투"가 Target이다.
Target은 다양한 형태로 존재할 수 있으며
"슬라임 5마리 잡기" 에서 Target은 슬라임으로, 형태가 존재하므로 GameObject 자료형 또는 다른 class 자료형 일것이고,
"강화 10번 하기" 에서 Target은 강화하기로, 강화는 형태가 존재하지 않으므로 string 자료형일것이다.
Target 구현
TaskTarget 스크립트를 만들어준다.
ScriptableObject를 상속받아주고 추상화 클래스로 만들어준다.
Target을 외부로 가져올 수 있는 추상 object 변수 Value를 읽기 전용 프로퍼티로 만들어주고,
Target이 일치한지 확인해주는 bool형 추상 메서드 IsEqual을 만들어준다.
object 형식으로 만드는 이유는 실제 Target의 자료형을 자식에서 직접 구현하게 하기 위함이다.
StringTarget 제작
TaskTarget을 상속받는 StringTarget 스크립트를 생성해준다.
인스펙터에 보여질 수 있는 string형 변수 value를 선언해주고
상속받은 Value를 string형 value에 대입한다.
IsEqual함수를 상속받고, 새 string형 변수 targetAsString을 생성하여 target을 string으로 캐스팅 해준다.
만약 캐스팅에 실패했다면, 같은 Type이 아니므로 false를 반환, 성공했다면 value값과 비교하여 return 해준다.
GameObjectTarget 제작
TaskTarget을 상속받는 GameObjectTarget 스크립트를 생성해준다.
GameObjectTarget도 StringTarget과 똑같이 target을 GameObject로 캐스팅해주고
만약 캐스팅에 실패했다면, 같은 Type이 아니므로 false를 반환한다.
하지만 같은 타입일 때 반환하는 과정에서 조금 차이가 있는데,
StringTarget은 단순히 value값을 비교해서 넘겨주는 반면
GameObjectTarget에서는 targetAsGameObject의 이름에 value의 이름이 포함되어있는지 확인한다.
이름이 포함되어있는지 확인하는 이유는 원본이 아닌 생성된 오브젝트의 이름은 위의 사진처럼 (1) 또는 (Clone) 같이
추가적으로 뒤에 붙는 문자열들이 있기 때문에 그냥 값 비교가 아닌 이름이 포함되어있는지 확인해주는것이다.
이제 다시 Task 스크립트로 돌아가서,
TaskTarget을 변수로 선언해준다.
여기서 배열으로 선언해주는 이유는, 한 Task의 Target이 여러개일수도 있기 때문이다.
예를 들어 Task가 "어떤 슬라임이던 10마리를 처치하라"와 같은데, 슬라임이 RedSlime, BlueSlime, YellowSlime로 여러개가 있는 경우도 있기 때문에 셋 모두 Target으로 놓을 수 있도록 배열로 선언해주는 것이다.
Task에 추가로 함수를 하나 선언해준다.
이 IsTarget 함수는 TaskTarget을 통해 이 Task가 성공 횟수를 보고받을 대상인지 확인하는 함수이다.
세팅해놓은 Target중에 해당하는 Target이 있으면 true를, 없으면 false를 반환한다.
SO 생성
StringTarget 하나와 GameObjectTarget 하나를 임시로 생성해준다.
Task SO의 Targets 리스트에 SlimeTarget을 넣으면 Slime을 Target으로 하는 Task 완성이다.
'강의 공부' 카테고리의 다른 글
[강의공부][모듈식으로 개발하는 퀘스트&업적 시스템] Quest 구현 (1) (0) | 2023.11.01 |
---|---|
[강의공부][모듈식으로 개발하는 퀘스트&업적 시스템] Task 구현 (3) Category와 Task 마무리 (0) | 2023.11.01 |
[강의공부][모듈식으로 개발하는 퀘스트&업적 시스템] Task 구현 (1) Task 생성과 성공횟수 계산 모듈 제작 (1) | 2023.10.30 |
[강의공부][모듈식으로 개발하는 퀘스트&업적 시스템] 모듈식 프로그래밍 (0) | 2023.10.30 |