모델의 활용

# 학습 과정 소개

이번 과정에서는 모델 확장과 모델 생성 방법, 그리고 모델 프로퍼티의 편집 방법을 알아봅니다. 본 과정을 진행하기 전에  가이드를 먼저 살펴보면 도움이 됩니다.

# 모델 확장

모델은 자신이 갖고 있던 속성, 즉 같은 컴포넌트와 프로퍼티 값을 물려받은 확장 모델을 생성할 수 있습니다. 얼핏 복사와 개념이 비슷한 것 같지만 복사와는 다릅니다.

  * 복사
    * 원본 모델과 복사된 모델이 독립적으로 존재하기 때문에 속성을 수정하면 서로에게 영향을 주지 않습니다.
  * 확장
    * 기반 모델과 확장 모델의 관계가 유지됩니다.
    * 기반 모델의 속성을 변경하면 확장 모델에도 적용됩니다.
    * 확장 모델이 물려받은 속성은 삭제하지 못하는 등의 편집 제한이 있습니다.



## 모델 확장 방법

Workspace에서 원하는 모델을 선택한 뒤, 콘텍스트 메뉴에서 Extend를 클릭해 확장 모델을 만듭니다. 일반적으로 NativeModel을 확장하거나, 이미 생성된 모델을 확장합니다. [png](168748927574808ba5739c2514974927e404e117fb58a)

Scene에 배치된 엔티티에서 확장 모델을 만들 수도 있습니다. 엔티티의 콘텍스트 메뉴에서 Create Extended Model From Entity를 클릭하면 확장 모델이 생성됩니다. [png](1659699619694576dc357b7da4990b5690ff856b3ca3e)

확장 모델은 MyDesk에 생성됩니다. 확장 모델의 컴포넌트와 프로퍼티를 살펴보면 기반 모델과 같은 것을 확인할 수 있습니다. [png](16596999700401c39926d07ac4d4c96e15f28690ad8a4)

## 모델 확장의 특징

확장 모델은 기반 모델로부터 컴포넌트와 프로퍼티 초깃값을 물려받습니다. 예를 들어 Model A에 컴포넌트 A, B, C가 포함되어 있다면, A의 확장 모델인 A1도 컴포넌트 A, B, C를 포함하고 있고, 프로퍼티 값도 기반 모델과 같은 초깃값으로 설정되어 있습니다.

[png](1659937910290f4135be616534e058a42ea11f624d982)

> Tip. 확장한 이후에 확장 모델의 프로퍼티 값은 기반 모델의 초깃값과 다르게 설정할 수 있습니다.

만일 기반 모델에 새로운 컴포넌트를 추가하거나, 혹은 이미 있던 컴포넌트를 삭제하면, 해당 기반 모델에서 확장된 모든 모델에도 같은 변화가 적용됩니다.   
예를 들어 봅시다.

  * Model A에 컴포넌트 A, B가 포함된 상태로 확장 모델 A1을 만든 뒤, 
    * Model A에 컴포넌트 C를 추가하면 A1에도 컴포넌트 C가 추가됩니다.
    * 반대로 Model A의 컴포넌트 A를 삭제하면, A1에도 컴포넌트 A가 삭제됩니다. [png](16599385674172dc29b11c0d34513b9f9d68582466546)



단, 확장 모델은 기반 모델로부터 받은 컴포넌트를 삭제할 수 없습니다. 예를 들어, Model A에서 컴포넌트 A, B, C를 물려받은 확장 모델 A1은 컴포넌트 A, B, C를 삭제할 수 없습니다. 물려받은 컴포넌트를 삭제하려면 A1이 아닌 Model A에서 삭제해야 합니다. [png](16599392579591f653ee65ab24429960ab8db9df69f1d)

