대사 | Wwise와 Unity에서의 나레이션

Wwise에 대한 팁과 도구

현대 게임의 필수 요소 중 하나인 보이스오버 대사는 플레이어가 캐릭터를 특정 목소리와 연관지을 수 있을 뿐만 아니라 전반적인 억양을 통해 캐릭터의 감정을 더 잘 이해할 수 있게 해줍니다. 이 대사는 플레이어의 말이나 행동에 따라 캐릭터가 무엇을 어떻게 말할지를 변경하는 복잡한 대사 시스템을 통해 더욱 향상됩니다. 

플레이어가 과거에 도움을 준 적이 있던 캐릭터에게는 더 상냥하게 대한다거나 자신의 도덕적인 지침에서 심하게 벗어난 행동을 할 경우에는 더 공격적으로 대할 수 있죠. 이 시스템은 동적 대화라고 불립니다.

이 글에서는 나레이션 중심 대화를 중심으로 Wwise와 Unity를 사용하여 저희가 대사를 구현한 방법을 보여드리려고 합니다. Wwise에는 게임에 동적 대사를 구현할 수 있는 기능이 있지만, 일단 지금은 Wwise 대체 시스템을 사용해서 대화 시스템을 구동해보겠습니다. 다음은 이 글을 통해 살펴볼 3가지 주요 영역입니다.

1. 플레이어의 결정에 상관 없이 바뀌지 않는 시퀀스 컨테이너를 사용한 기본 나레이션.

2. 여러 언어로 게임을 설계하는 사용자를 위한 Wwise의 현지화 시스템.

3. 플레이어의 영향을 받는 변수를 기반으로 변경되는 스위치 컨테이너를 사용한 동적 나레이션.

이 데모는 Wwise의 시퀀스 및 스위치 컨테이너뿐만 아니라 이벤트 전송, 딜레이, 스위치, 상태 변경 등 Wwise에 관련된 Unreal Engine 블루프린팅도 배울 수 있게 해줍니다.

Wwise – 시퀀스 컨테이너를 사용한 나레이션과 현지화

첫 번째로 지휘관이 플레이어에게 지시를 내리는 보이스오버를 설계해봅시다. 이 지시는 5개의 보이스 오버로 나눠지며 하나씩 차례대로 재생되도록 프로그래밍해야 합니다.

1. “Hello? Hello? Can you hear me? (여보세요? 여보세요? 제 목소리가 들리십니까?)”

2. “Oh good. Listen, I need you to do something very, very important for me. (아, 다행이군요. 자, 당신에게 아주 아주 중요한 임무가 있습니다.)”

3. “In front of you are these little... obstacles that I need you to overcome. (앞에 보이는 이 작은... 장애물들을 지나가야 합니다.)”

4. “I just need you to jump over the hurdle, go under the archway, and to the green path. Not the red one. That would be bad. (허들을 뛰어 넘고 아치형 입구 밑으로 들어간 다음 초록색 길을 따라가주세요. 빨간색을 밟으면 안됩니다. 상황이 안 좋아질 겁니다.)”

5. “If you could do that for me, that would greatly help us over here in corporate. Over and out. (이를 따라주신다면 여기 있는 저희에게 큰 도움이 될겁니다. 그럼 이만, 오버.)”

어떤 상황이 벌어지든 간에 이 나레이션은 절대 변경되지 않고 게임의 시작 부분에서 완전히 똑같이 재생됩니다. 그렇기 때문에 Sequence Container를 사용해서 아무 변경 없이 각 오디오 트랙이 차례로 재생되도록 할 수 있죠. 뿐만 아니라 Wwise의 현지화 시스템을 사용해서 플레이어의 환경 설정에 따라 오디오를 영어나 스페인어로 재생시키는 법도 살펴봅시다.

먼저 Audio 탭으로 가세요. Actor-Mixer Hierarchy 아래 MissionBriefing이라는 새로운 Sequence Container를 만드세요 (Ctrl + Shift + Alt + Q). 그리고 이 Sequence Container 아래 오디오 파일을 업로드하세요. Sequence Container를 우클릭하고 'Import Audio Files...'(Shift + i)를 선택하거나 오디오 파일을 Sequence Container 안으로 드래그하면 됩니다.

Audio File Importer에서 'Import as:' 입력란을 'Sound SFX'에서 'Sound Voice'로 변경하세요. 그런 다음 'Import'를 누르세요.

image15

