유니티 인트로 씬을 제작하기 위해 다양한 접근법을 공부했다.
이전에는 인트로를 제작할때 스크립트에 코루틴을 섞어 이미지의 페이드인, 아웃 기능을 구현했었다.
이때 단점은 관리가 굉장히 어려웠다.(타임라인에 비해)
그러나 이를 지원해주는 타임라인 기능이 존재했다!
유니티 타임라인 기능은 시퀀셜한 콘텐츠를 시각적으로 조정하고 관리할 수 있도록 해주는 도구다.
이를 통해 애니메이션, 사운드, 이벤트 등을 시간 축에 따라 정밀하게 조정할 수 있으며,
특히 시네마틱 컷씬, 인터랙티브 시퀀스, 게임 플레이 이벤트의 제작에 유용하다!
타임라인은 드래그 앤 드롭 방식을 사용한다.
마치 영상 편집 프로그램을 이용하는 것 같은 UI를 제공하고 있다!
아래 사진은 실제로 프로젝트에 적용한 인트로 타임라인이다.
타임라인은 다양한 종류의 트랙을 지원한다. 각 트랙은 애니메이션, 오디오, 컨트롤, 신호 등 다양한 유형의 클립을 포함할 수 있다.
이제 스크립트 내부서 따로 관리할 필요가 없어졌다!
애니메이터 컴포넌트와 연동하여 캐릭터나 오브젝트의 애니메이션을 제어할 수 있다.
기존에는 페이드 인, 페이드 아웃 기능을 코드로 구현했었는데,
유니티에서 제공하는 애니메이션을 이용해 간단하게 구현할 수 있다.
타임라인을 통해 특정 시점에 이벤트를 트리거할 수 있다. 게임 로직과 연동하여 다양한 상호작용을 구현하는 데 유용하다.
여러 애니메이션과 사운드 트랙을 결합하여 복잡한 시퀀스를 생성할 수 있다.
Unity 에디터에서 타임라인을 만들고 관리할 GameObject를 선택한 후, PlayableDirector 컴포넌트를 추가한다.
하이어라키에 빈 게임 오브젝트를 생성하자!
이후 Window -> Sequencing -> Timeline을 선택하면,
타임라인 창이 생성된다.
이후 이전에 생성했던 게임 오브젝트를 클릭하면 타임라인을 생성할 수 있다!
알맞은 경로에 타임라인 Playable파일을 생성해주자.
타임라인 에디터를 사용하여 다양한 유형의 트랙을 추가한다. 예를 들어, 애니메이션 트랙, 오디오 트랙 등이 있다.
추가된 타임라인 에디터에 오른쪽 마우스 버튼을 클릭하면, 여러가지 트랙을 추가할 수 있다.
현재는
Activation(게임 오브젝트 True, False),
Animation(애니메이션),
Audio(오디오),
Control(제어),
Signal(이벤트 트리거) 등이 있다.
이외에도 다른 사용자들이 제작한 커스텀 트랙이 존재한다!
각 트랙에 클립을 드래그 앤 드롭하여 배치하고, 클립의 길이나 순서를 조정할 수 있다.
특정 트랙에 오브젝트나 애니메이터를 연결하여 타임라인에서 제어할 수 있다.
타임라인을 재생하여 프리뷰를 확인하고, 필요에 따라 조정할 수 있다.
신호 트랙을 사용하여 게임 내 특정 이벤트를 트리거할 수 있다.
PlayableDirector 컴포넌트를 사용하여 스크립트로 타임라인을 제어하거나, 타임라인의 특정 지점에서 스크립트 함수를 호출할 수 있다.
인트로씬을 제작하고, 문제가 생겼다.
내가 원하는 스타트 로직은
인트로 -> 메뉴 화면인데, 메뉴 화면과 인트로가 동시에 실행되는 문제가 생겼다.
이에 해결 방법은 타임라인이 끝난 시점을 제어해 내가 원하는 메뉴가 출력되게 구현해보자.
위에서 말했듯이 유니티에서 타임라인이 끝나고 특정 메소드를 실행하고 싶다면, 타임라인의 재생이 끝났음을 감지하는 방법을 사용해야 한다.
Timeline의 PlayableDirector 컴포넌트를 활용할 수 있는데, PlayableDirector는 타임라인의 재생을 제어하고, 타임라인의 상태(재생, 정지 등)를 감지하는 데 사용된다.
PlayableDirector 참조 추가
PlayableDirector 컴포넌트에 대한 참조를 스크립트에 추가한다.
타임라인 종료 감지
PlayableDirector의 playableAsset.duration을 사용하여 타임라인의 전체 길이를 얻고, Invoke 메소드를 사용하여 해당 시간이 지난 후 원하는 메소드를 실행한다.
using UnityEngine;
using UnityEngine.Playables; // PlayableDirector를 사용하기 위해 필요
public class InitStartScene : MonoBehaviour
{
public PlayableDirector timelineDirector; // PlayableDirector 참조
private void Start()
{
// 타임라인이 끝난 후 실행할 메소드 예약
Invoke("OnTimelineFinished", (float)timelineDirector.duration);
}
private void OnTimelineFinished()
{
// 타임라인이 끝나고 실행될 코드
UIManager.Instance.OpenUI<UIStartScene>();
// LoadResources();
}
public async void LoadResources()
{
Debug.Log("로드 완료");
}
}