목차
이 섹션을 시작하기 전에 이전 섹션인 Wwise-Type을 사용하여 Event 게시하기를 반드시 완료해주세요. |
Unity에서는 Animation 클립을 사용하여 애니메이션 작업을 처리할 수 있습니다. 애니메이션 클립에는 Maya나 3Ds Max와 같은 외부 프로그램에서 만든 애니메이션이나 Unity의 오브젝트 수정 사항을 담을 수 있습니다. 모험가가 어떻게 만들어졌는지 살펴봅시다.
이 캐릭터의 모델은 Maya에서 만들어졌으며 캐릭터가 Move(이동)하고, Attack(공격)할 수 있도록 여러 스크립트가 캐릭터 게임 오브젝트에 붙어 있습니다. 하지만 이 캐릭터에 생기를 주려면 적을 공격할 때 캐릭터의 팔이 휘둘러져야 하고 앞으로 이동 버튼을 누르면 다리가 앞으로 나가야겠죠.
그렇다면 소리는 어떨까요? Wwise에서 찾아보면 고음질의 발소리가 Random Container에 담겨있음을 알 수 있습니다. 하지만 어떻게 하면 정확히 모험가의 발이 바닥에 닿는 시점에 소리를 재생할 수 있을까요? 그러기 위해서는 Animation Event가 필요합니다. 이 이벤트는 애니메이션의 특정 시점을 스크립트의 함수에 연결할 수 있게 해주는 Unity 기능입니다. 먼저 Animation에서 특정 시점을 선택한 후 스크립트에서 함수를 지정합니다. 그리고 이 스크립트에서 Event를 게시할 수 있습니다. 다음 단계에서는 이전에 만든 PostWwiseEvent가 플레이어의 발소리를 게시하도록 변경한 후 Start 함수가 Animation Event로부터 호출되도록 변경해봅시다. 그런 다음 Animation Editor를 살펴보고 Animation Event에서 새로운 함수를 직접 호출해봅시다.
-
Unity에서 Audiokinetic > Certification > 301 > Lesson 4로 가서 Posting Events from Animations를 선택하세요.
-
Hierarchy에서 Player 게임 오브젝트를 선택하세요.
Player 게임 오브젝트에 PostWwiseEvent 스크립트를 추가합시다. 이 스크립트는 이전 섹션에서 여러분이 작성한 스크립트이며 제 5강에서도 사용할 것입니다.
-
Inspector에서 Add Component를 클릭하고 PostWwiseEvent를 선택하세요.
프로젝트에 이 스크립트가 보이지 않으실 경우 이전 섹션인 Wwise-Type Event 프로퍼티 만들기로 돌아가셔야 합니다.
-
MyEvent 프로퍼티 드로어를 클릭하고 Player_Footstep Event를 선택하세요.
-
PostWwiseEvent를 더블 클릭해서 스크립트를 여세요.
Visual Studio(혹은 여러분이 사용하는 기본 코드 편집기)가 열립니다. 여기에서 이전에 만든 PostWwiseEvent 스크립트를 확인할 수 있습니다. 재생 모드를 시작하면 이 스크립트에서 MyEvent.Post() 함수가 MyEvent 프로퍼티에서 선택한 Event를 호출합니다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PostWwiseEvent : MonoBehaviour { public AK.Wwise.Event MyEvent; // Use this for initialization. void Start () { MyEvent.Post(gameObject); } // Update is called once per frame. void Update () { } }
현재 MyEvent.Post() 함수 호출이 Start() 함수 안에 있기 때문에 MyEvent 프로퍼티에서 선택한 Event는 게임이 시작될 때 게시됩니다. 하지만 저희는 Animation Event에서 이 함수를 호출하고자 하기 때문에 게임이 실행될 때 Unity가 함수를 자동으로 호출하지 않도록 함수에 따로 맞춤 이름을 지정해주겠습니다.
함수의 이름은 이 단계에서는 중요하지만 Unity에서 Animation Event를 사용할 때는 중요하지 않습니다. 원하실 경우 'PostFootstepEvent'와 같이 다른 함수 이름을 사용하셔도 됩니다. 하지만 함수의 이름이 Unity API에서 사용한 함수와 동일할 경우, 다른 처리 과정에서도 이 함수가 호출될 수 있습니다.
-
Start를 PlayFootstepSound로 교체하세요.
public class PostWwiseEvent : MonoBehaviour { public AK.Wwise.Event MyEvent; // Use this for initialization. void PlayFootstepSound() { MyEvent.Post(gameObject); }
이전에는 Play 모드를 시작하면 스크립트의 Start() 함수가 호출되었지만 이제 함수의 이름이 변경되었기 때문에 Unity는 Scene이 로드될 때 그 함수의 내용을 더 이상 자동으로 호출하지 않습니다. Animation Event로 돌아가기에 앞서, 먼저 함수 선언 앞에 public 접근 한정자를 추가해서 Unity가 새로운 이름의 함수를 인식할 수 있도록 해주겠습니다.
-
void PlayFootstepSound() 앞에 public을 입력하세요.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PostWwiseEvent : MonoBehaviour { public AK.Wwise.Event MyEvent; // Use this for initialization. public void PlayFootstepSound() { MyEvent.Post(gameObject); } }
PlayFootstepSound() 함수를 퍼블릭으로 만들어 스크립트를 완성했습니다.
-
Windows의 경우 CTRL+S, Mac의 경우 CMD+S를 눌러서 스크립트를 저장하세요.
이제 Unity로 돌아가서 Animation Event를 만들어봅시다. Animation Event를 Player에 추가해야 하므로 먼저 Player 게임 오브젝트를 선택하세요.
-
Hierarchy에서 Player 게임 오브젝트가 선택되었는지 확인하세요.
Animation Event를 추가하려면 Animation Window를 열어야 합니다.
-
Unity 메뉴에서 Window로 간 후 Animation을 선택하세요.
애니메이션 설정을 변경할 수 있는 Animation Window이 나타납니다. 만약 이 창을 처음 여실 경우 별도의 창으로 열릴 수 있습니다. 자세히 살펴보기 전에 창을 나머지 Layout 안에 맞게 넣어봅시다.
-
Animation 창의 탭을 드래그하여 Unity Project 뷰의 오른쪽으로 옮기세요.
Hierarchy에서 Player 게임 오브젝트를 선택하면 Animation Window가 이제 Player_Idle_wHammer Animation Clip을 보여줍니다.
Animation 클립이란 프로퍼티의 변화를 하나의 시퀀스로써 저장하는 방법입니다. 모든 프로퍼티는 왼쪽 창에 열거되어 있습니다. 오른쪽에는 프로퍼티가 변경된 시점이 표시되어 있습니다. 이 점들은 키프레임이라고 불립니다. 키프레임 위와 Timeline (시간을 표시하는 가장 윗쪽 바) 아래에는 Animation Event를 추가할 수 있는 Event 줄이 있습니다. 흰색 Time Cursor가 Animation Event에 도달하면 지정된 함수를 호출하기 때문에 Animation 클립에서 특정 시점에 동작이 호출되는지 확인할 수 있습니다. 이제 Player의 발이 바닥에 닿을 때 PlayFootstepSound() 함수를 호출해야 합니다. Player_Sprint Animation 클립을 예로 들어 설명하겠습니다.
-
Player가 사용하는 모든 Animation 클립을 보려면 왼쪽 위에 있는 목록 메뉴를 여세요.
여기에 Player의 애니메이션 시스템이 사용하는 모든 Animation 클립이 보이실 것입니다. 이 클립들은 Animator 컴포넌트가 관리합니다.
-
왼쪽 위의 목록에서 Player_Sprint를 선택하세요.
왼쪽에는 애니메이션 안에 어떤 컴포넌트가 있고, 오른쪽에는 Timeline과 아래 Event 줄을 확인하실 수 있습니다.
Timeline의 가장 왼쪽에는 흰색 Timeline Cursor가 위에서 아래로 그려져있습니다. 이 줄은 Animation의 현재 시점을 표시합니다. Timeline에서 드래그나 클릭을 하여 위치를 변경하면 Scene 뷰에서 애니메이션 클립의 해당 시점에 따라 모험가의 애니메이션이 조정됩니다.
모험가가 Player_Sprint Animation 클립으로 설정된 것이 보입니다. Time Cursor를 옆으로 드래그하면 모험가가 왼발과 오른발을 바닥에 차례로 내딛으면서 걷는 것을 볼 수 있습니다.
-
Timeline에서 Timeline Cursor를 앞뒤로 드래그해보세요.
뷰에 기호나 텍스트가 지저분하게 표시되어 있을 경우 Scene view's Gizmos 탭에서 대부분을 제거할 수 있습니다.
-
Scene 뷰에서 Gizmos 탭으로 가서 3D Icons를 비활성화하세요.
다음으로 애니메이션에서 사운드를 시작하고자 하는 정확한 위치를 찾아봅시다.
-
Timeline Cursor를 모험가의 오른발이 바닥에 닫는 시점(0:05)으로 옮기세요.
여기에 Animation Event를 추가한 다음 PlayFootstepSound() 함수를 지정해봅시다.
-
Event 줄에 있는 Time Cursor(0:05)를 우클릭하고 Add Animation Event를 선택하세요.
새로운 Animation Event 마커가 Event 줄에 표시됩니다.
타이밍이 정확해야 하므로 Animation Event 마커가 정확히 0:05에 있는지 확인하세요. 그렇지 않으면 Scene 뷰에서 보이는 것과 일치하지 않을 수 있습니다. 다음으로 Inspector를 살펴봅시다.
여기에서 타임라인의 해당 시점에 호출할 함수를 추가할 수 있습니다. 그렇게 할 수 있는 이유는 이 섹션 앞부분에서 퍼블릭 접근 한정자를 추가했기 때문입니다.
Animation Event는 Animator 컴포넌트와 동일한 게임 오브젝트에 존재하는 함수에만 연결될 수 있습니다. 다른 게임 오브젝트에 있는 스크립트를 연결하려면 함수 호출을 전달하는 스크립트를 추가로 작성해야 합니다.
-
Function 속성 드로어를 클릭하고 PostWwiseEvent > Methods > PlayFootstepSound()를 선택하세요.
이제 함수가 Animation Event Marker에 연결되었으니 사운드를 시험할 준비가 되었습니다.
Function 목록은 여러 정보를 종합적으로 표시하지만 함수 이름의 첫 글자를 입력하면 해당 함수로 건너뛸 수 있습니다. 이 경우 'P'가 되겠죠.
-
제 1강에서 설명한대로 Play 모드를 시작하세요. 그런 다음 Shift를 누른 상태에서 W를 눌러서 빠르게 뛰어보세요.
이렇게 오른발 소리가 추가되었습니다. 이제 왼발 소리를 추가해봅시다. Play 모드를 종료하고 Animation 창으로 돌아가세요.
-
왼발이 바닥에 닿는 부분 (0:15)으로 Time Cursor를 드래그하세요.
-
Event 줄 안을 우클릭하고 Add Animation Event를 선택하세요.
혹은 Event 줄 왼쪽에 있는 Add Event 버튼을 클릭해서 Animation Event를 추가할 수도 있습니다. 그러면 Timeline Cursor의 위치에 Animation Event가 추가됩니다.
-
Inspector에서 PlayFootstepSound() 함수를 선택하세요.
-
Play를 클릭한 후 씬 주위를 빠르게 뛰어보세요.
Training Area 주변을 뛰어 다니면서 발소리를 들어보세요. 발소리가 Player의 애니메이션을 따라 매끄럽게 들립니다. 사운드를 애니메이션에 직접 연결하면 Player가 알맞은 애니메이션을 실행할 경우에만 Footsteps가 재생되도록 할 수 있습니다. 이 실습 과정을 그대로 따라하시면 걷기 애니메이션, 공격 애니메이션 등 다양한 애니메이션에 발소리를 추가하실 수 있습니다.
자, 제 5강에서도 사용할 수 있도록 Player Prefab의 변경 사항을 저장해봅시다.
-
ESC를 눌러 WAG 메뉴를 연 후 Play를 다시 클릭해서 Play 모드를 종료하세요.
-
Player 게임 오브젝트를 선택하고 Inspector에서 Overrides > Apply All을 클릭하세요.
이제 프로젝트에 있는 모든 Player 게임 오브젝트의 발소리가 똑같이 이 애니메이션의 작동 방식을 따를 것입니다.