Sound Voice는 Sound SFX와 거의 같지만 Wwise 프로젝트에서 사용하는 모든 언어에 맞게 여러 오디오 파일을 가져올 수 있다는 점에서 다릅니다. 언어 설정이 변경되면 모든 Sound Voice는 해당 언어의 오디오 파일로 변경되죠.

이제 모든 영어 사운드 파일을 가져왔으니 Wwise 프로젝트에 다른 언어를 추가할 수 있도록 해봅시다. 상위 바에 있는 Project로 가서 Languages를 선택하세요 (혹은 Shift + J를 누르세요). Language Manager에서는 언어를 추가/제거하거나 이름을 변경할 뿐만 아니라 해당 언어의 모든 Sound Voice의 Gain을 변경할 수 있습니다. 여기서는 Add 버튼을 누르고 곧 뜨는 창에 Spanish를 입력하세요. 'Okay'를 누르고 곧바로 뜨는 경고 메시지에서 변경을 확인하세요.

image8

새로운 Sound Voice 중 하나를 선택하면 Contents Editor에 영어와 스페인어에 대해 각 섹션이 생긴 것이 보입니다. 이미 영어 오디오 파일은 가져왔으니 Contents Editor의 Spanish 입력란으로 스페인어 오디오 파일을 드래그해 가져와봅시다. 5개의 모든 나레이션 사운드에 이 작업을 실행하겠습니다.

image4

이 Sound Voice 중 하나를 재생하면 기본 언어로 들립니다. 하지만 Wwise의 상단 좌측 모서리에서 기본 언어를 Spanish로 변경한 후 다시 사운드를 재생하면 Spanish 입력란에 있는 사운드를 들을 수 있습니다. 이렇게 한 스위치만으로 개발자가 언어를 쉽게 변경할 수 있죠.

image1

이번엔 Sequence Container를 살펴보겠습니다. 컨테이너를 선택한 후에 Contents Editor와 바로 오른쪽에 있는 Playlist 섹션을 보세요. 기본적으로 Sequence Container는 안에 있는 모든 사운드 오브젝트를 재생하도록 설정되지 않습니다. Playlist 안에 있는 사운드 오브젝트만 재생하게 되죠. Sound Voice를 재생하고자 하는 순서대로 Contents Editor에서 Playlist로 드래그하세요.

사운드를 편집해야 할 것이 아니라면 여기서 모든 작업이 끝납니다. 이제 Events 탭으로 가서 Default Work Unit 안에 2개의 새로운 이벤트를 만들어보겠습니다. 

1. Play_MissionBriefing: Sequence Container를 재생할 'Play' 동작이 있는 이벤트.

2. Reset_MissionBriefing: Sequence Container의 재생 목록을 첫 번째 Sound Object로 재설정해줄 'Reset Playlist' 동작이 있는 이벤트.

참고: 이 데모는 동적 대사 시스템을 작업하지만 Events 탭의 Dynamic Dialogue 섹션을 사용하지는 않습니다.

두 번째 이벤트는 Narration을 재생할 때마다 항상 Sequence Container의 첫 번째 사운드가 재생되도록 보장해줍니다. 안전 장치라고 할 수 있죠.

image20

이제 사운드뱅크를 만들고 이 2개의 이벤트를 추가하면 됩니다. 상단 바에 있는 'Layouts'에서 Soundbank 레이아웃을 선택하거나 F7을 누르세요. Soundbank Manager에서 New를 선택하고 새로운 Soundbank를 만드세요. 저는 이 사운드뱅크를 Main이라고 하겠습니다.

Soundbank Manager에서 새로 만든 Soundbank를 선택하고 Play_MissionBriefing과 Reset_MissionBriefing 이벤트를 모두 Event Viewer에서 Soundbank Editor로 드래그하세요.

Soundbank Manager에서 새로운 사운드뱅크의 플랫폼(Windows, Mac 등)과 프로젝트에서 사용하는 언어의 체크 상자를 확인하세요. 마지막으로 'Generate Selected' 버튼을 누르세요.

image25

Wwise – 동적 대사

플레이어가 지휘관에게 임무를 받고 나면 임무를 수행할 시간이 주어집니다. 플레이어가 임무를 어떻게 완수하느냐에 따라 지휘관은 다른 반응을 보이게 되죠. 시작하기 전에 먼저 지휘관이 플레이어에게 할 말을 결정하는 변수를 매핑해봅시다. 먼저 플레이어에게 주어지는 3가지 목표를 살펴볼까요?

