UDN
Search public documentation:

UDKCustomCharactersKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 게임플레이 엘리먼트 > UDK용 커스텀 캐릭터 만들기
UE3 홈 > 캐릭터 아티스트 > UDK용 커스텀 캐릭터 만들기

UDK용 커스텀 캐릭터 만들기


문서 변경사항: Jeff Wilson 작성. 홍성진 번역.

개요


여기서는 언리얼 개발 키트에서 사용할 캐릭터 메시를 새로 만드는 방법, 엔진에 메시 콘텐츠를 임포트하는 방법은 물론 그것을 빨리 엔진에서 쓸 수 있도록 하는 방법에 대해 설명하도록 하겠습니다. 캐릭터의 행위에 대한 커스텀 프로그래밍 관련 정보는 Characters Technical Guide KR 페이지를 참고하시기 바랍니다.

스켈레톤


아래는 UDK용 캐릭터를 만드는 데 있어 길잡이 노릇을 할 4종류의 스켈레톤입니다:

알림: 몇 스켈레톤에는 바이패드 릭(Biped rig)이 포함되어 있습니다. 바이패드 릭은 그저 애니메이팅에 편하라고 추가된 여분의 스켈레톤입니다. 애니메이션이 완료되면 원래 스켈레톤에 애니메이션을 굽고 바이패드를 지운 뒤 애니메이션을 익스포트합니다.

추가로 다음은 참고용 1인칭 스켈레톤입니다:

게임상의 모든 캐릭터에 쓰이는 본 전부를 포함하는 "마스터 스켈레톤" 같은 식의 파일을 사용하면 좋습니다. 캐릭터 메시가 본을 전부 활용할 필요는 없습니다만, 마스터 스켈레톤에는 모든 캐릭터의 본 전부가 담겨있어야 합니다. 예로, 각 손목에 걸쳐있는 옷과 같은 기존에 없는 새 옷을 입은 캐릭터를 만들 때, 그런 본을 마스터 스켈레톤에 추가해야 캐릭터 생성 과정 동안에 각 메시가 제대로 작동합니다.

마스터 스켈레톤이 존재하는 모든 본을 포함하기에, 새 매시에 스킨을 입힐 때는 마스터 스켈레톤 맥스 파일을 사용하는 것이, 사용할 수 있는 모든 본을 확인하기 쉬워서 편합니다.

단순성을 높이고자, 여기서는 UDK에 포함된 애니메이션 세트를 활용하여, 기존 본에서 임포트한 캐릭터를 얻는 방법을 다루겠습니다.

메시를 스켈레톤에 웨이팅하기

커스텀 메시를 만들 때는 스켈레톤을 염두에 두고 만드는 것이 최선입니다. 메시에는 스켈레톤에 이미 정의된 위치에 맞는 조인트가 모델링되어야 합니다. 이 규칙을 따르지 않는 메시는, 스켈레톤 조인트를 회전시켜 메시의 조인트에 맞출 수 있습니다. 게임의 애니메이션은 올바른 재생을 위해 본을 원위치에 맞춥니다. 메시의 조인트와 맞추기 위해 본을 회전(rotate)시킬 수는 있지만, 옮기(translate)거나 움직(move, 역주:move=translate+rotate)여서는 안됩니다. 애니메이션이 본을 어디로 옮길지 정하기 때문에, 메시가 찌그러지거나 늘어나는 등 게임상에 예상치 못한 결과가 나타나게 됩니다. 예로, 메시의 다리가 스켈레톤에 정의된 것보다 짧아서 보정하기 위해 스켈레톤의 다리 본이 이동된 경우, 게임상의 다른 캐릭터 다리 길이에 맞추기 위해 다리가 길게 늘어집니다. 이를 통해 게임내 캐릭터 설정동안 모든 조각이 똑바로 연결되도록 유지합니다. 비율이 다른 캐릭터를 만들려면 새로운 마스터 스켈레톤이 필요하고, 기존 캐릭터와 너무 다른 비율의 캐릭터를 만들려면 아예 자체 애니메이션을 따로 만들어야 하나, 그 방법은 이 문서에서는 다루지 않습니다.

아래 메시를 예로 들겠습니다. 남성의 뼈대를 염두에 두고 모델링되었습니다. 주요 조인트와 신체 부분은 스켈레톤과 잘 맞아 떨어지므로 큰 수정은 필요치 않습니다. 메시를 스켈레톤에 웨이트할 때가 오면 훨씬 더 간단해 집니다.

UT3_Male.max 파일의 본을 병합하고, 불필요한 본은 제거한 뒤, 메시를 스켈레톤에 웨이트합니다. 이 경우, 메시에는 여분이나 본이 더 필요한 '헐렁한 비트'가 없으므로, 스켈레톤에는 웨이팅에 필요한 액기스만 남겨지게 됩니다.

Male_Bones.jpg

익스포트하기


