목차
State와 Switch를 사용하면 플레이어가 있는 지역에 따라서 음악을 바꾸는 등 음악적인 조건에 따라 변화를 주는 것이 가능합니다. 이에 더해 Game Parameter를 사용하면 폭포에 가까워질 때 하프 소리를 높이는 등 보다 세부적인 사항을 변경할 수 있습니다. Game Parameter는 대부분의 인게임 기능에 매핑할 수 있습니다. 그런 다음 어느 Music Track이나 Effect가 변경되어야 하는지 선택하면 됩니다.
Wwise의 경우 플레이어와의 Distance와 같은 몇 가지 내장 Game Parameter가 이미 제공되지만 이러한 Game Parameter는 보통 다이어제틱 (diegetic, 공간 안에 위치함) 사운드에 더 적합합니다. 하지만 Music은 보통 넌다이어제틱(non-diegetic, 게임 공간 밖)인 경우가 많습니다. Game Parameter를 환경에 있는 구성 요소로 직접 통합하는 한 가지 방법은 바로 사용자 정의 스크립트를 만들어서 Game Parameter를 게임의 기능에 매핑하는 것입니다. 그러면 게임에서 한 오브젝트의 위치 지정(positioning) 정보를 사용하여 다른 게임 오브젝트에 있는 위치 지정되지 않은 사운드에 알릴 수 있습니다.
다음 단계에서는 Waterfall에 스크립트를 추가해봅시다. 이 스크립트에서 Wwise-Type RTPC 프로퍼티를 만들고 Player와 Waterfall 간의 거리를 알려줍시다. 그런 다음 Game Parameter를 Woodlands 테마의 하프 Music Track에 할당해서 거리에 따라 하프 트랙의 볼륨을 변경해봅시다.
Wwise에 있는 Distance_to_Player Game Parameter는 Woodlands 1_Harp Music Track에 사용하지 마세요. 왜냐하면 Music_Region Event가 Waterfall_UpClose 게임 오브젝트에 게시되지 않기 때문입니다. |
-
Unity 메뉴에서 Audiokinetic > Certification > 301 > Lesson 8로 가서 Creating Diversity Using Game Parameters를 선택하세요.
Waterfall 게임 오브젝트의 크기가 꽤나 커서 중심점이 플레이어가 걸어다닐 수 있는 곳과 상당히 떨어져있기 때문에 실제 Waterfall로부터 Player의 거리를 재기에는 적합하지 않습니다.
대신 Waterfall 연못(Waterfall Up Close)의 바로 오른쪽에 하위 게임 오브젝트가 있는데, 이 오브젝트를 사용하면 거리를 측정할 지점을 정확하게 제어할 수 있습니다.
Pivot Point(게임 오브젝트의 중심)에서부터 Player의 거리를 계산해봅시다. Pivot Point의 위치는 Transform 컴포넌트에서 쉽게 알아낼 수 있습니다.
-
Hierarchy에서 Waterfall 게임 오브젝트를 펼치고 Waterfall_UpClose 게임 오브젝트를 선택하세요.
-
Inspector에서 Add Component를 클릭하고 New script로 가세요. SetRTPCToDistance라고 이름을 입력한 후 Create and Add를 선택한 후 스크립트를 여세요.
먼저 스크립트를 정리해봅시다. Game Parameter를 반복해서 설정해야 하기 때문에 Start() 함수가 필요 없으므로 이 함수를 지워봅시다.
-
Start(){} 함수와 위에 있는 // Use this for initialization 주석을 삭제하세요.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SetRTPCToDistance : MonoBehaviour { // Update is called once per frame. void Update () { } }
먼저 public Wwise-Type RTPC 프로퍼티를 만들고 GameParameter라고 이름을 지어줍시다.
-
SetRTPCToDistance 클래스 안에 public AK.Wwise.RTPC GameParameter;를 입력하세요.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SetRTPCToDistance : MonoBehaviour { public AK.Wwise.RTPC GameParameter; // Update is called once per frame. void Update () { } }
이 게임 오브젝트와 거리를 계산하려면 먼저 다른 게임 오브젝트의 Transform 컴포넌트에 대한 참조가 필요합니다. 이전 강의에서 본 것처럼 Transform 컴포넌트는 게임 오브젝트의 위치, 규모, 회전에 대한 정보를 담고 있어서 Unity가 Scene의 중심점으로부터 모든 게임 오브젝트를 알맞은 크기와 방향으로 배치할 수 있게 해줍니다. 위치를 추적하기 위해서 Transform 컴포넌트에는 Position이라는 Vector3 프로퍼티가 있습니다. 이 프로퍼티를 사용해서 Player와 Waterfall 간의 거리를 모니터링해봅시다.
Vector3 프로퍼티 타입은 소수점이 있는 숫자를 담습니다. 위치 지정을 사용할 때에 Vector3는 X, Y, Z 좌표를 표시합니다.
스크립트를 제작할 때는 다른 곳에 다시 사용할 수 있도록 최대한 일반적으로 만드는 것이 좋습니다. 이 점을 염두에 두고 Transform 타입의 public 프로퍼티를 만들어봅시다. 이 스크립트가 Waterfall_UpClose 게임 오브젝트에서 실행되기 때문에 거리를 계산할 때 해당 프로퍼티에서 Player 게임 오브젝트를 참조해야 합니다. 또한 OtherTransform 같이 프로퍼티를 잘 설명해주는 알맞은 이름을 지어주어야 합니다.
-
public Transform OtherTransform;을 입력하세요.
public class SetRTPCToDistance : MonoBehaviour { public AK.Wwise.RTPC GameParameter; public Transform OtherTransform;
RTPC와 Transform 프로퍼티를 사용하여 이제 Player와 Waterfall_UpClose Transforms 간의 거리를 계산하고 Game Parameter를 해당 거리로 설정할 수 있습니다.
두 개의 다른 게임 오브젝트에서 Transform의 Position 프로퍼티를 사용하면 Distance() 함수를 사용하여 두 오브젝트 간의 거리를 계산할 수 있습니다. 이 호출은 거리를 계속해서 업데이트해야 하기 때문에 Update() 함수에서 설정되어야 합니다.
-
Update() 함수 안에 Vector3.Distance();를 입력하세요.
// Update is called once per frame. void Update () { Vector3.Distance(); }
Vector3.Distance() 함수는 각 게임 오브젝트의 트랜스폼 위치를 필요로 합니다. Vector3 Position 프로퍼티를 가져오기 위해서 Transform 컴포넌트를 호출합시다.
-
Vector3.Distance() 함수 괄호 안에 OtherTransform.position을 입력하세요.
void Update () { Vector3.Distance(OtherTransform.position); }
이제 Waterfall_UpClose 게임 오브젝트의 트랜스폼을 참조해야 합니다. 또 다른 Vector3 프로퍼티를 함수로 보내려면 쉼표 ( ,)를 추가하고 다음 프로퍼티를 입력하세요.
-
OtherTransform.position 뒤에 쉼표 (,)를 추가하고 transform.position을 입력하세요.
Vector3.Distance(OtherTransform.position, transform.position);
이제 거리를 계산할 수 있게 되었지만 아직 결과를 저장하지 않았습니다. 이 거리를 저장하려면 float 변수로 설정해야 합니다. float 변수 타입을 사용하는 것은 아주 중요합니다. 그렇게 해야 소수점이 있는 값을 저장해서 RTPC의 전환을 매끄럽게 할 수 있습니다. 반면 int나 uint와 같은 변수 타입을 사용할 경우 소수점이 없는 숫자만 담을 수 있습니다. 이제 이름 ("distance"), 등호 (=), Vector3.Distance() 함수를 입력해서 Vector3.Distance()에서 반환된 결과를 float 변수 안에 저장할 수 있습니다.
-
Vector3.Distance() 함수 앞에 float distance =를 입력하세요.
float distance = Vector3.Distance(OtherTransform.position, transform.position);
변수 'float distance'를 Update 함수 밖으로 옮기고 distance 변수만 Update 안에서 설정하면 이 스크립트를 더욱 최적화할 수 있습니다. 이 변수를 Update 함수 전에 선언하면 매 프레임마다 새로운 함수를 만드는 것을 방지할 수 있습니다.
다음으로 게임 매개 변수를 거리 값으로 매핑해야 합니다. 다른 게임 오브젝트에서 게시되는 음악을 변경하려면 .SetGlobalValue() 함수를 사용해야 합니다.
-
float distance 변수 아래 새로운 줄을 추가하고 GameParameter.SetGlobalValue(distance);를 입력하세요.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SetRTPCToDistance : MonoBehaviour { public AK.Wwise.RTPC GameParameter; public Transform OtherTransform; // Update is called once per frame. void Update () { float distance = Vector3.Distance(OtherTransform.position, transform.position); GameParameter.SetGlobalValue(distance); } }
이제 필요한 모든 코드가 작성되었습니다. 다음으로 Inspector에서 프로퍼티를 할당해야 합니다.
-
Hierarchy 안에서 Waterfall_UpClose 게임 오브젝트가 선택되었는지 확인하세요.
-
Unity Inspector에서 SetRTPCToDistance의 Game Parameter 프로퍼티로 간 다음 Game Parameters > Gameplay를 펼쳐서 Music_WoodlandsHarp를 선택하세요.
이 OtherTransform 프로퍼티에 스크립트가 거리를 계산할 게임 오브젝트의 Transform 컴포넌트를 추가할 수 있습니다. 이 경우 Player 게임 오브젝트를 사용해야겠죠.
-
Hierarchy에서 Player 게임 오브젝트를 OtherTransform 프로퍼티 안으로 드래그하세요.
Play 모드를 시작하기 전에 Game Object Profiler가 Game Parameter를 모니터링하도록 설정한 후 게임에 연결해봅시다.
-
Wwise에서 Layouts으로 가서 Game Object Profiler를 선택하세요.
-
Game Sync Monitor에서 Browse For Object (...)버튼을 클릭하세요.
-
Project Explorer - Browser에서 Music_WoodlandsHarp를 선택하고 OK를 클릭하세요.
Music_WoodlandsHarp가 오브젝트 필터로 적용되어 이제 별도의 Game Parameter가 없어도 시간에 따른 변화를 확인할 수 있습니다.
-
게임에 연결하고 Play 모드를 시작하세요. Woodlands에 있는 Waterfall로 뛰어가세요.
Waterfall에 가까워지면서 Woodlands 테마의 하프 소리에 귀를 기울여보세요. 이제 Play 모드를 종료하세요.
폭포에 점점 가까워지면서 Woodlands 테마의 하프 소리가 더 커지는 것을 들으셨나요? Wwise에서 살펴봅시다.
Game Sync Monitor에 Waterfall_UpClose 게임 오브젝트에 있는 Music_WoodlandsHarp Game Parameter 값이 내려가는 것이 보이실 것입니다. 이 값은 거리를 말합니다. 그래서 Waterfall에 가까워지면서 원하는 결과가 실행되는 것을 알 수 있습니다. 이렇게 몇 줄의 코드만으로 플레이어의 행동에 따라 음악을 변경할 수 있게 되었습니다. 그리고 스크립트 재사용을 염두에 두고 제작했다면 Scene에 있는 여러 다른 오브젝트에 스크립트를 손쉽게 추가할 수 있습니다.
연결고리를 떠올리신 분도 계시겠지만 Game Parameter를 사용하여 음악을 제어하는 또 다른 예시로 이전 강의에서 다룬, 적 음악이 있습니다. 각 적 유형에는 Game Parameter가 할당되어 있으며 거리에 따라 해당 음악 레이어의 볼륨이 조정됩니다. 적 음악 Game Parameter 시스템은 조금 더 복잡하여 GameManager 스크립트에 직접 통합되어 있습니다. 이 시스템을 살펴보려면 Project 뷰 안에 'GameManager'를 입력하고 GameManager.cs 스크립트를 열어서 DistanceToEnemies() 코루틴(coroutine) 함수를 확인해보세요. |