사전 제작의 초기 단계에서 사운드 디자이너는 많은 시스템을 프로토타입화해야 하는데, 이를 도와줄 오디오 프로그래머가 없는 경우도 있죠.
다행히도 Wwise는 Unreal Engine 4나 Unity 3D 같이 최근 엔진을 같이 사용할 수 있어 이런 경우 많은 도움이 됩니다.
예를 들어 Unreal Engine 4는 사운드 디자이너가 프로그래머의 도움 없이 다양한 것을 할 수 있게 해주는 강력한 스크립팅 인터페이스를 제공합니다. Wwise의 강력한 작동 방식과 이 인터페이스를 함께 사용해보면 가장 애정하는 툴이 될 수밖에 없을 겁니다.
이 튜토리얼에서는 그룹 표면을 감지/관리하고 알맞은 발자국 소리를 재생하는 법을 설명합니다.
여기 나오는 설명은 다음을 기반으로 제작되었습니다.
- Audiokinetic의 Wwise 2016.1: Switch Group, RTPC, RTPC로 제어하는 Switch, Random Container (랜덤 컨테이너)
- Unreal Engine 4.12.5: Blueprint, Surface & Physical Materials, AkEvent Notify, Set Switch, Set RTPC
- Unity 3D 5.1
- Unreal과 Unity 스토어에서 제공하는 무료 에셋
Wwise
이 구조는 엔진이 감지한 여러 지표면 머터리얼에 따라 발자국 소리를 재생할 수 있도록 Unreal과 Unity에서 완전히 동일하게 구성되었습니다.
Game Sync
- Game Syncs에 Material이라는 새로운 Switch Group을 만드세요.
- Switch Group 아래 Concrete, Grass, Tiles, Wood라는 4개의 Switch를 만드세요.
Switch는 '게임 오브젝트 기반'이기 때문에 플레이어 발자국 소리뿐만 아니라 다른 상황에서도 쓸 수 있습니다. 총의 타격음이나 NPC 발자국 소리와 같이 사용하는 게임 오브젝트에 따라 서로 다른 값을 가질 수 있습니다. 그렇기 때문에 물리적 표면을 관리하는 데는 '전역적'인 State를 사용할 수 없습니다.
전역적 구조 (오디오 / Event / Switch 지정)
- (1) FS_Pawn이라는 새로운 Switch Container를 만드세요.
- (2) Walk_Concrete, Walk_Grass, Walk_Tiles, Walk_Wood에 각각 Random Container를 만드세요.
- (3) 이 컨테이너와 머터리얼에 따라 오디오 파일을 모두 가져오세요.
- (4) Switch Container를 클릭하고 이전에 만든 Switch를 설정하세요.
Group: Material
Default Switch/State: Concrete
이렇게 기본값을 설정하면 엔진이 Wwise에 없는 표면 이름을 전송할 경우
기본적으로 Concrete가 재생됩니다 (none으로 설정할 경우 아무것도 재생되지 않습니다).
- (5) 이제 Assigned Objects에 Contents Editor에서 각 Random Container를 각 Switch로 드래그하여 놓으세요.
- (6) Switch Container FS_Pawn에서 Play_FS_Pawn이라는 새로운 Play Event를 만드세요.
- (7) Transport Control이나 Soundcaster Session에서 Event를 시험하고 Material을 바꿔볼 수 있습니다.
Unreal Engine 4
프로젝트 설정
- (1) Project Settings를 열고 Engine>Physics>Physical Surface로 가세요.
- (2) Concrete, Grass, Wood, Tiles라는 4 개의 새로운 Surface Type을 추가하세요 (Wwise에서 만든 것과 동일한 이름).
Physical Material 설정
- (1) 콘텐츠 브라우저에 PM_Concrete, PM_Grass, PM_Tiles, PM_Wood라는 4개의 새로운 Physical Material을 만드세요.
- (2) 각 Physical Material을 열고 알맞은 Surface Type을 지정하세요.
Material 설정
- 맵에 사용되는 각 Material을 열고 PM_Concrete, PM_Grass, PM_Tiles, PM_Wood에 각각 알맞은 Physical Material을 설정하세요.
- 맵 개요
Animation Sequence
- Animation Sequence를 여세요. 이 곳에서 AkEvent 발자국 소리를 트리거하게 됩니다.
- (1) 타임라인에서 원하는 위치에 notify AkEvent를 추가하세요.
- (2) Anim Notify에서 Wwise 프로젝트에서 만들었던 Wwise AkEvent Play_FS_Pawn을 선택하세요.
Blueprint
- 이 Blueprint는 Unreal이 캐릭터가 걷게 될 여러 가지 머터리얼을 '식별'하고 알맞은 Switch를 Wwise로 전송하는 곳입니다.
- 콘텐츠 브라우저에서 BP_Wwise_Footsteps라는 새로운 Blueprint Class (Actor Component Class)를 만드세요.
- Blueprint를 열고 스크립트 작성을 시작하세요. 작성이 끝나면 다음과 같은 모습이 됩니다!
스크립팅의 각 부분을 더 자세히 살펴봅시다.
- (1) Blueprint는 틱(tick)을 기본으로 하며 (매 프레임마다 업데이트됨) 플레이어의 위치를 취합니다.
- (2) LineTraceByChannel 상자는 기본적으로 처음과 끝 입력으로 생긴 레이 트레이스 (ray-trace, Z 값은 폰에 따라 변경됨)입니다. 게임에서 레이 트레이스를 눈으로 확인하려면 Draw Debug Type을 'For One Frame'으로 변경하세요. 그러면 캐릭터 아래 빨간 선이 나타나며 레이 트레이스가 바닥과 충돌할 경우 맨 아래에 상자가 나타납니다.
- (3) 첫 번째 Branch 상자는 LineTraceByChannel에 반환 값이 있는지를 확인합니다.
두 번째 상자는 캐릭터가 새로운 Surface Type을 걷지 않을 경우 Blueprint가 Wwise에 Switch를 전송하지 않게 합니다. 이 부분이 없다면 각 틱마다 Wwise가 Switch를 무제한으로 수신하겠죠!
Get Surface Type 상자는 Project Settings에 연결된 Enum을 반환합니다.
이 변수를 받고 설정하려면 CurrentSurfaceType이라는 새로운 변수를 만들고 유형을 EPhysical Surface로 설정하세요.
- (4) 이전에 말했듯이 Wwise Switch는 '게임 오브젝트를 기반'으로 합니다. 여기 나온 예시에서는 Animation Sequence에 게시된 AkEvent가 메시(mesh)에 연결된 Ak Component를 만듭니다. 그렇기 때문에 캐릭터 자체가 아니라 이 Ak Component에 Set Switch를 보내야 해요.
- (5) 이 상자는 해당 문자열을 Surface Type Enum (Concrete, Grass, …)으로 반환합니다.
- (6) 이제 캐릭터가 걷고 있는 Current Surface Type을 Wwise로 전송할 Set Switch 상자를 제공할 수 있어요!
Target: AkEvent가 게시된 메시에서 Ak Component를 가져오세요.
Switch Group: Material (Wwise 세션에서 설정된 스위치 그룹과 동일)
Switch State: Unreal에서 정의한 Surface Type
Print String 상자는 디버깅만을 목적으로 Unreal Screen에서 Current Surface Type을 표시합니다.
- Blueprint를 컴파일하고, 저장한 다음, 캐릭터에 컴포넌트로 추가하세요.
- Wwise를 Unreal에 연결하면 Profiler 레이아웃의 Capture Log 뷰에서 Switch를 확인할 수 있습니다.
한 걸음 더 나아가기
Wwise가 제공하는 정말 멋진 기능 중 하나는 Switch를 RTPC로 완전히 제어할 수 있다는 점입니다. 다시 말해 RTPC로 전송되는 값에 따라 Switch를 변경할 수 있어요!
이 기능은 지금 예시에서 특히 굉장히 유용합니다. 왜냐하면 이 기능을 사용해서 캐릭터의 속도에 따라 Walk와 Run 사이로 발자국 소리를 전환할 것이기 때문이죠.
UE4에서 Pawn의 Animation Blueprint를 열고 'Update Animation Event'의 끝에 Set RTPC 상자를 만드세요 (틱 기반).
- Target: Ak Event Notify가 게시되는 Ak Component를 가져와야 합니다.
- RTPC: Pawn_Speed
- Value: Get Speed (속도 기반)
RTPC로 제어되는 Switch 만들기
- FS_Type이라는 새로운 Switch Group을 만들고 Switch 값을 Walk 와 Run으로 지정하세요.
- Pawn_Speed라는 RTPC를 만드세요.
Min = 0 (캐릭터가 움직이지 않을 경우)
Max = 300 (최대 속도)
Default = 0
- 제 경우 0 ≤ Walk Speed < 250 ≤ Run Speed ≤ 300라는 것을 알았습니다 (이 속도는 Wwise를 Unreal에 연결하고 캐릭터로 전송되는 RTPC를 프로파일링하여 추적할 수 있습니다).
- Use Game Parameter를 활성화하고 이렇게 '계단'을 만들어서 Pawn_Speed RTPC를 FS_Type Switch에 연결하세요.
이제 Switch가 게임에서 전송되는 RTPC 값으로 제어됩니다.
- 0 < Pawn_Speed ≤ 250일 경우 Walk로 전환
- 250 < Pawn_Speed ≤ 300일 경우 Run으로 전환
- 계층 구조에 Run Assets 오디오 파일을 모두 가져오고 FS_Type에 따라 새로운 Switch Container를 만드세요. 이 컨테이너에는 Material에 따라 두 개의 Switch Container가 담깁니다. 즉, 다음과 같은 모습이 되겠죠. (브래들리 메이어의 방법을 사용하면 쉽고 빠르게 작업할 수 있습니다).
- 이제 SoundBank를 빌드하고, 플레이해보세요!
Unity 3D
Tag 설정하기
- 맵에서 액터를 클릭하고 Inspector 창으로 가세요.
- Tag 드롭 다운 상자를 클릭해 Add Tag…를 선택하세요.
- 이 창에 Wood, Concrete, Grass, Tiles 값을 추가하세요.
지표면 설정
- 플레이어가 걸을 수 있는 각 지표면/오브젝트에 대해 Inspector 창에서 Collider에 알맞은 Tag를 지정하세요.
- 가끔 Collider가 메시에 내장되지 않을 수 있기 때문에 메시뿐만이 아니라 Collider에 Tag를 반드시 설정해야 합니다.
C# 코드
- 이 C# 코드를 프로젝트의 Character Controller 스크립트에 추가하세요.
- 변수 선언:
- 주요 스크립트:
이 글이 조금이나마 도움이 되었기를 바라며, 앞으로도 Audiokinetic 블로그에 더 많은 게임 오디오 정보를 공유할 수 있기를 기대합니다!
댓글