다음은 캐릭터를 익스포트하고 엔진으로 임포트해야 합니다. 어플리케이션에 내장된 FBX 익스포터를 사용하여 스켈레탈 메시를 익스포트합니다. 그런 다음 FBX 파일 포맷을 사용하여 메시를 스켈레탈 메시로 익스포트하기 대로 따릅니다.

임포트하기


언리얼 에디터를 열고 콘텐츠 브라우저 를 엽니다. 그리고 FBX 파일 포맷을 사용하여 스켈레탈 메시 임포트하기 대로 따릅니다.

메시를 임포트한 후 다음 디렉토리에 패키지를 저장합니다:

[YourUDKInstallationDirectory]\UDKGame\Content\Characters

메시에 소켓 추가하기


소켓은 스켈레탈 메시에 사용자가 지정한 지점입니다. 아무 스켈레탈 메시에 추가할 수 있고, UDK에서는 파티클을 내뿜는 지점이나 무기를 부착할 지점을 포함하여 여러 곳에 활용됩니다. 게임내 캐릭터에서 정상 작동하게 하려면 각 메시에 추가해야 합니다. 소켓을 추가하려면, 콘텐츠 브라우저 창에서 추가하려는 스켈레탈 메시에 더블클릭하십시오. 스켈레탈 메시/애니메이션 세트 에디터 (AnimSet Editor) 창이 뜹니다. 소켓 매니저 아이콘을 클릭하거나 메시 메뉴에서 소켓 매니저를 선택하면 소켓 매니저 창이 뜹니다.

SocketManager.jpg

소켓 생성은 메뉴의 새 소켓 만들기, 소켓을 달 본 선택, 소켓 이름 입력 으로 이루어집니다.

UDK에 포함된 UTGame 캐릭터에는 커스텀 캐릭터가 현재 코드기반에서 작동하기 위해 요구되는 특정 소켓이 있습니다. 현재 캐릭터에 떨구고 추가 코딩 없이 작동하게 하려면, 메시에 최소 다음과 같은 소켓 정도는 있어야 합니다:

소켓 이름 본 이름
WeaponPoint b_RightWeapon
DualWeaponPoint b_LeftWeapon
L_JB b_LeftAnkle
R_JB b_RightAnkle
HeadShotGoreSocket b_Neck

점프 부츠를 사용할 때의 파티클 시작 지점을 지정하려면, 캐릭터의 발이나 신발에 소켓이 둘 필요합니다. 소켓 이름은 왼쪽 발에 L_JB, 오른쪽 발에 R_JB 입니다. 즉, L_JB 소켓을 추가하고 새 소켓 만들기를 선택한 후 b_LeftAnkle 본을 선택하고 나서 소켓 이름을 L_JB라 입력하면 됩니다.

소켓을 옮기거나 회전하여 메시에 맞게 위치를 조정할 수 있습니다. 생성시에 이 소켓은 발목 본의 시작점에 나타납니다. 하지만 파티클 시작점은 발바닥에 있습니다. 소켓 매니저 창의 처음 두 아이콘이 소켓 옮기기와 회전하기 입니다. 소켓 옮기기를 켜고 소켓을 발바닥으로 옮깁니다. 몇몇 소켓은 파티클 분사 방향이나 지점을 제대로 맞추려면 회전을 조금 시켜야 할 수도 있습니다. 소켓 매니저 창에서 게임에 포함된 다른 스켈레탈 메시를 열어 보면, 소켓을 어떻게 어디에 놓아야 하는지 참고해 볼 수 있습니다.

SocketTransform.jpg

More information about sockets can be found here.

기존 UDK 캐릭터에서 소켓 빠르게 복사해 오기

스켈레탈 메시에 사용되는 스켈레탈 릭이 패키지에 저장된 기존 스켈레탈 메시와 같은 것을 사용하는 경우, 소켓을 직접 만들지 않고도 빠르게 복사해 올 수 있습니다. 예를 들어 CH_LIAM_Cathode.Mesh.SK_CH_LIAM_Cathode 로 저장된 스켈레탈 메시를 엽니다. 소켓 매니저를 열고 소켓 복사 버튼을 누릅니다.

CopySockets.jpg

그리고 스켈레탈 메시를 엽니다. 소켓 매니저를 열고 소켓 붙여넣기 버튼을 누르면 땡입니다!

PasteSockets.jpg

게임에서 사용할 캐릭터 설정하기


새 캐릭터를 사용하기 위한 최종 단계는 UDK 설정하기 입니다. 이 과정은 언리얼스크립트로 UTFamilyInfo_의 하위클래스로 클래스를 하나 새로 만들기, 기존 클래스인 _UTPlayerReplicationInfo 수정하기로 나뉩니다. 물론 UDK에서 쓸 수 있는 커스텀 캐릭터를 새로 만드는 법은 많이 있습니다만, 이 문서에는 설명하지 않습니다. 캐릭터를 돌릴 수 있는 아주 기초적인 액기스만 집중해서 뽑도록 하겠습니다.

UTFamilyInfo 하위클래스

