타입의 이해

# 학습 과정 소개

타입(Type)의 개념과 활용 방법을 소개합니다.

# 타입이란?

[png](1687940593248ba72058dee8e4fb58ec8a1964a2a6663) 메이플스토리 월드에서 타입이란 여러 가지 프로퍼티 및 함수를 조합하여 하나의 새로운 데이터 유형을 만드는 사용자 정의 자료형을 말합니다. 타입을 활용하면 유사한 성격의 데이터를 한 번에 묶어서 제어하고 관리할 수 있어 코드를 재사용하기 좋습니다. 또한 코드를 유지 보수할 때 유용합니다.

## 타입과 컴포넌트의 차이

타입은 컴포넌트와 비슷하지만 다음과 같은 차이점이 있습니다.

  * 타입은 컴포넌트가 아니므로 엔티티에 추가할 수 없습니다.
  * 타입은 실행 제어 기능을 지원하지 않습니다.
  * 타입에는 이벤트 핸들러가 없습니다.
  * 각 타입의 용도에 맞는 기본 이벤트 함수가 제공되기도 합니다.



# 타입의 특징과 종류

각 타입은 사용처가 정해져 있습니다. 그리고 사용처에 맞는 Native 기능과 연동되어 있습니다. 또한 각 타입의 용도에 맞는 기본 이벤트 함수가 제공되는 타입도 있습니다. 기본 이벤트 함수가 어떻게 작동할지는 Native에서 이미 정의되어 있습니다. 그러므로 크리에이터는 이러한 기본 이벤트 함수를 가져다가 본인의 월드에 맞게 필요한 부분만 구현하면 됩니다.

이제 타입의 종류와 특징, 그리고 활용법을 알아봅시다.

## EventType

Native에서 정의되지 않은, 새로운 EventType을 정의할 때 사용합니다. EventType은 Event System과 연동됩니다. EventType의 자세한 활용 예시는 [Entity Event System](/docs/?postId=176) 가이드를 참고해 봅시다.

## ItemType

ItemType은 말 그대로 아이템을 분류하고, 분류된 아이템의 성격을 정의할 때 사용합니다. ItemType은 [ItemService](/apiReference/Services/ItemService)와 연동됩니다. ItemType은 개별 아이템 단위로 생성할 수도 있지만 일반적으로는 기능이 동일한 유형 별로 묶어서 생성하는 것이 좋습니다. 예를 들어, 크리에이터가 만드는 월드에는 여러 아이템이 존재할 것입니다. 이 아이템의 종류를 크게 아래와 같이 나눌 수 있다고 가정해 봅시다.

  * 무기 : 공격력을 가짐
  * 포션 : 회복력을 가짐
  * 방어구 : 방어력을 가짐
  * 기타 : 특별한 기능 없음



이런 경우에는 아래와 같이 ItemType을 만들 수 있습니다. [png](16806724849204180b61d083646ccae04f255217b72c2)

ItemType 스크립트에서는 기본 이벤트 함수인 `OnCreate()`를 사용할 수 있습니다. `OnCreate()`는 아이템이 생성될 때 자동으로 호출되며 아이템 테이블(UserItemDataSet)의 데이터가 아이템 객체로 넘어옵니다. 아이템 객체로 넘어온 데이터는 `self.ItemTableData:GetItem("컬럼명")` 형식으로 접근할 수 있습니다. [png](1680672660749a9c4c02d07df4a938bb51c84d12a1b84)

ItemType의 자세한 활용 예시는 [아이템 생성 및 삭제](/docs/?postId=66) 가이드를 참고해 봅시다.

## BTNodeType

몬스터나 NPC 같은 엔티티에 AI를 적용할 때는 [AIComponent](/apiReference/Components/AIComponent)를 활용합니다. AIComponent로 행동 트리(Behaviour Tree)를 만들 수 있습니다. 이 행동 트리를 구성하는 노드 중 하나인 Action 노드를 생성할 때 BTNodeType 스크립트를 사용합니다.

Action 노드는 "엔티티의 행동" 또는 "행동에 대한 조건"을 정의합니다. 예를 들어, 몬스터가 "대기" 상태에 있을 때 어떤 행동을 할지를 정의하거나, "대기" 상태에서 "공격" 상태로 변환되는 조건을 정의합니다. BTNodeType으로 Action 노드를 만들어 두면 AIComponent의 `CreateNode()`로 손쉽게 노드 객체를 생성할 수 있습니다.

