728x90

목차.

  1. 개요
  2. VirtualCamera 사용
  3. VirtualCamera 코드제어
  4. 결과

 

개요

 

게임에서 시네마틱 영상이나 다양한 연출을 보여주고 싶을 때가 있는데, 이런 기능을 코드로 구현하기에는 막막합니다.

 

유니티에서는 기본적으로 제공하는 시네머신(Cinemachine)을 이용하면 카메라의 부드럽고 다양한 움직임을 쉽게 제어할 수 있습니다.

 

결과적으로 게임의 몰입도를 상승시키고 몰입감을 높일 수 있습니다.

 

시네머신을 활용하는 하나의 예시로, 평상시 카메라가 플레이어 위에 있는 탑뷰(TopView)였다가 

특정 상황에서는 카메라가 플레이어 앞으로 와서 프론트뷰(FrontView), 아이소 메트릭뷰(Isometric-View), 사이드뷰(Side-View), 등등 다양한 연출들이 가능해집니다.

 

Cinemachine-시점-변환
시네머신 시점변환

 

이번 글에서는 유니티 시네머신 설치부터 기본적인 사용방법을 한번 익혀보겠습니다.

 

VirtualCamera 사용

 

1. Window -> Package Manager -> Packages:Unity Registry로 변경 후 Cinemachine을 검색

 

Pakage-Manager-Cinemachine-설치
패키지 매니저 시네머신 설치

 

시네머신이 나올 텐데 Install을 눌러 설치해 주시면 됩니다.

 

2. Hierarchy -> + or 마우스 우 클릭 -> Cinemachine -> Virtual Cmaera

 

Virtucal-Camera-생성
Virtual Camera 생성

버추얼 카메라를 눌러 하나 생성을 하게 되면 Main Camera에 시네머신 아이콘이 생기고 클릭을 해보면 다음과 같이 시네머신 브레인(Cinemachine Brain) 컴포넌트가 추가됩니다.

 

Main-Camera에-CinemachineBrain-추가됨
Main Camera에 CinemachineBrain 추가됨

이 시네머신 브레인이 있어야 시네머신이 작동이 되어 삭제를 하면 안 됩니다.

 

이렇게 생성한 Virtual Camera는 카메라가 아닌 카메라를 제어하기 위한 정보를 가지고 있는 오브젝트라고 생각하면 됩니다.

 

 Virtual Camera를 10개 20개 생성한다고 카메라가 10,20개가 되는 것이 아닌 여전히 카메라는 1개가 되는 것입니다.

 

3. 원하는 타겟 설정 및 시점 설정 

 

CinemachineVirtualCamera에-타겟-설정
시네머신 버추얼카메라에 타겟 설정

 

생성한 Virtual Camera를 클릭해 보면 CinemachineVirtualCamera라는 이름 긴 컴포넌트가 있을 것입니다.

 

해당 컴포넌트를 이용해 타겟 설정 및 카메라의 각도 우선순위 등등을 조절할 수 있습니다.

 

Priority는 해당 카메라의 우선순위로 많은 Virtual Camera를 이용할 때 원하는 카메라의 Priority를 높여 주도권을 가져올 수 있습니다.

 

Follow Look At 이라는것이 있는데 Follow는 카메라가 따라갈 오브젝트(타겟)이며 Look At은 어떤 오브젝트를 바라볼지 지정하는 것입니다.

 

일반적인 사용 방법으로 카메라는 플레이어를 따라다니면서 플레이어를 바라볼 때는 

Follow와 Look At 모두 플레이어로 해주면 됩니다.

 

다른 사용방법으로, 카메라가 플레이어(A)의 위치에서 지정한 대상(B)을 바라볼 때

Follow를 A로, Look At을 B로 설정하면 됩니다.

 

그러면 플레이어를 따라다니며(Follow) 대상(Look At)을 바라보게 됩니다.

 

Follow와-LookAt의-예시
Follow와 LookAt의 예시

 

아마 타겟을 설정했다면 카메라는 이상한 곳을 바라보고 있을 것입니다.

 

Follow-Offset-설정
Follow Offset 설정

 

만약 Body의 Follow Offset.Y가 0이라면,

 

카메라가-바닥에-붙어있는-모습
카메라가 바닥에 붙어있는 모습

다음처럼 카메라가 바닥에 붙어있을 것이고,

Y가 5라면 그만큼 카메라가 위로 올라갑니다. 이러한 방법으로 적당히 카메라의 위치를 설정해 주면 됩니다.

 

Binding Mode :  처음에는 Lock To Target With World Up으로 되어있어 플레이어나 사물이 회전한다면 카메라도 함께 회전하게 되지만, 위 사진처럼 World Space로 변경하면 카메라는 회전하지 않게 됩니다.

 

Aim : 이것은 타겟 오브젝트로부터의 에임을 설정하는것입니다.

