Unity 2D Cinemachine 이용, Cinemachine y축 고정시키기.

농담고미고미·2024년 8월 14일

Unity 개발 일지

목록 보기
18/26
post-thumbnail

팀원이 클로버를 잘 구현해줬음! 클로버를 밟으면 고양이와 카메라가 뒤로 움직인다. 그러나 아직 문제가 남아있다. 뒤로 간 카메라가 다시 앞으로 안 온다. 그래서 패턴이랑 배경이 움직여야하는데, 안 움직이고 고정되는 오류가 발생함.

그래서 해결책으로 시네머신을 이용해보자!

Cinemachine이란? 카메라맨이다. 카메라맨이 원하는 대상을 따라 카메라를 움직이는 것처럼 작동한다.

시네머신 2D를 추가하고, Follow 프로퍼티에 Player를 드롭다운한다. 그럼 카메라는 이제 Player를 따라다닌다.

프로퍼티를 몇개 살펴보자면(유니티 공식 문서 참조), Look At 타겟은 게임 오브젝트가 조준할 게임 오브젝트를 지정한다.

Framing Transposer: Follow 타겟과 고정된 스크린 공간 관계로 움직인다.(감쇠는 선택 사항). 나는 감쇠는 필요없고, 고정된 스크린 공간 관계로 움직이기를 원해서 이걸 선택했다.
Aim을 Do nothing을 골라 회전을 막음.
Lens의 Ortho Size를 통해 보이는 화면크기를 조절할 수 있다.

근데 이렇게만 하면 1번째 사진처럼 오류가 생긴다. 시네머신은 Player를 따라가서, Player가 점프를 하면 화면도 위로 올라가야하고, 땅에 내려오면 카메라가 그만큼 다시 내려와야 하기 때문이다. 그렇기 때문에 1번째 사진처럼 위아래로 파란색 부분이 생긴다.

그럼, 시네머신의 y축을 고정시키면 된다.

유니티 Discussion에서 본 내용을 참고.

using UnityEngine;
using Cinemachine;

/// <summary>
/// y축을 고정시킬거야.
/// </summary>
[ExecuteInEditMode]
[SaveDuringPlay]
public class LockCameraY : CinemachineExtension
{
    [Tooltip("Lock the camera's Y position to this value")]
    public float m_YPosition = 0;

    protected override void PostPipelineStageCallback(
        CinemachineVirtualCameraBase vcam,
        CinemachineCore.Stage stage, ref CameraState state, float deltaTime)
    {
        if (stage == CinemachineCore.Stage.Body)
        {
            var pos = state.RawPosition;
            pos.y = m_YPosition;
            state.RawPosition = pos;
        }
    }
}

코드를 살펴보자. 나는 시네머신의 y축을 0으로 고정하고 싶기에, m_YPosition = 0을 함. 상속 받은 PostPipelineStageCallback을 오버라이딩 합시다.

Body 단계는 카메라의 위치를 계산하는 단계이므로 stage == CinemachineCore.Stage.Body를 한다. 참고로 Body는 2번째 stage이다.

state.RawPosition은 카메라의 현재 월드 좌표를 나타낸다. 월드 좌표는 게임 세계에서의 절대적인 위치를 나타낸다. Unity의 Cinemachine에서는 카메라의 움직임과 위치를 제어할 때, 기본적으로 월드 좌표를 사용한다는 거 체크!

막상 코드 보면 쉽다. 카메라의 월드 좌표계의 현재 위치를 받아서, 위치의 y값을 0으로 바꿔준다. 그리고 바꾼 위치를 카메라의 위치로 새로 넣는다. 그럼 끝! 아하. 유니티 공식 문서를 잘 참조하자.

그럼 잘 작동한다. 참고로 사진 속 Spawn Point도 (기즈모로 봐야지 보인다.) 카메라가 뒤로 감에 따라 함께 뒤로 움직인다. Spawn point의 좌표를 월드 좌표계로 바꿔서 고정시켜야겠다! 그래야 일관된 장소에서 패턴이 스폰된다. (이건 다음에 ㅎㅎ)

그럼 끝! 시네머신은 참 편리한 도구니깐 잘 활용하자.

profile
농담곰을 좋아해요 말랑곰탱이

0개의 댓글