# 캐릭터

## **개요**

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**: 22개의 Bone으로 구성된 스켈레톤 구조.

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

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

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

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

<figure><img src="https://2697870212-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhRPi87oM9ttlk5nyu7L7%2Fuploads%2Fgit-blob-b031f902b257fedcaa7285bb16787a8ad8dd6621%2Fimage2024-12-20_15-50-27.png?alt=media" alt=""><figcaption></figcaption></figure>

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

## **Humanoid 시스템**

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

### **주요 속성**

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

### **Humanoid State**

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

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

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

| No | 상태       | 설명                               |
| -- | -------- | -------------------------------- |
| 1  | Running  | 기본 상태이며, 이 상태에서 이동 또는 점프가 가능합니다. |
| 2  | Jumping  | 캐릭터가 점프하여 상승 중인 상태.              |
| 3  | Freefall | 캐릭터가 공중에서 하강 중인 상태.              |
| 4  | Landed   | 캐릭터가 공중에서 바닥으로 내려온 상태.           |
| 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="https://2697870212-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhRPi87oM9ttlk5nyu7L7%2Fuploads%2Fgit-blob-21004a31c8251c5e490b18cccf037c124d457230%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure> <figure><img src="https://2697870212-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhRPi87oM9ttlk5nyu7L7%2Fuploads%2Fgit-blob-09d052053f4d3befab322d4e5d494a435f684e37%2Fimage.png?alt=media" 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="character/character-animation" %}
[character-animation](https://docs.overdare.com/korean/manual/studio-manual/character/character-animation)
{% endcontent-ref %}