만약 Tracked Object Offset의 y값을 0으로 한다면 정확하게 타겟 오브젝트의 피봇이 에임이 될 것이며,

y값을 높인다면 타겟 오브젝트보다 에임이 더욱 위로 올라가게 됩니다.

 

Aim-Tracked-Object-Offset의-y값이-0일때
Aim Tracked Object Offset의 y값이 0 일때
Aim-Tracked-Object-Offset의-y값이-3일때
Aim Tracked Object Offset의 y값이 3 일때

차이를 아시겠나요?

 

화면에 빨간 영역, 파란 영역 노란 점 등등 많은 것이 생겼습니다.

Aim이라는 항목을 선택하면 생기게 되고, 빨간 영역은 에임이 절대 저곳으로 가지 못하는 것을 의미합니다.

반대로 파란 영역은 Soft Zone으로 뎀핑값을 쓰게 될 때 파란 영역 안에서 부드럽게 카메라가 이동하게 됩니다.

 

여기까지 버추얼 카메라를 추가하고 설정까지 해봤습니다.

이렇게 만든 버추얼 카메라를 특정 상황에서만 켜고 싶다면 게임 오브젝트 자체를 활성화, 비활성화시키거나

다른 시네머신 카메라보다 우선순위(Priority)를 낮추면 됩니다. 

 

각각 하나씩 알아보겠습니다

 

VirtualCamera 코드제어

 

1. 버추얼카메라 활성화 비활성화

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;
public class BackViewEnter : MonoBehaviour
{
    [SerializeField]
    public GameObject BackViewCam;

    void Start()
    {
        BackViewCam.SetActive(false);
    }

    private void OnTriggerStay(Collider other)
    {
        if (other.transform.CompareTag("Player"))
        {
            BackViewCam.SetActive(true);
        }
    }
    private void OnTriggerExit(Collider other)
    {
        if (other.transform.name =="Player")
        {
          BackViewCam.SetActive(false);
        }
    }
}

 

원하는 장소에 도착 시 카메라의 시점 변환을 하기 위해 저는 TriggerBox를 활용했습니다.

 

플레이어가 트리거 박스 안에 있는 동안 버추얼 카메라가 켜져 있으며,

플레이어가 트리거 박스를 나가면 카메라가 꺼지게 되는 것입니다.

 

이제 일반 카메라를 사용하다 트리거 박스 안으로 들어가면 버추얼 카메라가 활성화되어 시점이 변하고,

밖으로 나가면 시점이 일반 카메라로 돌아오는 것을 확인할 수 있습니다.

 

2. 버추얼카메라 우선순위(Priority) 변경

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;
public class BackViewEnter : MonoBehaviour
{

    [SerializeField]
    public GameObject BackViewCam;

    private void OnTriggerEnter(Collider other)
    {
        if (other.transform.CompareTag("Player"))
        {
            BackViewCam.GetComponent<CinemachineVirtualCamera>().Priority = 11;
        }

    }
    private void OnTriggerExit(Collider other)
    {
        if (other.transform.name =="Player")
        {
          BackViewCam.GetComponent<CinemachineVirtualCamera>().Priority = 9;
        }
    }
}

 

기본적으로 카메라는 하나의 장면밖에 비추지 못합니다.

10개의 시네머신 카메라가 있다면 1개의 시네머신 카메라만 작동하는 것입니다.

이럴 때 카메라를 전환하기 위해 Priority를 사용하면 됩니다.

 

위 코드에서 Player가 트리거 박스에 들어오면 우선순위를 11로 만들고
나가면 9로 만들었는데 

A라는 시네머신 카메라를 사용하고 있고, Priority가 10이라고 가정하겠습니다.

B라는 시네머신 카메라는 Priority가 11이라면 해당 카메라가 주도권을 가져와 화면을 비추게 됩니다.

 

반대로 B 카메라의 Priority가 9라면 A카메라가 주도권을 가져와 화면을 비추게 됩니다.

 

정리하자면 플레이어는 Priority가 높은 카메라가 비추는 화면을 보게 됩니다. 

 

앞서 알려드린 우선순위(Priority)를 변경하기 위해서는 using Cinemachine;을 추가해 줘야 합니다.

 

결과

 

StarChaser 소개영상 - YouTube

 

위 게임을 개발하며 나오는 모든 카메라 연출은 시네머신 카메라(프리룩 카메라-FreeLook Camera, 버추얼 카메라-Virtual Camera)만을 활용했습니다.

 

뿐만 아니라 더 많은 카메라 기능들이 있는데 다른 글에서 다뤄보겠습니다.

 

이번 글에서는 유니티 시네머신을 활용해 버추얼 카메라를 추가하고 제어하는 방법에 대해서 알아봤습니다.

 

728x90

+ Recent posts