디스크 골프 [#16] - 시네마틱 도입부 만들기
저번에 만든 자동차를 활용해서 게임 도입부에 사용할 시네마틱한 도입부를 만들 생각이다.
카메라의 처리엔 시네머신을 사용하면 적합할 것이라고 생각했고 자동차의 움직임을 어떻게 다룰까 고민하다가,
코드를 짜서 이동하는 것보다 애니메이션을 써서 이동하는게 더 자연스러울 것이라 생각해서 애니메이션을 이용해서 자동차를 움직이기로 했다.
https://www.youtube.com/watch?v=Gzvvt7JnGvE
자동차 애니메이션 구현엔 다음 영상을 참고했다.
먼저 Animation폴더를 만들고 Car애니메이터와 Cinema1애니메이션을 만들어줬다.
그리고 만든 자동차 애니메이션의 녹화 버튼을 클릭하고 위치와 로테이션을 변경해주면서 애니메이션을 생성했다.
자동차의 애니메이션을 만들었으니 Cinemachine을 사용해서 카메라를 시네마틱하게 전환해보도록 하자
그래서 cinemachine을 사용하려고 생각해보니 cinemachine을 사용해 카메라를 전환할때 자동차와의 타이밍을 맞추기 힘들 것 같았다.
그래서 타임라인 기능을 한번 써보도록 하겠다.
Window탭에서 Sequencing을 눌러서 TImeLine을 생성한다.
타임라인을 우클락하여 애니메이션 트랙을 만들고 Car 애니메이션 컨트롤러를 넣어주자
이제 시네머신을 사용해서 카메라 전환을 만들어보려고 했는데 저번에 돌리카트를 사용할때도 느낀거지만,
OVR SDK를 사용할때 Cinemachine의 카메라 전환이 적용되지 않았다.
그래서 Cinemachine을 사용하지않고 Player를 텔레포트하는 방식으로 카메라 전환을 구현하기로 했다.
타임라인을 사용해서 플레이어 이동을 Car애니메이션과 동기화해야 하는데 스크립트의 메서드를 이벤트로 실행하는 부분은 다음 블로그를 참고 했다.
https://pinelike.tistory.com/139
TimeLine.2 스크립트 함수 호출
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Playables; using UnityEngine.Timeline; public class TimelineController : MonoBehaviour{ public PlayableDirector playableDirector; public TimelineAsset timeline
pinelike.tistory.com
먼저 간단하게 스크립트를 작성해보자
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
public class CinemaMountain : MonoBehaviour
{
public Transform[] point;
public void MoveToPoint1()
{
this.transform.position = point[1].position;
}
public void MoveToPoint2()
{
this.transform.position = point[2].position;
}
}
타임라인에 우클릭을 해서 Signal Track을 추가한 뒤 OVRCameraRig에 CinemaMountain스크립트를 매핑하고 Signal Track에 매핑해주었다.
우클릭을해서 Add Signal Emitter를 선택해주자
시그널을 만들자 이름은 MovePoint로 해주었다.
Signal Receiver에 이벤트를 추가해주자
잘 실행되는지 한번 확인해보자
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
public class CinemaMountain : MonoBehaviour
{
public Transform[] point;
public PlayableDirector playableDirector;
public TimelineAsset timeline;
private void Start()
{
playableDirector.Play();
}
public void MoveToPoint1()
{
this.transform.position = point[0].position;
}
public void MoveToPoint2()
{
this.transform.position = point[1].position;
}
}
카메라리그는 시간에 맞춰서 잘 이동하는데 이상하게 Cinema1 애니메이션을 실행할때마다 잘 있던 자동차가 좌표 0,0,0으로 텔레포트를 한다.
찾아보다가 다음 사이트에서 해답을 얻을 수 있었다.
https://discussions.unity.com/t/timeline-send-objects-to-zero-position-in-play-mode/195274
Timeline send objects to zero position in play mode.
If I add a object to Timeline, timeline move object to (0,0,0) in preview mode. It’s very annoying adding track offset field every time I add objects to play preview properly. Weird things is that, if I did not filled track offset field and Play scene, t
discussions.unity.com
타임라인의 애니메이션을 클릭하면 Clip Transform Offsets라는 오프셋을 지정하는 부분이 있는데 그 부분의 수치를 바꿔주면 된다고 한다.
오프셋을 수정하고 실행해보니 카메라리그의 높이가 낮아서 조금 높여 주고 자동차를 바라볼 수 있도록 로테이션 값을 변경해주었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
public class CinemaMountain : MonoBehaviour
{
public Transform[] point;
public PlayableDirector playableDirector;
public TimelineAsset timeline;
public void MoveToPoint1()
{
this.transform.position = point[0].position + Vector3.up;
this.transform.rotation = Quaternion.Euler(0, 135, 0);
}
public void MoveToPoint2()
{
this.transform.position = point[1].position + Vector3.up;
this.transform.rotation = Quaternion.Euler(0, 40, 0);
}
}