1. Go over the hurdle (허들 넘기).

2. Go under the archway (아치형 입구 아래로 지나가기).

3. Go onto the green path, not the red path (빨간색이 아닌 초록색 경로 따라가기).

이 특정 임무는 여러 방법으로 완수할 수 있습니다. 정확히 말하자면 5가지 방법으로 완수할 수 있죠.

1. 아무 것도 하지 않을 경우. (실패, 실패, 실패)

2. 허들만 넘을 경우. (통과, 실패, 실패)

3. 플레이어가 허들을 넘고 아치형 입구 아래를 통과할 경우. (통과, 통과, 실패)

4. 플레이어가 허들을 넘고, 아치형 입구 아래를 지나가고, 붉은 경로를 따라갈 경우 (통과, 통과, 빨간색)

5. 플레이어가 허들을 넘고, 아치형 입구 아래를 지나가고, 초록색 경로를 따라갈 경우 (통과, 통과, 초록색)

추적해야 할 변수는 허들, 아치형 입구, 경로로 총 3개입니다. 이제 스위치와 상태 작업을 할 준비가 되었죠.

여전히 Soundbank 레이아웃에 있을 경우 'Layouts -> Designer'를 선택하거나 F5를 눌러서 Designer 레이아웃으로 돌아가세요.

Project Explorer의 Game Syncs 탭으로 가서 Default Work Unit의 Switch 섹션 아래 Hurdle, Archway, Path라는 3개의 새로운 Switch Group을 만들어 봅시다. Hurdle과 Archway 스위치 그룹에 모두 Fail과 Pass라는 2개의 스위치를 만들어 봅시다. 그런 다음 Path 스위치 그룹에는 Fail, Red, Green이라는 3개의 스위치를 만들어 봅시다.

image2

Audio 탭으로 돌아가세요. Actor-Mixer Hierarchy에서 Default Work Unit 아래 새로운 Switch Container를 만드세요 (Ctrl + Shift + Alt + W). 저는 이 스위치 컨테이너의 이름을 MissionResult라고 하겠습니다. 

새로 만든 Switch Container를 선택하고 Property Editor의 오른쪽에 있는 'Switch' 설정을 보세요. 이 컨테이너에서는 먼저 Hurdle 시험을 통과했는지의 여부를 확인하게 됩니다. 시험에 실패했을 경우 지휘관의 실망스러운 오디오가 들리게 됩니다. 통과했을 경우에는 Archway 시험으로 넘어가게 되죠.

그러기 위해서 먼저 Switch Group을 Hurdle 그룹으로 설정하고 Default Switch/State를 Fail로 설정하세요. 그러면 Assigned Objects 섹션이 Pass와 Fail이라는 두 스위치로 구성됩니다. 여기에 올바른 '오브젝트'를 채워넣어야 합니다.

먼저 'Hurdle Failed' 조건의 새로운 오디오 파일을 MissionResult 스위치 컨테이너로 가져오세요. 그런 다음 MissionResult 컨테이너 안에 새로운 Switch Container를 만드세요. 저는 이 컨테이너를 Archway라고 하겠습니다.

이제 두 컨테이너를 모두 Contents Editor에서 각자 해당하는 Assigned Object로 옮기기만 하면 됩니다. 'Hurdle Failed'는 'Fail'로, 'Archway' 컨테이너는 'Pass'로 옮기세요.

image24

그럼 이제 Archway 스위치 컨테이너 안에서 이 과정을 반복해봅시다. Switch Group을 Archway 스위치 그룹으로 설정하고 Default Switch/State를 Fail로 설정하세요. 'Archway Failed' 오디오를 Archway 컨테이너로 가져오고 Path라는 또다른 스위치 컨테이너를 만드세요. 그런 다음 아까처럼 Assigned Objects로 옮기세요. 'Archway Failed'는 'Fail'로, 'Path' 컨테이너는 'Pass'로 옮기면 됩니다.

마지막으로 이 과정을 다시 한 번 반복해봅시다. 하지만 이번에는 스위치가 2개가 아닌 3개네요. Path 스위치 컨테이너 안에 Switch Group을 Path 스위치 그룹으로 설정하고 다시 한 번 Default Switch/State를 Fail로 설정하세요.

이제 마지막 3개의 오디오 파일인 Path Failed, Path Red, Path Green을 가져오기만 하면 됩니다. 3개의 파일을 각자 해당하는 Assigned Objects로 가져오세요.