BTNodeType 스크립트에서는 기본 이벤트 함수인 `OnBehave()`, `OnInit()`를 사용할 수 있습니다.

[{"함수":"OnBehave(number delta)","설명":"해당 Action 노드가 실행될 때마다 1회씩 호출되는 함수입니다. AI의 행동이나 행동의 조건을 정의할 때 사용하는 함수이기 때문에 BTNodeType을 만들었다면 반드시 추가해야 합니다."},{"함수":"OnInit()","설명":"OnBehave()가 호출되기 전에 실행되는 함수입니다."}]

[png](1680766233591bda06f8923594e85abd6e71e451335bb)

각 함수에 대한 보다 자세한 설명 및 BTNodeType 활용 예시는 [행동 트리를 활용한 AI 만들기](/docs/?postId=562) 가이드를 참고해 봅시다.

## StateType

StateType은 사용자가 새로운 상태를 만들 때 사용합니다. 예를 들어 플레이어 캐릭터는 서 있는 상태, 엎드린 상태, 공격 상태, 점프하는 상태 등 여러 가지 상태를 갖고 있습니다. 이렇게 기본적으로 갖고 있는 상태 이외에 크리에이터가 추가하고 싶은 새로운 상태가 있을 때 StateType을 추가하면 됩니다. StateType은 [StateComponent](/apiReference/Components/StateComponent)와 연동됩니다.

StateType에서는 다음의 내용을 정의할 수 있습니다.

  * 어떤 상태에 진입하거나 상태에서 퇴장할 때 사용자가 정의한 행동을 수행하게 할 수 있습니다.
  * 상태가 종료되는 조건을 정의할 수 있습니다.



StateType 스크립트에서는 기본 이벤트 함수인 `OnEnter()`, `OnUpdate()`, `OnExit()`, `OnConditionCheck()`를 사용할 수 있습니다.

[{"함수":"OnEnter()","설명":"상태에 처음 진입할 때의 동작을 실행합니다."},{"함수":"OnUpdate()","설명":"상태가 유지되는 동안의 동작을 실행합니다."},{"함수":"OnExit()","설명":"상태가 변경될 때 실행됩니다."},{"함수":"OnConditionCheck(string nextStateName)","설명":"상태 전이 조건을 지정합니다. nextStateName 파라미터를 사용해 연결된 상태에 따라 다른 결괏값을 반환할 수 있습니다."}]

[png](16807662783116d11c7686e694f9197b6c6ab59f01ef0)

StateType에 대한 보다 자세한 설명은 [엔티티의 상태 제어하기](/docs/?postId=686) 가이드를 참고해 봅시다.

## StructType

StructType은 크리에이터가 직접 사용처를 정하고 그에 맞게 형태를 정의할 때 사용합니다. 일반적인 프로그래밍 언어의 Structure와 비슷한 기능을 한다고 이해할 수 있습니다. 다른 데이터를 담는 변수들을 묶어서 사용할 때 유용합니다. 예를 들어 "Student"라는 Type을 만들고 그 안에 "이름, 학번, 학과" 등의 변수들을 넣어 관리할 수 있습니다.

## ConditionType

ConditionType은 크리에이터가 조건을 만들고, 참과 거짓을 평가할 때 사용합니다. StateSet에서 전이 조건을 만들 때 사용합니다.

ConditionType 스크립트에서는 `OnPreviousStateEnter()`, `OnConditionCheck()`, `PreviousStateEnd()`을 사용할 수 있으며 모든 이벤트 오버라이드가 가능합니다.

ConditionType에 대한 보다 자세한 설명은 [StateSet 제어하기](/docs?postId=1398) 가이드를 참고해 봅시다.

[{"메소드 명":"OnPreviousStateEnter()","설명":"조건과 연결된 출발 상태에 진입할 때 호출됩니다. 평가에 사용할 프로퍼티의 초기화 등에 적합합니다."},{"메소드 명":"OnConditionCheck()","설명":"전이를 시도할 때 호출되며 true 반환 시 참, false 반환 시 거짓으로 평가됩니다. 엔티티 종류와 StateComponent.IsLegacy 값에 따라 단 하나의 실행 공간에서만 호출됩니다."},{"메소드 명":"OnPreviousStateEnd()","설명":"조건과 연결된 출발 상태가 종료될 때 호출됩니다."}]