8 개의 강의

목차

Game Parameter를 사용해서 다양성 창출하기

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 게임 오브젝트에 게시되지 않기 때문입니다.

  1. Unity 메뉴에서 Audiokinetic > Certification > 301 > Lesson 8로 가서 Creating Diversity using Game Parameters를 선택하세요.

    Waterfall 게임 오브젝트의 크기가 꽤나 커서 중심점이 플레이어가 걸어다닐 수 있는 곳과 상당히 떨어져있기 때문에 실제 Waterfall로부터 Player의 거리를 재기에는 적합하지 않습니다.

    대신 Waterfall 연못(Waterfall Up Close)의 바로 오른쪽에 하위 게임 오브젝트가 있는데, 이 오브젝트를 사용하면 거리를 측정할 지점을 정확하게 제어할 수 있습니다.

    [작은 정보]

    Pivot Point(게임 오브젝트의 중심)에서부터 Player의 거리를 계산해봅시다. Pivot Point의 위치는 Transform 컴포넌트에서 쉽게 알아낼 수 있습니다.

  2. Hierarchy에서 Waterfall 게임 오브젝트를 펼치고 Waterfall_UpClose 게임 오브젝트를 선택하세요.

  3. Inspector에서 Add Component를 클릭하고 New script로 가세요. SetRTPCToDistance라고 이름을 입력한 후 Create and Add를 선택한 후 스크립트를 여세요.

    먼저 스크립트를 정리해봅시다. Game Parameter를 반복해서 설정해야 하기 때문에 Start() 함수가 필요 없으므로 이 함수를 지워봅시다.

  4. 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라고 이름을 지어줍시다.

  5. 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 같이 프로퍼티를 잘 설명해주는 알맞은 이름을 지어주어야 합니다.

  6. 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() 함수에서 설정되어야 합니다.

  7. Update() 함수 안에 Vector3.Distance();를 입력하세요.

    // Update is called once per frame.
    void Update () {
        Vector3.Distance();
    }

    Vector3.Distance() 함수는 각 게임 오브젝트의 트랜스폼 위치를 필요로 합니다. Vector3 Position 프로퍼티를 가져오기 위해서 Transform 컴포넌트를 호출합시다.

  8. Vector3.Distance() 함수 괄호 안에 OtherTransform.position을 입력하세요.

    void Update () {
        Vector3.Distance(OtherTransform.position);
    }

    이제 Waterfall_UpClose 게임 오브젝트의 트랜스폼을 참조해야 합니다. 또 다른 Vector3 프로퍼티를 함수로 보내려면 쉼표 ( ,)를 추가하고 다음 프로퍼티를 입력하세요.

  9. OtherTransform.position 뒤에 쉼표 (,)를 추가하고 transform.position을 입력하세요.

    Vector3.Distance(OtherTransform.position, transform.position); 
     

    이제 거리를 계산할 수 있게 되었지만 아직 결과를 저장하지 않았습니다. 이 거리를 저장하려면 float 변수로 설정해야 합니다. float 변수 타입을 사용하는 것은 아주 중요합니다. 그렇게 해야 소수점이 있는 값을 저장해서 RTPC의 전환을 매끄럽게 할 수 있습니다. 반면 int나 uint와 같은 변수 타입을 사용할 경우 소수점이 없는 숫자만 담을 수 있습니다. 이제 이름 ("distance"), 등호 (=), Vector3.Distance() 함수를 입력해서 Vector3.Distance()에서 반환된 결과를 float 변수 안에 저장할 수 있습니다.

  10. Vector3.Distance() 함수 앞에 float distance =를 입력하세요.

    float distance = Vector3.Distance(OtherTransform.position, transform.position); 
     

    [작은 정보]

    변수 'float distance'를 Update 함수 밖으로 옮기고 distance 변수만 Update 안에서 설정하면 이 스크립트를 더욱 최적화할 수 있습니다. 이 변수를 Update 함수 전에 선언하면 매 프레임마다 새로운 함수를 만드는 것을 방지할 수 있습니다.

    다음으로 게임 매개 변수를 거리 값으로 매핑해야 합니다. 다른 게임 오브젝트에서 게시되는 음악을 변경하려면 .SetGlobalValue() 함수를 사용해야 합니다.

  11. 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에서 프로퍼티를 할당해야 합니다.

  12. Hierarchy 안에서 Waterfall_UpClose 게임 오브젝트가 선택되었는지 확인하세요.

  13. Unity Inspector에서 SetRTPCToDistance의 Game Parameter 프로퍼티로 간 다음 Game Parameters > Gameplay를 펼쳐서 Music_WoodlandsHarp를 선택하세요.

    이 OtherTransform 프로퍼티에 스크립트가 거리를 계산할 게임 오브젝트의 Transform 컴포넌트를 추가할 수 있습니다. 이 경우 Player 게임 오브젝트를 사용해야겠죠.

  14. Hierarchy에서 Player 게임 오브젝트를 OtherTransform 프로퍼티 안으로 드래그하세요.

    Play 모드를 시작하기 전에 Game Object Profiler가 Game Parameter를 모니터링하도록 설정한 후 게임에 연결해봅시다.

  15. Wwise에서 Layouts으로 가서 Game Object Profiler를 선택하세요.

  16. Game Sync Monitor에서 Add…를 클릭하세요.

  17. Project Explorer - Browser에서 Gameplay를 펼치고 Music_WoodlandsHarp를 더블 클릭하세요.

    이제 Game Parameter를 선택했으니 게임 오브젝트를 추가해봅시다. Music_WoodlandsHarp는 Waterfall_Up_Close 게임 오브젝트에서만 사용되기 때문에 Game Parameter를 Global 범위로 모니터링할 수 있습니다.

  18. Game Object Explorer의 Watches 탭에서 선택 버튼을 눌러 Global Game Object를 선택하세요.

    이제 Game Object Profiler가 준비되었습니다.

  19. 게임에 연결하고 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) 함수를 확인해보세요.