2. 또 다른 애니메이션 기법
Legacy 방식의 애니메이션을 했을 때는 이미 만들어진 애니메이션을 배웠지만
이번에는 유니티에서 자체적으로 애니메이션을 만들 수 있는 기능을 살펴봅니다.
애니메이션 적용이 된 현관문을 열고 닫는 기능을 만들어 보는데 일단 위 사진처럼 집과 문을 배치합니다.
( 1 / 15 )
3. 우리집 현관문 튼튼해 #1
애니메이션을 제작하기 앞서 문의 피봇 위치를 잡아주어야 합니다.
문을 만드셨다면 피봇의 위치가 중앙으로 잡혀있는 것을 확인하실 수 있습니다.
이를 방지하기 위해 ‘Empty Object’를 만들고 문의 경첩이 달려있는 쪽으로 배치한 뒤 문을 Child 시켜
올바를 회전이 가능하게끔 만들어야 합니다.
( 2 / 15 )
# 제대로 열리는 문
4. 우리집 현관문 튼튼해 #2
본격적으로 현관문을 애니메이터화 시켜봅시다.
일단 Door 객체에 ‘Add Component’를 통해 Animator를 붙여줍니다. 이후 Window 탭에서 Animation 탭을 클릭하여
창을 활성화 시켜줍니다. 이후 ‘Hierarchy View’에서 ‘Door’ 객체 부모(GameObject)를 클릭 뒤 ‘Create’를 버튼을 눌러
‘Door’ 객체에 대한 새로운 애니메이션을 만듭니다.
( 3 / 15 )
5. 우리집 현관문 튼튼해 #3
‘idle’ 형식의 애니메이션을 만들고 이후 추가적으로 ‘Create New Clip’을 눌러 ‘open’ 이라는 클립을 하나 더 생성합니다.
빨간색 녹화버튼을 누르는 순간 애니메이션 녹화가 가동 중인 상태입니다.
타임라인에서의 빨간 띠를 1초 (1:00)로 옮긴 뒤에 문의 회전을 직접적으로 주게 되면 애니메이션 키 프레임이 녹화되는데
이는 0초 때 닫혀있던 문이 1초가 되는 과정까지 값이 보간되어 자연스레 열리는 문 애니메이션이 만들어지는 것입니다.
( 4 / 15 )
# IDLE Animation
6. 우리집 현관문 튼튼해 #4
이후 닫히는 애니메이션을 만들어야 하는데 생각을 잘 해보면 닫히는 애니메이션은 시작점이 열려있는 문의 위치를
가져야 합니다. 이 위치를 기억하기 위해선 열려있는 문의 좌표를 알아야 하는데, ‘open’ 애니메이션 클립의 1초 키프레임을
보면 열려있는 문의 ‘Transform‘의 위치를 우클릭 하여 ‘Copy Component’를 하게 되면
열려있는 상태의 문 위치를 기억하게 됩니다.
( 5 / 15 )
7. 우리집 현관문 튼튼해 #5
이제 닫히는 애니메이션을 만들어야 하는데 이전 과정과 똑같이 ‘Create New Clip’ 을 통해 ‘Close’ 이름으로 만들고
0프레임 부터 문이 열려있고, 나중에 갈 수록 닫히는 애니메이션을 제작하기 때문에
이전에 복사했던 ‘Transform’을 ‘Paste Component Values’를 통해 위치 자체를 붙여넣기 해줍니다.
이러하여 이전에 복사한 값을 바로 컴포넌트에서 붙여넣기 하나로 수정이 가능합니다.
( 6 / 15 )
- ‘0’ 프레임부터 열려있는 문 -
8. 우리집 현관문 튼튼해 #6
역시 마찬가지로 녹화 버튼을 누르고 1초 때에 문을 직접 수정하여 닫히는 위치로 조정하게 되면 애니메이션이 완성됩니다.
이로써 우리는 ‘idle’, ‘open’, ‘close’ 3개의 애니메이션을 만들었습니다.
이제 이 애니메이션을 어떻게 조정하고 관리하는지 자세하게 알아보겠습니다.
( 7 / 15 )
# 문 애니메이션 완성
9. 우리집 현관문 튼튼해 #7
애니메이션의 연계동작은 자동으로 실행되는 것이 아닙니다. 무언가 제한을 주고 이동할 수 있게 되어있습니다.
‘Parameters’ 탭에서 ‘+‘ 버튼을 눌러보면 4개의 자료형을 받는데 이 자료형들로 애니메이션의 제한을 줄 수 있습니다.
‘Bool’ 형식의 자료형을 만들고 ‘DoorState’ 이름의 값을 하나 만듭니다.
이후 ‘idle’에서 ‘open’으로 넘어가는 트랜젝션에 ‘DoorState’가 ‘true’일때만 받게끔 설정합니다.
( 8 / 15 )
# 제한이 걸린 애니메이션
10. 우리집 현관문 튼튼해 #8
이후 ‘open’과 ‘close’ 사이의 트랜잭션에서도 문 상태에 알맞게 boolean 값을 배치해줍니다.
그리고 스크립트를 새로 만들어 위와 같은 코드를 적어봅시다. ‘E’키를 눌렀을 때 Boolean 값을 직접 조정하는 것인데
회전 될 문에 스크립트를 직접 부착하고 게임을 실행해보면 문이 열리는 것을 확인하실 수 있습니다.
( 9 / 15 )
# 열리는 문
11. 우리집 현관문 튼튼해 #9
하지만 문제점이 있습니다. 애니메이션이 계속 반복해서 실행되는 것입니다.
‘Project View’에 가면 우리가 만들었던 애니메이션 파일들이 저장되어 있는 것을 알 수 있습니다.
‘open’, ‘close’ 애니메이션 파일을 클릭하여 ‘Loop’를 체크버튼을 해제하면 반복적인 애니메이션이 수행하지 않습니다.
( 10 / 15 )
# Loop 해제
12. 우리집 현관문 튼튼해 #10
문제점이 하나 더 있습니다.
‘E’키를 누르면 바로 문이 열리고 닫혀야 하는데, 타이밍이 늦어지는 것을 볼 수 있습니다.
이는 ‘Animator’에서 보면 애니메이션의 흐름이 나오는데 ‘E’키를 눌러도 저 흐름이 끝날 때까지 기다렸다 실행되기 때문입니다.
3개의 트랜지션에서 ‘Has Exit Time’ 체크 버튼을 해제하면 흐름을 무시하고 바로 실행되게끔 만들어버립니다.
( 11 / 15 )
# 즉각적으로 열리는 문
13. 직접참조와 간접참조 #1
지금까지 머리 아픈 애니메이션 제작 과정과 컨트롤 기능에 대해서 알아보았습니다.
저번 편과 같이 이전에 배웠던 기능들을 토대로 응용해 보는 시간을 갖도록 하겠습니다.
캐릭터가 트리거에 위치해 있을 때 ‘Space’키를 누르면 공이 위로 뜨는 상호작용 기능을 제작해보겠습니다.
( 12 / 15 )
SPACE
14. 직접참조와 간접참조 #2
우선 트리거를 식별하기 위해 발판 위의 네모난 트리거를 배치하고 ‘Tag’에 임의로 ‘ActionZone’이라는 트리거를 배치합니다.
그리고 플레이어 스크립트에서 위와 같이 코드를 추가합니다. 이는 트리거에 들어갔을 때 ActionZone 태그의 트리거를
밟았을 경우 ‘ActionZone’라는 스크립트를 ‘az’ 변수에 할당하여 받아오고, ‘az.run’으로 직접 참조하여 실행합니다.
( 13 / 15 )
15. 직접참조와 간접참조 #3
트리거 객체에 붙일 ‘ActionZone’ 스크립트를 만듭니다.
이 스크립트도 무언가를 할당하여 실행하는데 윗 장에서 ‘az.Run’을 실행하면 간접적으로 Play라는 함수를 실행시킵니다.
대충 예상하시겠지만 공을 움직이는 함수겠죠? 공의 객체를 할당하여 ‘Play’ 함수로 공을 위로 움직이게끔 구성되어 있습니다.
두 스크립트를 알맞게 배치하여 실행해봅니다.
( 14 / 15 )
# Trigger Script # Ball Script
16. 직접참조와 간접참조 #4
정리를 해보면 ‘Player Script’는 ‘Trigger Script’를 할당받아 직접 참조로 함수를 실행하고
‘Trigger Script’는 ‘Ball Script’를 할당받아 간접적으로 실행하게 되어있습니다.
결론은 ‘Space’를 눌렀을 때 과정을 거쳐 공이 위로 뜨게 되는 셈이죠.
이상 애니메이션 메이킹과 참조 응용 편이였습니다.
( 15 / 15 )
# Trigger Script # Ball Script# Player Script