image3

방금 끝낸 작업을 간단하게 되돌아봅시다. Hurdle 시험을 실패하면 나머지 스위치 컨테이너가 보이지 않고 그냥 실패 메시지가 재생됩니다. 통과할 경우 Archway 시험으로 넘어가죠. Archway 시험에 실패할 경우에는 Path 스위치 컨테이너가 보이지 않고 Archway 실패 메시지가 재생됩니다. Archway 시험을 통과하고 최종 Path 스위치 컨테이너로 넘어갈 경우 초록색이나 빨간색 경로를 따랐는지 혹은 아무 경로도 따르지 않았는지를 확인하게 되죠. 이 세 가지 조건은 모두 특정 오디오 파일을 재생하게 됩니다.

이렇게 작업을 모두 끝냈으니 이벤트를 만드는 것은 아주 간단합니다. Event 탭으로 가는 대신 Audio 탭에서 이벤트를 만들어봅시다. MissionResult 스위치 컨테이너를 우클릭한 다음 New Event에서 Play를 선택하세요. 그러면 Play_MissionResult라는 새로운 Play 이벤트가 자동으로 생성됩니다.

F7을 눌러 Soundbank 레이아웃으로 돌아가서 Play_MissionResult 이벤트를 Event Viewer에서 Soundbank Editor로 드래그하세요. 아까처럼 Soundbank를 생성하고 Wwise 프로젝트를 저장했는지 확인하세요.

Unity – 시퀀스 나레이션 통합하기

이제 Sequence Container에서 만든 나레이션을 통합해봅시다. 보통은 나레이션 오디오 파일을 차례대로 하나씩 다섯 번 재생하는 간단한 작업이죠. 하지만 한 세그먼트가 끝나서 다음 세그먼트를 재생할 준비가 되었다는 것을 어떻게 알 수 있을까요? 각 세그먼트 사이에 약간의 딜레이를 넣고 싶다면요? 이 두 기능은 모두 이벤트 콜백과 코루틴(coroutine)이라는 것을 통해 만들어낼 수 있습니다.

먼저 뱅크를 로드해봅시다. 먼저 계층 구조에서 WwiseGlobal 오브젝트를 선택하세요. Inspector에서 Add Component를 선택하고 AkBank를 검색하세요. 이 컴포넌트가 WwiseGlobal 안에 추가되면 여러분의 Soundbank를 ‘Name:’ 목록에서 선택하세요.

이제 새로운 스크립트를 만들어서 나레이션을 강화해봅시다. Hierarchy에서 우클릭하고 'Create Empty'를 선택해서 새로운 Empty Object를 만드세요. 새로운 오브젝트의 이름을 원하는대로 지정해 주세요. 저는 Narration이라고 하겠습니다. 인스펙터에서 'Add Component'를 누르고 검색란에 'Narration'을 입력한 후 'New Script'를 선택하세요. 그리고 'Create and Add'를 선택하세요. 이렇게 하면 새로운 스크립트가 생성되고 메인 Assets 폴더에 추가됩니다. 'Project' 탭에서 새로운 스크립트를 선택하세요.

image9 image12

이 스크립트의 주요 목적은 플레이어가 씬을 시작할 때 첫 번째 나레이션 오디오를 시작하고, 오디오가 끝난 후 약간의 딜레이 후에 다음 오디오를 재생하는 것입니다. 이 작업은 Sequence Container 안에 있는 모든 오브젝트를 재생할 때까지 계속해서 반복되죠.

먼저 Start 함수 바로 위에 있는 3개의 멤버 변수부터 시작해봅시다.

image7

1. Narration 이벤트는 우리가 Wwise에서 만든 Play_MissionBriefing 이벤트입니다. 이 이벤트를 Inspector에서 설정하려면 퍼블릭으로 만들어야 합니다. 스크립트를 완성한 후에 이 작업을 해봅시다.

2. Player 게임 오브젝트는 Unity에게 리스너의 위치를 알려줄 때 사용됩니다. 이 오브젝트도 퍼블릭으로 만들어서 Player 게임 오브젝트를 Inspector 안에서 설정할 수 있게 만들어야 합니다. 이 작업도 스크립트를 완성한 후에 실행합니다.

