# 캐릭터

## **개요**

OVERDARE는 **ODA(OVERDARE Deformable Avatar)** 기반의 아바타 시스템을 제공합니다. 크리에이터는 ODA를 활용하여 별도의 캐릭터 구현 없이 게임을 제작할 수 있습니다. 오버데어는 **Cage Mesh Deformer** 기술을 이용해 다양한 신체 Part와 호환되는 의상 및 액세서리를 제작하고 적용할 수 있습니다.

## **캐릭터 유형**

오버데어 UGC에는 두 가지 주요 캐릭터 유형이 존재합니다:

* **기본 캐릭터**: 리그빌더(RigBuilder)로 생성되거나 외부에서 가져온 ODA 기반 캐릭터.
* **플레이어 캐릭터**: 사용자가 오버데어 플랫폼에서 커스터마이즈한 의류와 액세서리를 장착하고 조작 가능한 아바타 캐릭터.

두 캐릭터 모두 ODA 기반으로 동작하며, 플레이어가 오버데어 플랫폼에서 제작한 캐릭터인지, 또는 크리에이터가 게임 내에서 생성한 캐릭터인지의 차이를 가집니다. 플레이어는 기본적으로 UGC 월드에서 자신의 아바타로 모험을 즐길 수 있습니다.

크리에이터는 게임의 특성과 콘셉트에 맞춰 NPC를 제작하거나, 플레이어 캐릭터를 크리에이터가 생성한 캐릭터로 대체할 수도 있습니다.

## **캐릭터 모델 구조**

오버데어 캐릭터 모델은 다음과 같은 구조를 가지고 있습니다:

* **Model**: 캐릭터 전체를 포함하는 최상위 오브젝트.
* **Humanoid**: 캐릭터의 행동 및 상태를 관리.
* **HumanoidRootPart**: 캐릭터 중심 역할을 하는 RootPart.
* **6개의 MeshPart**: 머리(Head), 몸통(Torso), 양팔(RightArm/LeftArm), 양다리(RightLeg/LeftLeg).
* **Skeleton**: 19개의 Bone으로 구성된 스켈레톤 구조.

## **캐릭터의** Part**와 Skeleton 구조**

오버데어 아바타는 6개의 BodyPart(머리, 몸통, 양팔, 양다리)와 Skeleton 구조를 기본으로 합니다.

* **6개의 MeshPart**: 블록처럼 간단히 조립 가능하며, OVERDARE Studio에서 복잡한 리깅 작업 없이 외형을 교체할 수 있습니다.
* **스켈레탈 메시 변환**: 게임 실행 시 6개의 메시가 하나로 병합되고, 19개의 Bone을 가진 스켈레탈 메시로 변환됩니다.
  * 이를 통해 레고 블록처럼 외형을 손쉽게 조립하면서도 부드럽고 다이내믹한 애니메이션 구현이 가능합니다.

오버데어 아바타의 Bone 구조는 다음과 같습니다:

<figure><img src="/files/vg5GexTgsuBwnaxswxTF" alt=""><figcaption></figcaption></figure>

| No | Name          | 위치            | Attachments |
| -- | ------------- | ------------- | ----------- |
| 1  | Root          | 캐릭터 중심의 바닥 위치 |             |
| 2  | LowerTorso    | 허리            |             |
| 3  | UpperTorso01  | 하복부           |             |
| 4  | UpperTorso02  | 상복부           |             |
| 5  | Head          | 머리            |             |
| 6  | LeftUpperArm  | 좌측 상박         |             |
| 7  | LeftLowerArm  | 좌측 하박         |             |
| 8  | LeftHand      | 좌측 손          |             |
| 9  | LeftItem      | 좌측 장비 위치      |             |
| 10 | RightUpperArm | 우측 상박         |             |
| 11 | RightLowerArm | 우측 하박         |             |
| 12 | RightHand     | 우측 손          |             |
| 13 | RightItem     | 우측 장비 위치      |             |
| 14 | LeftUpperLeg  | 좌측 허벅지        |             |
| 15 | LeftLowerLeg  | 좌측 종아리        |             |
| 16 | LeftFoot      | 좌측 발          |             |
| 17 | RightUpperLeg | 우측 허벅지        |             |
| 18 | RightLowerLeg | 우측 종아리        |             |
| 19 | RightFoot     | 우측 발          |             |

## **Humanoid 시스템**

Humanoid는 캐릭터의 행동과 상태를 정의하는 핵심 클래스입니다.

### **주요 속성**

| 속성            | 설명                                   |
| ------------- | ------------------------------------ |
| Health        | 캐릭터의 현재 체력                           |
| JumpHeight    | 캐릭터 점프 높이. 중력과 계산되어 실제 점프 궤적이 결정됩니다. |
| MaxHealth     | 캐릭터의 최대 체력                           |
| MaxSlopeAngle | 캐릭터가 오를 수 있는 최대 경사 각도                |
| RootPart      | 캐릭터 기준 Part (HumanoidRootPart)       |
| WalkSpeed     | 캐릭터 걷는 속도                            |

### **Humanoid State**

Humanoid는 여러 상태(HumanoidStateType)를 지원하며, 각 상태에 따라 기본 애니메이션이 재생됩니다. 예를 들어, 점프 시 "Jumping", 낙하 시 "FreeFall" 상태가 활성화됩니다.

스크립트를 통해 상태를 강제로 변경하거나 특정 상태로 전이 되는 것을 막을 수 있습니다.

### **Humanoid의 주요 상태**

