Unity 3D Multiple Animation
유니티에서 다수개의 애니메이션을 사용하는 예
한개의 애니메이션이 실행되고 있는 중에 OnTriggerEnter() 함수 등을 이용하여 특정 환경에서 다른 애니메이션을 실행하는 예제를 작성해본다
앞서 작성했던 애니메이션 (Sphere의 자연스러운 회전)이 실행되는 도중에 다른 애니메이션(Sphere 가 회전 중에 Cube와 충돌하면 Sphere 가 작아져서 사라짐)이 실행되도록 설정하는 예제이다
먼저 별도의 애니메이션 파일이 요구되므로 Sphere 가 작아져서 사라지게 되는 애니메이션 파일을 작성해야 한다
Sphere 의 크기를 조정하여 결국 사라지는 내용의 애니메이션을 새로 생성해야 하므로 애니메이션 파일을 생성하는 작업을 아래 그림처럼 시작한다
스케일(크기)를 조정하는 애니메이션이므로 Scale.x 의 우측 아이콘을 클릭하여 Add Curves 를 선택하면 3개의 Scale 속성 모두가 조정 대상이 된다는 의미로 컬러 마름모 아이콘이 나타난다
위의 설정 결과 3개의 모든 Scale 속성이 선택되어 컬러 마름모 아이콘이 표시되었고 타임라인에는 첫 프레임이 자동으로 키 프레임으로 설정되어 있다.
아타임라인에서 1초 지점을 클릭하고 키프레임 추가 아이콘을 클릭한 후, Hierarchy 뷰에서 Sphere 를 선택한 하고 Scene 뷰나 Inspector 뷰에서 Sphere 의 크기를 크게 조정한다
타임라인에서 2초지점을 클릭하고 위와 같은 절차로 작업을 하되 2초지점에서는 구의 크기가 0가 되도록 설정한다
애니메이션 윈도우에서 Play 버튼을 눌러 실행해보면 커졌다가 작아져서 사라지는 Sphere 오브젝트의 애니메이션을 확인할 수 있다.
Hierarchy 뷰에서 GameObject 를 선택하면 Inspector 뷰의 Animation 콤포넌트의 Animations 항목에는 애니메이션 2개가 원소로 등록되어 있고 그중에 첫번째 애니메이션인 CircularAnim 이 설정되어 있기 때문에 프로그램을 실행하면 회전하는 구를 볼 수가 있을 것이다. 그러나 아직 더 설정해야 할 것들이 남아 있다. 첫번째 애니메이션 실행 도중에 어떤 시기에 두번째 애니메이션이 실행되도록 할 것인가 생각해야 한다.
Sphere 가 회전 애니메이션을 실행하고 있는 도중에 다른 오브젝트와 충돌하면 회전 애니메이션이 중지되고 커졌다가 사라지는 애니메이션이 실행되도록 하려고 한다. OnTriggerEnter() 함수를 작성하여 Sphere 에 포함시키고 Cube 와 충돌하면 Sphere가 사라지도록 할 것이다
아래의 스크립트를 작성하여 Hierarchy 뷰의 GameObject 에 포함시키고 묵시적 public 으로 선언된 anim 변수에 여기서 작성했던 애니메이션을 할당하면 된다.
#pragma strict
var anim:AnimationClip;
function Start () {
}
function OnTriggerEnter () {
animation.Play(anim.name);
}
위의 스크립트 중에 OnTriggerEnter() 함수가 실행되도록 하려면 이 스크립트를 포함하는 오브젝트는 Collider, Rigidbody 콤포넌트를 포함하고 있어야 한다. 그러므로 GameObject 에게 Collider, Rigidbody 콤포넌트를 추가해주고 Rigidbody 콤포넌트의 항목 중에 Use Gravity 항목을 체크 해제하여 중력의 효과를 배제한다. 또한 Collider 콤포넌트의 Is Trigger 항목을 제크하여 물리엔진은 작동하지 않으면서 OnTriggerEnter()함수는 호출이 되도록 설정한다
또 위의 그림처럼 Cube 도 하나 추가하여 Sphere 가 회전 중에 Cube 와 충돌하도록 한다.
아래의 그림은 Sphere 가 회전 중에 Cube를 드래그하여 일부러 충돌하도록 유도하면 충돌시 두번째 애니메이션이 실행되면서 Sphere 가 커지는 장면이다
두번째 애니메이션이 실행되면 앞서 실행되던 첫번째 애니메이션은 두번째 애니메이션이 종료해도 다시 실행되지 않는다.
만약 충돌한 시점에서 애니메이션과 함께 사운드효과가 필요하다면 다음과 같이 스크립트에 추가하고 또 AudioSource 콤포넌트를 추가하여 오디오 클립을 드래그하여 할당하면 된다.
#pragma strict
var anim:AnimationClip;
var audioClip :AudioClip;
function Start () {
}
function OnTriggerEnter () {
audio.PlayOneShot(audioClip);
animation.Play(anim.name);
}