3. Narration 정수는 오디오 파일이 몇 개나 재생되었는지 스크립트에게 알려주는 데에 사용됩니다. 이 숫자가 5가 되면 스크립트는 더 이상 오디오 파일을 재생하지 않게 됩니다.

이 정수를 설정했으니 이제 스크립트를 정리하고 새로운 함수를 만들어보겠습니다. Update 함수를 삭제하세요. 이 함수는 필요하지 않습니다. 대신 그 자리에 새로운 PlayNarration 함수를 만들어봅시다.

이 함수 안에서 나레이션 오디오를 재생하기 전에 먼저 스크립트가 이미 시퀀스 컨테이너 안에 있는 모든 오디오 파일을 재생헀는지를 확인해야 합니다. 이 작업은 간단한 'if' 구문을 사용해서 실행됩니다. '이전에 5번 미만의 횟수만큼 오디오를 재생했을 경우 이 오디오를 재생하시오.' 코딩 용어에서는 나레이션 정수를 사용하게 됩니다.

image5

if 구문 안에 마침내 나레이션 오디오를 재생할 이벤트를 전송해보겠습니다. 먼저 narrationEvent.Post(player)
부터 시작해볼까요?
현재 이 이벤트는 플레이어에게 전달됩니다. 이 자체만으로는 문제가 없죠. 하지만 이 이벤트가 끝나면 다른 이벤트를 전송하려고 했던 것을 기억하시나요? 이 작업은 이벤트 콜백을 사용하여 실행됩니다. 스크립트의 해당 줄의 나머지 내용은 다음과 같습니다.

image6

AkCallbackType은 해당 이벤트에 사용할 콜백을 나타냅니다. 콜백의 종류는 여러가지이며 대부분 음악 이벤트를 참조하지만, 지금 이 콜백은 이벤트가 종료되는 시점을 추적해야 합니다.

AkCallbackType의 앞에 붙은 (uint)은 AkCallbackType의 결과를 한 값에서 uint으로 '캐스팅'해줍니다. 이 작업은 함수에서 요구하는 사항을 충족해주는 간단한 작업입니다. Callback 스크립트를 만들 때마다 사용하죠.

함수의 마지막 부분(NarrationEnd)은 Unity에게 '이 이벤트가 종료되면 이 함수를 재생하시오'라고 전해줍니다. 현재 이 함수가 존재하지 않기 때문에 NarrationEnd 아래 오류가 표시됩니다. 지금 이 함수를 만들어봅시다!

image10

NarrationEnd의 괄호 안에 있는 모든 오브젝트가 전부 필요합니다. 그 이유는 Event Callback 함수가 전송된 이벤트와 사용된 Callback의 종류 등의 정보를 NarrationEnd에게 전달하기 때문이죠. 이 데모에서는 해당 정보를 사용하지 않지만 여러분에게 필요할 경우 이 정보가 있다는 것을 알아두는 것이 좋습니다.

NarrationEnd 함수를 작업하기 전에 먼저 PlayNarration 함수에서 마지막으로 추가해야 할 것이 있습니다. narrationEvent.Post 바로 다음에 해당 줄을 추가하세요.

unnamed

숫자 변수 후에 ++를 추가하면 해당 변수를 1만큼 '증가'하게 됩니다.

이렇게 허들 하나를 넘었습니다. 이벤트가 전송되고 있고 이 이벤트가 종료된 후에 무언가를 하기를 기다리고 있죠. 이제 해당 이벤트가 종료되고 다음 나레이션 이벤트를 전송하기 전에 약간의 딜레이를 추가해야 합니다. 코루틴을 사용해서 이 작업을 실행해보겠습니다. NarrationEnd 함수 아래 새로운 함수를 만듭니다.

image11

- IEnumerator 함수(혹은 코루틴)은 함수를 실행하기 전에 배후에서 어느 정도 시간이 지날 수 있게 해줍니다. 특정 시간만큼 함수를 딜레이하는 데에 완벽하죠.

- Yield return new WaitForSeconds(1f)는 일시 정지 후 코드를 실행하기 전에 얼마나 기다려야 할지를 Unity에게 알려줍니다. 이 경우 Unity에게 1초만큼 기다리라고 해줍시다.

- 마지막으로 PlayNarration() 함수로 돌아가 반복하게 됩니다.

이 새로운 코루틴을 Narration End 함수 안에서 호출해봅시다. 이 작업은 대부분의 함수 호출과는 약간 다른 방법으로 실행됩니다.

StartCoroutine(Wait());