| No | 상태       | 설명                                                     |
| -- | -------- | ------------------------------------------------------ |
| 1  | Running  | 기본 상태이며, 이 상태에서 이동 또는 점프가 가능합니다.                       |
| 2  | Jumping  | 캐릭터가 막 점프한 직후의 짧은 상태. 보통 이후 Freefall 또는 Landed로 전이됩니다. |
| 3  | Freefall | 공중에서 자유 낙하 중인 상태. 점프 후 체공 중이거나 높은 곳에서 떨어질 때 진입합니다.     |
| 4  | Landed   | Freefall 이후 지면에 닿은 직후의 짧은 상태.                          |
| 5  | Climbing | 캐릭터가 물체를 등반 중인 상태.                                     |
| 6  | Swimming | 캐릭터가 수영 중인 상태.                                         |
| 8  | Ragdoll  | Ragdoll이 활성화된 상태.                                      |
| 9  | Dead     | 캐릭터가 체력이 0이 되어 사망한 상태.                                 |
| 10 | Physics  | Physics이 활성화된 상태.                                      |

#### **Humanoid State 제약**

`Humanoid:SetStateEnabled` 함수를 통해 특정 상태의 전이를 제한할 수 있습니다.\
예를 들어, Climbing이 가능한 Part 근처에 캐릭터가 접근하더라도 아래 코드로 해당 상태 전이를 방지할 수 있습니다

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhRPi87oM9ttlk5nyu7L7%2Fuploads%2FPyWJqwo43mkZOAERasyv%2F2025-07-03%2014-58-35.mp4?alt=media&token=0b071649-71ef-4c36-a318-fee034737cd5>" %}
Climbing이 가능한 상태
{% endembed %}

```lua
local Character = script.Parent
local Humanoid = Character.Humanoid

Humanoid:SetStateEnabled(Enum.HumanoidStateType.Climbing, false)
```

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhRPi87oM9ttlk5nyu7L7%2Fuploads%2FjuG0oxouwcPoxkcXLQn1%2F2025-07-03%2014-59-13.mp4?alt=media&token=c3f5f041-47b2-4919-a130-45137a2db0c7>" %}
Climbing 상태로의 전이를 막았을 때
{% endembed %}

#### **Humanoid State 변경**

기본적으로 Humanoid State는 플레이어의 입력이나 Humanoid 속성에 따라 자동으로 전이됩니다.\
예를 들어, `Health`가 0이면 Dead 상태로 변경되고, 점프 버튼 입력에 따라 Jumping → Freefall → Landed → Running으로 상태가 전이됩니다.

캐릭터가 CanClimb이 켜진 Part 또는 MeshPart에 접촉하게 되면, 캐릭터는 Climbing 상태로 전환됩니다.

<div><figure><img src="/files/wAxKh5Av2u2CrpJ3k3Gz" alt=""><figcaption></figcaption></figure> <figure><img src="/files/9rShKoCyhAvbt9xEpaRb" alt=""><figcaption></figcaption></figure></div>

#### **Ragdoll State**

Ragdoll은 "봉제인형"처럼 축 늘어진 캐릭터의 모습을 나타냅니다. 이 상태에서는 기존 애니메이션이나 플레이어 입력이 적용되지 않으며, 캐릭터는 Skeleton 구조를 기반으로 물리적인 힘에만 반응합니다.

Ragdoll 상태는 자동으로 전이되지 않으며, 스크립트를 통해 수동으로 전환해야 합니다. 상태 변경은 `Humanoid:ChangeState` 함수를 사용합니다:

```lua
local Character = script.Parent
local Humanoid = Character.Humanoid

Humanoid:ChangeState(Enum.HumanoidStateType.Ragdoll)
```

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhRPi87oM9ttlk5nyu7L7%2Fuploads%2F7MLoVVhKEa2pYtSmDIBu%2F2025-02-18%2017-43-47.mp4?alt=media&token=2c730a33-1a14-4248-b36e-6a3830c4b2da>" %}

Ragdoll 상태에서 다시 원래 상태로 돌아가려면 다음과 같이 강제로 상태를 변경해야 합니다.

```lua
local Character = script.Parent
local Humanoid = Character.Humanoid

Humanoid:ChangeState(Enum.HumanoidStateType.Ragdoll)
wait(3)
Humanoid:ChangeState(Enum.HumanoidStateType.Running)
```

#### **Physics State**

Physics 상태에서는 캐릭터의 움직임이 오직 물리 엔진에 의해 결정됩니다. 이 상태에서는 기존 애니메이션이나 플레이어 입력이 적용되지 않으며, 캐릭터는 LinearVelocity, VectorForce 등의 물리 인스턴스를 통해 가해지는 힘에만 반응합니다.

Physics 상태는 자동으로 전이되지 않으며, 스크립트를 통해 수동으로 전환해야 합니다. 상태 변경은 `Humanoid:ChangeState` 함수를 사용합니다:

```lua
local Character = script.Parent
local Humanoid = Character.Humanoid

Humanoid:ChangeState(Enum.HumanoidStateType.Physics)
```

## **Attachment**

각 Bone에 매칭된 Attachment를 통해 이펙트 위치 지정, 액세서리 부착, 물리적 Constraint 적용 등이 가능합니다.\
Attachment는 Bone의 동적 움직임을 기준으로 작동하며, 크리에이터는 이를 통해 캐릭터 모델과 상호작용하는 아이템을 손쉽게 배치할 수 있습니다.

## **캐릭터 애니메이션**

{% content-ref url="/pages/GWE1QQYA5ZKybkJcVPtz" %}
[캐릭터 애니메이션](/korean/manual/studio-manual/character/character-animation.md)
{% endcontent-ref %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.overdare.com/korean/manual/studio-manual/character.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