기반 모델에 추가한 컴포넌트가 확장 모델에도 추가되는 것과 달리, 확장 모델에 추가한 컴포넌트는 기반 모델에 추가되지 않습니다. 즉, Model A의 확장 모델 A1에 컴포넌트 C를 추가하면 A1에는 포함되지만, Model A에는 포함되지 않습니다. 이를 활용하면 확장 모델만이 가질 수 있는 컴포넌트를 추가하여 기반 모델과는 다른 특성을 부여할 수 있습니다. [png](1659939801137ef0cf58931c24d0d8a8faff04f187d68)

## 모델 계층 구조 확인하기

모델 간의 관계는 프로퍼티 에디터의 Model Extension Info에서 확인할 수 있습니다. 선택한 모델의 모든 기반 모델과 바로 아래 단계의 확장 모델을 계층 구조로 보여줍니다. [png](165970035134839cc60633a0e497a91bb193aee9266b2)

계층 구조에 나타난 모델의 콘텍스트 메뉴에서 Find Model을 클릭하면 Workspace에서 해당 모델이 선택됩니다. [png](16599220988603cbb965fd0cf49898454e6c0b7fb2657)

# 신규 모델 생성

엔티티를 생성할 때는 주로 Preset List의 모델을 활용합니다. Preset List의 모델은 기본적으로 NativeModel의 특성을 물려받습니다. 그래서 Preset List의 모델 속성을 변경하려면 NativeModel을 수정해야 합니다. 하지만 NativeModel의 속성을 변경하면 해당 NativeModel에서 확장된 Preset List의 모델 속성이 모두 변경되어 버립니다. 작업 과정에서 원래 모델의 특성이 필요할 때는 또다시 수정해야 하므로 불편합니다.   
NativeModel을 수정하지 않고도 Preset List에서 제공하지 않는 신규 모델을 생성할 수 있다면 편리할 것입니다. 신규 모델은 NativeModel에서 독립적이므로 수정과 변형이 자유롭습니다. 신규 모델을 만드는 방법은 다음과 같습니다.

  * 방법 1
    * Workspace에서 [+] 버튼 - Create Model을 클릭합니다.
  * 방법 2
    * Workspace의 콘텍스트 메뉴에서 Create Model을 클릭합니다.



[png](1687494524198d8a118789c98467984663edb5051443b)

생성한 신규 모델에는 아무 컴포넌트도 없기 때문에 해당 모델을 엔티티로 배치해도 의미가 없습니다. 생성한 신규 모델의 용도에 따라 기본 컴포넌트를 추가해 사용해야 합니다. 생성한 신규 모델로 월드 엔티티를 생성할지, UI 엔티티를 생성할지에 따라 아래의 기본 컴포넌트를 추가해 봅시다.

[{"index":"월드 엔티티","0":"TransformComponent SpriteRendererComponent"},{"index":"UI 엔티티","0":"UITransformComponent SpriteGUIRendererComponent"}]

Workspace에 빈 모델을 만든 뒤 원하는 컴포넌트를 추가할 수도 있지만, 이미 Scene에 배치한 엔티티를 신규 모델로 만들 수도 있습니다. 컴포넌트와 프로퍼티 값을 눈으로 보며 수정한 엔티티를 모델로 만들기 때문에 추가 편집을 할 필요가 없어 편리합니다. 배치한 엔티티의 콘텍스트 메뉴에서 Create Model From Entity를 클릭하면 엔티티를 모델로 만들 수 있습니다. [png](1659922427878a28dedc49ae74672b7c707d7cde5d520)

# UI 엔티티로 모델 생성

UI 엔티티도 모델로 만들 수 있습니다. 예를 들어, 아래와 같이 NewUIGroup에 있는 Button01과 Button02를 모델로 만든다고 가정해 봅시다. [png](1667281846129e4eac692fe634d5f94367e7eb8c080ff)

Button01과 Button02의 상위 엔티티인 UISprite의 콘텍스트 메뉴에서 Create Model From Entity를 클릭하면 Workspace - MyDesk에 Model_UISprite가 생성됩니다. [png](1667281948281b5607277f7cd42eaa18987580c9e546a)