PlayNarration 함수로 돌아가면 Unity는 재생할 나레이션이 남아있는지를 확인합니다. 나레이션이 남아있을 경우 다음 나레이션을 재생하고 다시 해당 함수로 돌아가서 반복하게 되죠. 나레이션이 남아있지 않을 경우 반복을 멈추고 나레이션이 공식적으로 종료됩니다.

이 작업을 마무리하기 전에 먼저 몇 해야 할 작업이 몇 가지 더 있습니다. 다음 내용을 Start 함수에 추가하세요.

image14

이 부분은 PlayNarration() 반복을 시작하기 전에 Reset 이벤트를 게시해줍니다.

마지막으로 Unity로 돌아가 인스펙터에서 Narration 스크립트의 새로운 Narration Event와 Player 입력란을 추가해줘야 합니다.

image17

Play를 눌러서 작업을 확인하기 전에 먼저 작업 내용을 저장해 주세요. 원하는 결과가 아닐 경우 제 스크립트와 비교해 보세요.

image21

Unity – 미션 브리핑 통합하기

이제 플레이어가 미션 브리핑을 들었으니 미션을 실행해야 합니다. 게임은 플레이어가 정말로 허들을 넘고, 아치형 입구 아래를 지나가고, 초록색이나 빨간색 경로를 따라갔는지를 알아내야 합니다. 그렇게 하기 위해서 허들, 아치형 입구, 경로에 해당하는 상자 콜라이더를 만들어봅시다.

이 작업은 큐브 오브젝트를 만들어서 실행합니다. 계층 구조에서 우클릭해 ‘3D Object -> Cube’를 선택하고 4개의 새로운 Cube를 만들어주세요. 플레이어와 반드시 접촉하게 되는 허들 위에 큐브 하나를 배치하세요. 그리고 아치형 입구 아래에도 똑같이 해주세요. 마지막으로 나머지 두 큐브를 초록색과 빨간색 경로 바로 위에 배치해 주세요. 이동(Move, w키), 회전(Rotate, e키), 크기 조정(Scale, r키) 도구를 사용해서 큐브를 원하는대로 조정해 보세요.

image23

각 큐브에서 Mesh Renderer 컴포넌트의 왼쪽에 있는 체크 상자를 선택 해제해서 메쉬 렌더러를 반드시 비활성화해 주세요. 이렇게 하면 큐브가 보이지 않게 됩니다. 다음으로 Box Collider 컴포넌트로 가서 'Is Trigger' 체크 상자가 선택되었는지 확인하세요. 이 요소는 플레이어가 큐브를 통과하고 이벤트를 '트리거'할 수 있게 해줍니다.

Hurdle(허들)과 Archway(아치형 입구) 큐브의 경우 Inspector 아래에서 Add Component를 누르고 AkSwitch 스크립트를 검색해서 선택하세요. 그리고 두 큐브에도 모두 같은 작업을 실행하여 AkTriggerEnter 컴포넌트를 추가해 주세요.

먼저 AkSwitches에서 TriggerOn을 ‘AkTriggerEnter’로 변경하세요 (그리고 Start를 선택 해제하세요). 그리고 'Use Other Object' 체크 상자를 선택하세요. 이 상자를 활성화하면 스위치 변경을 트리거할 오브젝트를 지정할 수 있게 해줍니다. (이 경우 Ak Trigger Enter 컴포넌트에 있는 'Trigger Object') AkTriggerEnters에서 플레이어의 오브젝트를 Hierarchy에서 Trigger Object 입력란으로 드래그하세요. 

마지막으로 각 오브젝트에 알맞은 스위치 이름을 선택해 주세요. (Hurdle 오브젝트에는 'Hurdle / Pass', Archway 오브젝트에는 'Archway / Pass')

마지막 결과는 다음과 같습니다.

image22

플레이어가 큐브 안으로 들어가면 알맞은 AkSwitch가 트리거되어 스위치를 Fail에서 Pass로 변경해줍니다. 이 작업은 플레이어가 해당 트리거 오브젝트를 통과했을 경우에'만' 실행됩니다. 왜냐하면 AkTriggerEnter 컴포넌트에서 플레이어가 유일한 트리거 오브젝트로 설정되었기 떄문이죠.

이제 빨간색과 초록색 경로에 있는 큐브를 작업해봅시다. 이 콜라이더에는 조금 다른 작업을 실행해봅시다. 각 경로에 스위치를 설정하는 대신 플레이어가 이 경로 안으로 들어가자 마자 미션을 종료하도록 해봅시다. 그렇다면 새로운 스크립트가 필요하겠죠.

