7 개의 강의

목차

Wwise-Type Event에서의 콜백

AkEvent와 AkAmbient 컴포넌트에서 콜백을 활성화할 수 있지만 Wwise-Type Event에서도 콜백을 활성화할 수 있습니다. 그러기 위해서는 동일한 유형의 정보가 필요합니다 (Callback Function과 Callback Flag). 하지만 사용자 정의 스크립트에서 콜백을 활성화하면 게임 오브젝트의 특정 인스턴스가 아닌 특정 게임 메카닉이나 오브젝트 타입에 맞춰 콜백을 조정할 수 있습니다. 사용자 정의 스크립트를 사용하면 만일의 사태를 대비할 수 있습니다. 한 가지 예로 Wwise Adventure Game의 Environment Scene 중 하나에서 참조되는 게임 오브젝트가 언로드되어 오브젝트를 사용할 수 없을 경우를 들어봅시다. 이전 섹션에서는 Music_Region Event의 MusicSyncBar에서의 콜백을 사용해서 Tree의 규모를 조정하는 RhythmActions 스크립트를 호출했습니다. AkEvent 컴포넌트를 사용하여 콜백을 설정하면 스크립트를 작성할 필요 없이 쉽게 드래그할 수 있기 때문에 선택된 몇 가지 게임 오브젝트에 사용하기 적합합니다. 하지만 필요한 콜백에 따라 사용자 정의 스크립트를 작성하면 에셋이 늘어날 때 AkEvent 컴포넌트 안에 콜백 항목을 길게 작성하지 않아도 된다는 장점이 있습니다. 이 실습에서는 콜백 알림(callback notification)이 오면 여러 가지 환경 게임 오브젝트의 크기를 변경하게끔 해보겠습니다. 먼저 Wwise-Type Event 프로퍼티를 사용하여 스크립트에서 Music_Region Event를 게시해봅시다. 그런 다음 Callback 함수가 들어가도록 스크립트를 확장한 후 RhythmActions 스크립트를 사용하여 Scene에서 다양한 게임 오브젝트를 호출해봅시다.

  1. Unity 메뉴에서 Audiokinetic > Certification > 301 > Lesson 7으로 간 후 Callbacks on a Wwise-Type Event를 선택하세요.

    먼저 스크립트를 만든 다음 Wwise-Type Event 프로퍼티를 만듭시다.

  2. Hierarchy에서 Wwise 게임 오브젝트를 선택하세요.

  3. Inspector에서 Add Component를 클릭하고 PostMusic을 검색하세요. New Script로 가서 Create and Add를 클릭하세요.

  4. PostMusic 스크립트를 더블 클릭해서 여세요.

    먼저 Wwise-Type Event 클래스를 사용해서 Event를 만들고 게시해야 합니다.

  5. PostMusic 스크립트 안이면서 함수의 바깥인 부분에 public Ak.Wwise.Event를 입력해서 퍼블릭 Wwise-Type Event를 선언하세요.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
        
    public class PostMusic : MonoBehaviour {
      public AK.Wwise.Event
        // Use this for initialization
        void Start () {
        
        }
        // Update is called once per frame.
        void Update () {
        
        }
    }

  6. AK.Wwise.Event 다음에 한 칸을 띄우고 프로퍼티의 이름을 MusicEvent로 지정한 다음 세미콜론 ( ;)으로 줄을 마무리하세요.

    public class PostMusic : MonoBehaviour {
      public AK.Wwise.Event MusicEvent;
    

    이제 Wwise-Type Event 프로퍼티를 만들었으니 Start에 Event를 게시하여 게임이 초기화되자마자 Event를 게시하도록 할 수 있습니다.

  7. Start() 함수 안에 ' MusicEvent.Post(gameObject);'를 입력하세요.

    public class PostMusic : MonoBehaviour {
      public AK.Wwise.Event MusicEvent;
        // Use this for initialization.
        void Start () {
            MusicEvent.Post(gameObject);        
        }
    

    컴포넌트와 마찬가지로 Event에서 콜백을 설정할 경우 Event를 게시할 때 콜백 정보(Callback Flag와 Callback Function)를 제공해야 합니다. Callback Flag는 두 번째 입력 매개 변수(첫 번째 입력 매개 변수는 게임 오브젝트)이며 AkCallbackType 클래스를 통해 실행됩니다. Post()의 경우 Start() 함수의 프로퍼티 이름 뒤에 쉼표 (,)를 입력하면 Callback Flag를 추가할 수 있습니다.

    [참고]

    모든 Callback Flag가 모든 Wwise Object 타입과 호환되는 것은 아닙니다. 예를 들어 Destruction_VolcanicBoulder_Impacts Event가 끝날 때 콜백이 필요할 경우 AK_EndOfEvent CallbackFlag를 사용할 수 있지만 해당 Event가 Music Segment를 재생하지 않기 때문에 AK_MusicSyncBar는 호출되지 않습니다.

  8. gameObject 뒤에 쉼표 (,)를 입력한 후 한 칸을 띄우고 AkCallbackType.AK_MusicSyncBar;를 입력하세요.

    void Start () {
        MusicEvent.Post(gameObject, AkCallbackType.AK_MusicSyncBar);
    }

    이 부분은 AkCallbackType 클래스 안에서 AK_MusicSyncBar Flag를 찾아서 게시된 Event에 추가합니다. 특히 Post 함수의 경우 AK_MusicSyncBar도 단위 uint 타입으로 보내야 합니다.

    [참고]

    C# 프로그래밍 언어(이 자격증 과정에서 사용하는 프로그래밍 언어)에서는 integer(정수, int)라는 프로퍼티 타입을 통해 소수점 없는 숫자를 저장할 수 있습니다. 이 프로퍼티 타입은 양수와 음수 값을 모두 저장할 수 있습니다 (범위: -2,147,483,648 ~ 2,147,483,647). 하지만 모든 값이 양수가 되도록 하려면 접두어 'u'를 추가하여 부호 없는(unsigned) int 즉, uint(범위: 0 ~ 4,294,967,295)로 만들 수 있습니다.

    CallbackType 프로퍼티 앞의 괄호 안에 새로운 프로퍼티 타입을 추가하면 프로퍼티를 변환할 수 있습니다.

    [작은 정보]

    프로퍼티를 다른 타입으로 변환하는 것을 Typecasting이라고 부릅니다.

  9. AkCallbackType.AK_MusicSyncBar 앞에 (uint)을 입력하세요.

    MusicEvent.Post(gameObject, (uint)AkCallbackType.AK_MusicSyncBar);

    Post 함수 아래 작은 빨간 선이 보이시나요?

    이 빨간 선은 Wwise가 Unity로 콜백을 줄 때 어떤 함수를 호출해야 하는지 선언하지 않았기 때문에 표시됩니다. Update() 함수의 이름을 바꿔서 Unity가 호출하지 않도록 한 후 Callback 함수로 바꿔봅시다.

  10. Update()CallbackFunction()으로 변경하세요.

        // Update is called once per frame.
        void CallbackFunction(){
        
        }

    헷갈리지 않도록 Update() 함수 위에 있는 주석도 삭제합시다.

  11. // Update is called once per frame 주석을 삭제하세요.

    void CallbackFunction(){
        
    }

    Post() 함수에 이름을 추가해봅시다.

  12. MusicEvent.Post(gameObject, (uint)CallbackType 뒤에 CallbackFunction을 입력해서 CallbackFunction을 전달인자(argument)로 넣으세요.

    MusicEvent.Post(gameObject, (uint)AkCallbackType.AK_MusicSyncBar, CallbackFunction);

    CallbackFunction 아래 작은 빨간 선이 보이실 것입니다.

    Post() 함수에 콜백 함수를 추가하면 Wwise 사운드 엔진은 선택된 Callback Type 중 하나를 발견할 경우 콜백 함수를 호출합니다. 이렇게 Callback Type AK_MusicSyncBar를 선택함으로써 Wwise 사운드 엔진은 음악의 모든 마디에서 콜백 함수를 호출하게 됩니다.

    하지만 Wwise 사운드 엔진은 콜백 함수가 콜백 알림에 대한 정보를 수신할 수 있다고 가정하기 때문에 CallbackFunction이 정보를 수신할 수 있도록 만들어야 합니다. 다시 말해 필요가 없더라도 함수 괄호 안에 몇 가지 변수를 선언해야 하죠.

  13. CallbackFunction() 괄호 안에 object in_cookie, AkCallbackType in_type, object in_info를 입력하세요.

    void CallbackFunction(object in_cookie, AkCallbackType in_type, object in_info){
        
    }

    이렇게 하면 Callback Type과 같이 콜백에 대한 정보를 수신할 수 있습니다. 지금은 MusicSyncBar라는 한 개의 콜백만 수신하기 때문에 이 매개 변수들이 필요하지 않습니다.

    [작은 정보]

    Callback 함수에 프로퍼티를 입력하는 방법에 대해 더 알아보려면 Wwise SDK 설명서를 참조하시기 바랍니다.

    이제 콜백을 성공적으로 설정했지만 CallbackFunction()이 비어있기 때문에 아무 것도 실행되지 않습니다. 최종적으로 게임에서 모든 RhythmActions 컴포넌트를 호출해야 하지만 이 실습을 위해서 GameManager 안에 모든 RhythmActions 컴포넌트가 주시하는 함수를 만들어 놓았습니다. GameManager 스크립트는 싱글턴(singleton)이기 때문에 동시에 하나만 존재할 수 있으며 게임플레이 동안 파괴되지 않습니다. 그렇기 때문에 항상 이 함수가 사용 가능하다는 것을 알 수 있습니다.

    RhythmActions 스크립트가 런타임 때 인스턴스화되면 GameManager와의 링크를 자동으로 만들어서 GameManager를 통해 모든 컴포넌트를 호출할 수 있게 해줍니다.

  14. CallbackFunction() 함수 안에 GameManager.PushRhythmAction();을 입력하세요.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PostMusic : MonoBehaviour {
                          public AK.Wwise.Event MusicEvent;
        // Use this for initialization.
        void Start () {
            MusicEvent.Post(gameObject, (uint)AkCallbackType.AK_MusicSyncBar, CallbackFunction);
        }
        void CallbackFunction(object in_cookie, AkCallbackType in_type, object in_info){
            GameManager.PushRhythmAction();
        }
    }

    훌륭합니다! 이 섹션에 있는 모든 스크립트 단계를 완료했으니, 이제 스크립트를 저장해 주세요. 다음으로 Music_Region Event에 Wwise-Type Event 프로퍼티를 할당해봅시다.

  15. MusicEvent 프로퍼티 안에서 Events > Music > General을 펼치고 Music_Region을 더블 클릭하세요.

    이제 Scene 안에 있는 게임 오브젝트에 RhythmActions 스크립트를 배포할 수 있으며, 허용되면 게임 오브젝트가 움직입니다.

    [참고]

    게임 세계의 환경(Desert, Forest 등)에서 사용되는 일부 게임 오브젝트는 (Desert, Forest, and so on) 고정되어 있습니다(static). 게임 오브젝트가 고정되어 있으면 런타임 때 움직일 수 없습니다. Inspector의 가장 윗쪽에서 게임 오브젝트의 static 모드를 비활성화할 수 있습니다.

  16. Hierarchy에서 TrainingArea_로 시작하는 모든 게임 오브젝트를 선택하세요.

    모든 게임 오브젝트를 선택한 후 Add Component를 선택하면 선택한 각 오브젝트에 컴포넌트가 동시에 추가됩니다.

  17. Inspector에서 Add Component를 클릭한 후 RhythmActions를 검색해서 선택하세요.

    이제 RhythmActions 스크립트가 여러 게임 오브젝트에 추가되었습니다. 그리고 사용자 정의 스크립트를 통해 게임의 핵심 부분에 콜백이 설정되었습니다. 한 번 확인해볼까요?

  18. Play 모드를 시작하고 여러분이 선택했던 모든 오브젝트가 음악의 템포에 따라 움직이는 것을 확인해보세요.

    게임 오브젝트가 커지는 정도를 원하는 대로 바꿔보고 Scene에 있는 다른 게임 오브젝트에도 RhythmActions 스크립트를 추가해보세요.

콜백 시스템이 잘 작동할 것입니다. RhythmActions 스크립트가 있는 게임 오브젝트는 Region_Music Event가 Music Segment의 마디를 지날 때마다 호출됩니다. 이렇게 호출되는 이유는 GameManager에서 PushRhythmAction() 함수를 호출하는 PostMusic 스크립트에 있는 Callback 설정 때문입니다. 지난 섹션과는 다르게 이번 섹션에서는 이렇게 오브젝트 언로드에 따라 콜백을 조정하거나 여러 오브젝트에 콜백을 호율적으로 추가하고 싶을 경우 코드를 통해 콜백을 설정하는 방법을 배웠습니다.