Carrot
본문 바로가기
Unity/멋쟁이사자처럼 부트캠프

[멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(52일차) - FPS 게임 마무리 (9)

by 독기품은토끼 2025. 7. 31.
✅ 오늘의 학습
1. 씨네머신 활용
2. 3D 모델링 애니메이션 & 리깅 실습

1. 씨네머신 (Cinemachine)

1. Cinemachine Track

 

씨네머신은 게임 플레이 도중에 정해진 연출을 보여주는 기능으로 오프닝이나 엔딩 또는 스토리의 중요한 변곡점에서 사용한다.

 

 

씨네머신이 카메라 연출 도구라면, 타임라인은 연출 타이밍을 편집하는 도구이다.
Unity 안에서 애니메이션, 카메라 전환, 오브젝트 제어 등을 시퀀스(Sequence)나 시간(Second) 방식으로 연출할 수 있다.

 

 

씬 안에 빈 게임 오브젝트를 하나 생성하고 여기에 Playable Director 컴포넌트를 추가했다.


▶︎ Playable Director는 타임라인을 실행하고 제어하는 핵심 컴포넌트이다.
씬 안에 배치된 오브젝트들을 타임라인 안에서 시점별로 어떻게 움직일지, 어떤 타이밍에 연출이 바뀔지를 결정한다.

Playable Director에 새로운 타임라인 애셋을 생성하고 연결하면 연출을 시간 단위(Update Method - Game Time)로 구성할 수 있는 준비가 완료된다.

 

 

타임라인을 연출하기 위해선 어떤 오브젝트가 어떻게 행동할지를 정의해 주는 트랙이 필요하다.
그래서 타임라인 안에 Cinemachine Track을 추가했다.

 

▶︎ Cinemachine Track은 씨네머신 카메라의 전환 타이밍을 제어하는 트랙이다.
이 트랙을 통해 0초에는 카메라 A, 2초부터는 카메라 B로 전환 같은 연출을 만들 수 있다.
즉, 씬의 분위기나 구도를 카메라 전환으로 제어하기 위한 장치이다.

 

 

Cinemachine Track을 활용하려면, 실제로 움직일 수 있는 가상 카메라(Virtual Camera)가 필요하다.
그래서 Cinemachine Camera를 하나 생성해주었다. (과거에는 버츄얼 카메라라고 불렀다)

 

▶︎ Virtual Camera는 ‘이런 시점에서 찍고 싶다’는 요청을 담는 가상의 카메라다.
실제 화면에 렌더링 되는 건 Main Camera지만

Main Camera는 씬 안에서 여러 Virtual Camera 중 어떤 걸 현재 보여줄지 결정하는 역할을 한다.

 

이미지는 메인 카메라이지만 별도 카메라를 생성해서 넣어주세요.

 

참고로 Cinemachine을 처음 설치하면 함께 생성되는 CinemachineBrain은 카메라 제어의 핵심인데,

이번 프로젝트에서는 Camera 컴포넌트를 새로 만든 후 CinemachineBrain 컴포넌트를 붙여둔 상태이기 때문에
별도로 생성된 Brain 오브젝트는 삭제해 주고 Virtual Camera만 남겨서 타임라인에 연결해 주었다.

 

이렇게 구성하면,

  • Playable Director가 전체 연출의 흐름을 통제하고,
  • Timeline 안의 Cinemachine Track이 카메라 시점을 전환하며,
  • Virtual Camera는 실제로 보여줄 화면 시점을 담는 구조가 된다.

 

 

씨네머신 카메라 오브젝트를 잡고 원하는 위치에서 Ctrl + Shift + F 단축키를 눌러주면 카메라가 이동한다.

 

 

타임라인에 배치한 씨네머신 카메라를 배치해 주면 컷 전환이 실행된다.

 

 


 

 

Cinemachine Camera에는 카메라 흔들림 효과를 위한 Noise 기능도 포함되어 있다.
이 기능은 특정 상황에서 화면을 흔들어주는 연출 효과를 줄 수 있다.

 

LooAt Target 창은 우측 설정버튼 통해서 생성할 수 있다.

 

그리고 특정 오브젝트를 따라다니면서 바라보는 카메라 연출도 가능하다.

 

1. Tracking Target / Look At Target

  • 둘 다 Zombie1으로 설정되어 있음 → 위치도 따라가고, 시선도 좀비를 바라보도록 설정

2. Position Control: Follow

  • Procedural Component에서 Cinemachine Follow가 활성화됨
  • Follow Offset 값 (X: 0, Y: 2, Z: -10) → 좀비 기준 뒤쪽에서 살짝 위로 떠 있는 시점
  • 좀비가 움직이면 카메라도 함께 따라 움직인다

3. Rotation Control: Hard Look At

  • 카메라가 항상 좀비 쪽을 정확히 바라보도록 회전

 

2. Animation Track

Animation Track은 타임라인에서 오브젝트에 애니메이션을 직접 추가할 수 있게 해주는 트랙이다.
Cinemachine이 카메라 시점을 연출하는 도구라면, Animation Track은 UI나 3D 오브젝트의 동작을 시간에 맞춰 연출할 수 있도록 돕는다.

 

 

이번 연출에서는 화면 전환(Fade in/out) 효과를 위해 Animation Track을 사용해주었다.
먼저 UI - Image 오브젝트를 생성해 전체 화면을 덮는 검은색 이미지를 만들고,
그 오브젝트에 애니메이션을 만들어서 알파 값(투명도)을 조절하는 방식으로 페이드 효과를 구현했다.

 

3. Activation Track

 

Activation Track은 특정 오브젝트를 지정된 시간에 활성화하거나 비활성화하는 트랙이다.
예를 들어 컷신이 진행될 때 어떤 오브젝트를 나타나게 하거나 카메라 연출이 끝난 뒤 플레이어 조작 오브젝트를 다시 활성화하는 식으로 활용할 수 있다.

 

 

씨네머신 카메라가 작동하는 구간에만 Fade 오브젝트와 Virtual Camera 오브젝트를 활성화하도록 설정하였다.

씨네머신이 종료되면 이 오브젝트들은 비활성화되기 때문에 자동으로 Main Camera 시점으로 자연스럽게 복귀하게 된다.

 

using Unity.Cinemachine;
using UnityEngine;
using UnityEngine.Playables;

public class DirectorAction : MonoBehaviour
{
    private PlayableDirector pd;

    public Camera targetCam;

    void Start()
    {
        pd = GetComponent<PlayableDirector>();
        pd.Play();
    }

    void Update()
    {
        if (pd.time >= pd.duration) // 재생 시간이 끝났을 때
        {
            if(Camera.main == targetCam)
                targetCam.GetComponent<CinemachineBrain>().enabled = false;

            targetCam.gameObject.SetActive(false);
            gameObject.SetActive(false);
        }
    }
}

 

스크립트를 활용하여 Virtual Camera(Brain Camera)를 비활성화시켜줄 수도 있다.

 

4. FreeLook Camera

FreeLook Camera는 3인칭 카메라에 특화된 카메라이다.

플레이어 주변을 마우스나 컨트롤러 입력에 따라 자유롭게 회전시킬 수 있다.

 

 

타깃에 원하는 오브젝트만 배치해 주면 손쉽게 구현이 가능하다.

 

Peak 플레이 하면서 캡처 ㅎ-ㅎ

 

이 카메라에 대해 배울 때 바로 생각난 게임이다ㅎㅎ

최근에 시작하게 되었는데 플레이어가 죽으면 살아있는 플레이어 주변에 붙어서 자유롭게 플레이어를 구경할 수 있었다.

 

 

참고로 씬 뷰에서 다른 카메라의 시점을 확인하고 싶을 때에는

하단 툴에 있는 카메라 모양을 선택 후 원하는 카메라를 선택하면 해당 카메라 시점을 확인할 수 있다.

 

5.  Signal

Signal은 타임라인에서 특정 지점에 도달했을 때 원하는 이벤트를 호출할 수 있는 시스템이다.

 

 

 

[사용법 요약]

 

  • Signal Receiver를 신호를 받을 오브젝트에 추가
  • 타임라인의 Signal Track 생성
  • Signal Emitter를 원하는 시점에 배치
  • Signal Asset 생성 후 연결
  • Signal Receiver에서 해당 Signal에 반응할 UnityEvent 연결

 

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Playables;
using UnityEngine.Timeline;

public class Emitters : MonoBehaviour
{
    public PlayableDirector timeline;
    public SignalReceiver receiver;
    public SignalAsset signal;

    void Start()
    {
        SetSignalEvent();
    }

    public void OnTimelineSpeed(float speed)
    {
        // 타임라인의 속도 제어
        timeline.playableGraph.GetRootPlayable(0).SetSpeed(speed);
    }

    // 시그널에 이벤트를 등록하는 함수
    public void SetSignalEvent()
    {
        UnityEvent eventContainer = new UnityEvent(); // 이벤트를 담는 변수

        // 이벤트 등록
        eventContainer.AddListener(() =>
        {
            Debug.Log("이벤트 등록");
            OnTimelineSpeed(0.2f);
            Debug.Log("Timeline 속도 0.2 설정");
        });

        receiver.AddReaction(signal, eventContainer); // signal에 Event 연결
    }
}

 

 

Signal을 활용하기 위해 Unity Event 네임 스페이스를 사용해 주었는데

추후에 Unity Event에 대해 더 상세하게 배울 예정이다.

 

 

 

2. Mixamo

 

Mixamo

 

www.mixamo.com

 

믹사모는 다양한 3D 캐릭터의 모델링과 애니메이션을 무료로 제공하는 사이트이다.

 

 

Unity에서 사용할 수 있는 형식으로 다운로드할 수 있어서 복잡한 애니메이션 작업도 비교적 간단하게 처리할 수 있다.

(캐릭터 선택 후 애니메이션을 선택하면 캐릭터 모델링과 애니메이션 모두 다운로드할 수 있다)

 

 

믹사모에서 모델을 다운로드한 후 Unity에 임포트 하면,

캐릭터가 사람 형태일 경우 Rig의 Animation Type을 Humanoid로 설정해 줘야 애니메이션이 정상적으로 작동한다.

 

 

가끔 임포트 한 모델의 텍스처가 깨져 보일 수 있는데

이럴 때에는 Unity 내에서 자동으로 텍스처를 추출하고 적용해 줄 수 있다.
Materials 탭에서 Textures - Extract Textures... 버튼을 클릭하면 텍스처가 정상적으로 설정된다.

 

1. Animation

3D 모델링 된 캐릭터에 애니메이션을 적용해 주기 위해서는 애니메이션 파일과 캐릭터 모델의 아바타(Avatar)가 일치해야 한다.

 

Unity에서는 외부에서 다운로드한 애니메이션 파일의 Avatar를 캐릭터의 Avatar로 바꿔주면 해당 캐릭터에 외부 애니메이션도 자연스럽게 적용할 수 있다.

 

 

애니메이션을 적용했을 때 캐릭터의 위치가 엉뚱한 곳으로 가거나, 방향이 이상하게 틀어져 있다면,
이는 애니메이션 자체에 저장된 루트 모션 정보(Pivot, 방향, 위치 등) 때문일 수 있다.

 

이 경우 애니메이션 파일을 선택하고 Inspector - Root Transform Based Upon 항목을 Original으로 변경해서 조정해 줄 수 있다.
필요하다면 Offset 수치도 직접 수정해서 자연스럽게 맞춰줄 수 있다.

 

1.1. Avatar Mask

 

Humanoid 리깅이 적용된 캐릭터의 경우 신체 부위별로 애니메이션을 나눠서 적용하는 것이 가능하다.
이럴 때 사용하는 게 바로 Avatar Mask다.

 

새 마스크 파일을 만든 후 Humanoid 탭에서 애니메이션을 적용할 부위만 체크해 준다.

 

 

이렇게 빨갛게 비활성화된 부위는 애니메이션 영향을 받지 않게 된다.

 

1.2. Layer

부위별 애니메이션을 실제로 적용하려면 Animator의 Layer 기능을 활용해야 한다.

 

Animator 창에서 새로운 레이어를 추가하고 해당 레이어에 Avatar Mask를 연결한다.

 

 

그리고 각 레이어에는 서로 다른 애니메이션 동작을 넣어주었다.

  • Base Layer: 걷는 애니메이션 (전신 적용)
  • Grenade Layer: 상체만 수류탄을 던지는 애니메이션

각 레이어의 Weight를 조절하거나 조건(Trigger 등)을 설정해 주면
걷다가도 동시에 상체에서 수류탄을 던지는 동작 같은 걸 자연스럽게 표현할 수 있다.

 

 

 

2. Rigging

애니메이션을 조금 더 자연스럽게 만들고, 특정 부위를 코드나 트리거로 직접 조작하려면 리깅(Rigging) 작업이 필요하다.

 

Unity에서 제공하는 Animation Rigging 패키지를 사용하면 Inverse Kinematics(IK) 같은 기능을 쉽게 적용할 수 있다.

 

 

상단 메뉴에서 Animation Rigging - Bone Renderer Setup을 클릭해서

캐릭터의 본(뼈) 구조를 시각적으로 확인할 수 있도록 설정한다.

 

 

그런 다음 캐릭터 오브젝트에 Rig와 Rig Builder 컴포넌트를 추가해 준다.
이 두 컴포넌트는 나중에 여러 제어를 추가할 수 있게 해주는 기반 역할을 한다.

 

Rig

하나의 리깅 레이어 또는 리깅 블록
이 안에는 실제로 애니메이션 제어를 담당하는 다양한 Constraint(제약)들이 들어가게 됨

즉, 이 부위에 어떤 제어를 할 거야 라는 단위의 묶음이다.

 

  • Two Bone IK Constraint
  • Multi-Parent Constraint
  • Multi-Position Constraint
  • Chain IK Constraint

 

Rig Builder

Rig Builder는 Animator와 Rig 사이를 연결해 주는 브리지 역할을 한다.

이걸 캐릭터의 최상위 오브젝트(보통 Animator가 붙은 오브젝트)에 붙여주고,
그 안에 사용할 Rig를 리스트로 추가해 줘야 Rig들이 정상 작동한다.

 

 

팔이나 다리처럼 두 개의 본으로 구성된 부위에 IK 제어를 적용하기 위해 Two Bone IK Constraint 컴포넌트를 추가해 준다.
Tip에는 조작하고 싶은 끝부분(손 끝, 발끝)을 지정해 주고, Auto Setup from Tip Transform 버튼을 눌러주면 나머지(Limb, Mid)는 자동으로 채워진다.