경로 중 하나의 Inspector로 가서 새로운 Component를 만드세요. 스크립트의 이름을 입력하고 (예: ‘MissionEnd’), New Script를 선택한 후, Create and Add를 선택하세요. 나머지 경로에도 해당 스크립트를 추가해 주세요.

이 새로운 스크립트에는 2개의 새로운 멤버 변수를 추가해봅시다.

image16

- bool은 어떤 것이 true 또는 false인지를 확인해줍니다. 이 경우 미션이 완료되었는지의 여부를 추적해야겠죠.

- 스크립트를 완료한 후 Inspector에서 설정하게 될 Wwise Switch는 플레이어가 선택하는 경로에 따라 Path 스위치 그룹을 Red나 Green으로 변경하게 됩니다.

다음으로 Start와 Update 함수를 모두 삭제하세요. 대신 그 자리에 다음 실행이 담긴 새로운 함수를 추가하세요.

image19

- OnTriggerEnter는 (콜라이더가 있는) 무언가가 오브젝트의 트리거 영역을 통과했는지의 여부를 확인해주는 Unity 전용 함수입니다. 통과했을 경우 이 함수는 'other' 변수를 사용하여 이 트리거 오브젝트를 계속해서 추적합니다.

- 그런 다음 미션이 완료되지 '않았는지를' 확인합니다. 완료되지 않았을 경우 Mission Complete 변수는 true로 설정됩니다. 이렇게 하면 해당 스크립트가 한 번만 재생되도록 해줍니다.

- 그 다음에는 플레이어가 선택한 경로에 따라 Switch 값을 Red나 Green으로 변경합니다.

- 마지막으로 'Play_MissionResult' 이벤트를 'other.gameObject'(이 경우 플레이어)에 전달합니다.

Unity로 돌아가서 빨간색과 초록색 경로의 콜라이더의 인스펙터로 가세요. Red 경로에 'Path / Red' 스위치가 설정되어 있고 Green 경로에 'Path / Green' 스위치가 설정되었는지 확인해 주세요. 작업 결과를 시험해 보세요. 미션 브리핑을 들은 후에 빨간색이나 초록색 경로로 가서 미션을 완료하세요.

지금까지는 게임에서 잘 작동하고 있습니다. 하지만 한 가지 문제가 있습니다. 현재 게임은 플레이어가 초록색이나 빨간색 경로를 따라갈 경우에 해당하는 두 가지 엔딩만 존재합니다. 그럼 Wwise에서 설정한 3가지 엔딩은 어떻게 하죠?

이를 수정하기 위해서 초기 나레이션이 끝난 후에 5초의 타이머를 만들어봅시다. 플레이어가 경로로 가기 전에 5초 타이머가 끝나면 미션이 자동으로 실패하며 플레이어가 완료한 정도에 따라 Mission Result 나레이션이 재생됩니다. 이 작업은 첫 번째 Unity 섹션에서 만들었던 Narration 스크립트를 사용하여 실행할 수 있습니다.

Narration 스크립트를 열고 새로운 코루틴을 만드세요.

image18

- 첫 번째 코루틴과 마찬가지로 이 스크립트의 함수를 어느 정도 늦춰봅시다. 이번에는 5초 동안 일시 정지해보겠습니다.

- 그런 다음 MissionEnd 스크립트에 있는 MissionComplete 변수를 참조해봅시다 (그러기 위해서는 Mission Complete 변수가 퍼블릭 고정 멤버 변수여야 합니다). 먼저 플레이어가 두 경로 중 하나로 이동하여 미션이 아직 완료되지 않았는지 확인합니다.

- 플레이어가 아직 미션을 완수하지 '않았다면' MissionComplete 변수를 true로 설정하여 미션이 이제 끝났음을 표시합니다. 이렇게 하면 플레이어가 5초 타이머가 끝난 후에 플레이어가 다시 미션을 완수하지 못하도록 해줍니다.

- 마지막으로 플레이어에서 MissionResult를 재생합니다.

마지막으로 PlayNarration() 함수의 끝에 StartCoroutine(Wait2())를 추가해야 합니다. 이제 작업 내용을 저장하고 시험해 보세요. 5가지 시나리오를 모두 시험해보고 다 올바르게 작동하는지 확인해 보세요. 올바르게 작동하지 않을 경우 놓친 것이 없는지 작업을 확인해 보세요. 모두 올바르게 작동하나요? 축하드립니다! 성공적으로 작동하는 동적 대사 시스템이 완성되었습니다.