UTFamilyInfo 클래스는 기본적으로 개별 캐릭터나 캐릭터 그룹에 어떤 메시, 물리 애셋, 애니셋, 머티리얼, 깁 등을 사용할 지를 결정해 주는 프로퍼티 저장고입니다. 이 클래스에는 다른 기능도 있지만, 이 문서의 목적에 맞게 캐릭터를 UDK에 넣기 위한 프로퍼티 저장고로만 간주하겠습니다.

이 예제에서는 서브클래스를 하나 만들어서 캐릭터 하나에만 사용할 것입니다. 이론상으로는 UTFamilyInfo 의 하위클래스가 되도록 이 클래스의 계층 구조를 만들어서, 캐릭터 그룹에 공통으로 적용되는 일반 프로퍼티를 정의할 수도 있습니다. 예로, 어떤 캐릭터 그룹에 공유되는 외형상의 특징이 있다 칩시다. 이 캐릭터들은 같은 팩션의 일부로 간주될 수 있습니다. 그리고 이 클래스의 하위클래스를 여럿 만듭니다. 이들 각각은 그 팩션 내 특정 캐릭터가 될 수도 있고, 캐릭터 범주를 더 크게 잡자면 팩션에 속하는 패밀리가 될 수도 있습니다.

더 설명하기 전에, 먼저 캐릭터용 하위 클래스를 새로 만들어 봅시다.

UTFamilyInfo_SpaceMarine.uc
Class UTFamilyInfo_SpaceMarine extends UTFamilyInfo
   abstract;

defaultproperties
{
}

이제, 이 클래스의 defaultproperties 블록에 프로퍼티를 설정하거나 덮어써 커스텀 캐릭터를 만들 수 있습니다. 새로 만든 UTFamilyInfo 클래스의 제일 중요한 특성은 CharacterMesh 프로퍼티입니다. 예상하시는 대로, 이 프로퍼티는 방금 임포트한 스켈레탈 메시를 참조해야 합니다. 이 예제에서는 다음과 같습니다:

CharacterMesh=SkeletalMesh'UDNCharacters.SpaceMarine'

커스텀 애셋을 지정하려면 프로퍼티를 끝까지 설정해야 합니다. 중요 프로퍼티 몇 개는 다음과 같습니다:

  • Faction – 이 캐릭터나 캐릭터 그룹이 속하는 전체 그룹 이름입니다.
  • FamilyID – 이 캐릭터가 속하는 패밀리 이름입니다.
  • CharacterTeamBodyMaterials – 팀 게임용 캐릭터 몸체 머티리얼에 사용할 머티리얼 배열입니다. 인덱스 0은 빨강, 인덱스 1은 파랑입니다.
  • CharacterTeamHeadMaterials - 팀 게임용 캐릭터 머리 머티리얼에 사용할 머티리얼 배열입니다. 인덱스 0은 빨강, 인덱스 1은 파랑입니다.
  • PhysicsAsset – 생성된 캐릭터용 스켈레탈 메시의 물리 애셋에 대한 참조입니다.
  • AnimSets – 캐릭터에 사용되는 AnimSet 배열입니다.
  • ArmMeshPackageName – 이 캐릭터용 1인칭 팔 메시를 포함하는 패키지 이름입니다.
  • ArmMesh – 이 캐릭터용 1인칭 팔 메시에 대한 참조입니다.
  • ArmSkinPackageName – 1인칭 팔 메시용 머티리얼을 포함하는 패키지 이름입니다.
  • RedArmMaterial – 1인칭 암 메시용 빨강 팀 머티리얼에 대한 참조입니다.
  • BlueArmMaterial - 1인칭 암 메시용 파랑 팀 머티리얼에 대한 참조입니다.

이외에도 다른 프로퍼티가 UTFamilyInfo.uc 에 설명과 함께 게재되어 있습니다.

캐릭터용 프로퍼티를 설정하고 나면, 다음 디렉토리에 저장하십시오.

[YourUDKInstallationDirectory]/Development/Src/UTGame/Classes

UTPlayerReplicationInfo 클래스

이 경우, 현재 기본 클래스 대신 이 클래스를 사용하겠다고 UDK에 알려줘야 합니다. UTPlayerReplicationInfo.uc 파일 안의 기본 프로퍼티 블록을 통해 가능하며, 마지막 줄이 다음과 같을 것입니다:

CharClassInfo=class'UTGame.UTFamilyInfo_Liandri_Male'

새로 생성한 UTFamilyInfo 클래스 이름에 맞게 바꿔주기만 하면 됩니다. 즉 다음과 같습니다:

CharClassInfo=class'UTGame.UTFamilyInfo_SpaceMarine'

UTPlayerReplicationInfo.uc 스크립트를 저장하고, 스크립트를 리빌드합니다. 진심으로, 컴파일러가 에러를 뱉지 않고 게임에서 새 캐릭터를 테스트해 볼 수 있기를 바랍니다.

character.jpg