이처럼 UI를 모델화하면 MSW 패키지에 포함할 수 있기 때문에 UI를 다른 월드로 옮길 때 활용할 수도 있습니다.

> 더 알아보기 패키지 활용 방법은 [MSW 패키지의 활용](/docs/?postId=647) 가이드를 참고합시다. 

단, UI 엔티티를 모델화할 때는 몇 가지 제약이 존재하므로 주의해야 합니다.

  * 모든 UIGroup 엔티티는 모델화할 수 없습니다.
  * Default Group 내 Native 상태로 구현된 UIChat과 UIJoystick은 모델화할 수 없습니다.
  * Extension Info에서 Break 되는 등 일부 확장 불가능한 모델은 모델 확장 기능을 사용할 수 없습니다.



# 모델의 엔티티 생성

신규 모델이나 확장 모델을 엔티티로 생성하려면 Workspace에서 원하는 모델을 Scene에 드래그합니다. [png](1656034659249381775e32b3b4809aacebc9675b6a737)

# 모델 편집

## NativeModel과 Preset List

모델을 통해 엔티티를 생성할 수 있으며, Preset List에서 제공하는 Preset도 결국 모델이라는 것을 [Model](/docs?postId=55) 가이드를 통해 배웠습니다. Preset List의 모델은 NativeModel에서 확장되었기 때문에 Preset List 카테고리 단위로 NativeModel의 속성을 물려받습니다. 따라서 각 카테고리에 해당하는 NativeModel을 변경하면 Preset List의 모델에도 변화가 생깁니다. 예를 들어 Preset List - Object 카테고리의 모델 속성을 변경하려면 NativeModel - MapObject 속성을 변경하면 됩니다. 만일 Object 모델을 엔티티로 생성할 때 2배 크게 생성하고 싶다면 MapObject 모델의 Scale 값을 2로 설정하면 됩니다.

[png](166026562910074f2778c33374262853f0e05fa39d5bb)

## 모델 프로퍼티

모델이나 엔티티의 프로퍼티 에디터 최상단에는 어떠한 컴포넌트에도 속하지 않은 프로퍼티가 있습니다. 이것이 모델 프로퍼티입니다. 모델 프로퍼티는 각 모델 또는 엔티티에 포함된 컴포넌트의 일부 프로퍼티를 즐겨찾기처럼 모아놓은 것입니다. 모델 프로퍼티는 컴포넌트의 프로퍼티가 투영된 것이기 때문에 모델 프로퍼티의 값이 변경되면 이에 해당하는 컴포넌트의 프로퍼티 값도 함께 변경됩니다. 예를 들어 Object-1 엔티티의 모델 프로퍼티 중 하나인 Scale 값을 x = 10, y = 10, z = 10으로 변경하면 TransformComponent의 Scale도 같은 값으로 바뀝니다. [png](1660265944245a95af2dcab5a4f26b5a3dc3b8793ec81)

모델 프로퍼티는 크리에이터의 편의에 맞춰 편집할 수 있습니다.

  1. 편집하고자 하는 모델을 선택한 뒤, 모델 프로퍼티 상단의 ≡ 버튼을 클릭합니다.

  2. 메뉴에서 View Model Property를 선택하여 모델 프로퍼티 편집 모드로 전환합니다. [png](166026617550958db5ba62369422292141e0fe5384465)

  3. 각 프로퍼티 우측의 체크박스에 체크하면, 해당 프로퍼티를 모델 프로퍼티로 지정할 수 있습니다. [png](16393866635475d8a437cbd164248828822fe5ece17a3)

  4. 모델 설정 메뉴에서 View Component Property를 선택하여 체크한 프로퍼티가 모델 프로퍼티에 표시되는 것을 확인합니다. [png](16602672025747fe01c63b5fb40a19a5b048aaab4dfee)