다음 주에는 Wwise와 Unreal을 사용하여 대사를 구현하는 방법에 대해 살펴보겠습니다. 기대해 주세요!

Jake Gamelin (제이크 겜린)

작곡가 | 강사 | 사운드 디자이너

Jake Gamelin (제이크 겜린)

작곡가 | 강사 | 사운드 디자이너

저는 미국 남부 캘리포니아에 살고 있는 작곡가이자 강사이며, 기술 사운드 디자이너입니다. 샌디에이고 주립대학교(San Diego State University)에서 음악 공부를 마치고, 소규모 비디오 게임 프로젝트에서 작업하며 상호작용 사운드 디자인과 음악을 배우며 동시에 가르치고 있습니다. 사운드 아티스트로서 제 스스로의 역량을 높이고 게임 오디오 분야에서 일하고 싶어하는 젊은이들을 양성하는 데 힘을 쏟고 있습니다.

https://www.jakegamelin.com/

Jake's YouTube Channel

 @CharaComposer

댓글

이 가람

May 15, 2023 at 12:41 pm

유니티에서 언어의 변경은 어떻게 구현해야 되나요?

댓글 달기

이메일 주소는 공개되지 않습니다.

다른 글

Wwise 2022.1 새로운 기능

Wwise 2022.1이 출시되었으며 Audiokinetic 런처를 통해 다운받으실 수 있습니다. 이 버전이 제공하는 새로운 기능을 간략하게 소개해드리려고 합니다....

16.11.2022 - 작성자: Audiokinetic (오디오키네틱)

Wwise 2022.1에서의 SDK 런타임 성능 개선

이 글에서는 Wwise 2022.1의 런타임에서 CPU 사용량에 대한 몇 가지 개선 사항을 살펴보게...

5.12.2022 - 작성자: 데이비드 크룩스 (David Crooks)

Wwise Spatial Audio 2023.1의 새로운 기능 | 개선된 Aux Send Model

Wwise 2023.1에서 새로 제공되는 수많은 기능의 목록을 살펴보셨다면 아마 '개선된 Aux Send Model'이라는 흥미로운 문구를 발견하셨을 겁니다. 도대체 이게 무슨...

14.12.2023 - 작성자: Nathan Harris

AudioLink로 떠나는 여행

지난 10월 게임사운드콘(GameSoundCon)에서 저는 호텔 근처 고급 샌드위치 가게에서 데미안(Damian)과 점심을 먹고 있었습니다. 예상하셨겠지만 저희는 오디오 기술에...

10.6.2024 - 작성자: 피터 "pdx" 드레셔 (Peter "pdx" Drescher)

Unreal Engine에서 Wwise 사운드를 재생하는 방법

Wwise에는 수많은 기능이 있습니다. 하지만 개발 초기에는 사용법에 대한 충분한 정보가 없을 경우 제대로 작동하지 않을 수 있죠. 저는 초기의 몇 가지 삐걱거림 때문에...

30.7.2024 - 작성자: 히로시 고다 (Hiroshi Goda)

Unreal Engine에서 AudioLink를 사용하는 방법

소개 이 글에서는 Unreal Engine의 AudioLink를 집중적으로 살펴보려고 합니다.이 작업은 다음 버전을 사용하여 검토되었습니다....

15.8.2024 - 작성자: 히로시 고다 (Hiroshi Goda)

다른 글

Wwise 2022.1 새로운 기능

Wwise 2022.1이 출시되었으며 Audiokinetic 런처를 통해 다운받으실 수 있습니다. 이 버전이 제공하는 새로운 기능을 간략하게 소개해드리려고 합니다....

Wwise 2022.1에서의 SDK 런타임 성능 개선

이 글에서는 Wwise 2022.1의 런타임에서 CPU 사용량에 대한 몇 가지 개선 사항을 살펴보게...

Wwise Spatial Audio 2023.1의 새로운 기능 | 개선된 Aux Send Model

Wwise 2023.1에서 새로 제공되는 수많은 기능의 목록을 살펴보셨다면 아마 '개선된 Aux Send Model'이라는 흥미로운 문구를 발견하셨을 겁니다. 도대체 이게 무슨...