쾌락없는 책임 (공부)/Unity

Unity Cinemachine Confiner change - 시네머신 confiner 변경

허스크 2021. 7. 20. 23:03
반응형

서론

 제목 보면 무슨 개소리지 싶지만 유니티 내에서 제공하는 시네머신의 속성중 Confiner에서 Bounding Shape 2D를 스크립트에서 제어하는 방법이다. 이를 이용하면 시네머신 1개의 영역을 런타임중 동적으로 할당할 수 있다.

 

코드

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;

public class ConfinerChange : MonoBehaviour
{
    public static ConfinerChange confinerChangeInstance;
    public static CinemachineConfiner confiner;
    void Awake()
    {
        confinerChangeInstance = this;
        confiner = FindObjectOfType<CinemachineConfiner>();
    }

    public static void CameraBorder(Collider2D newConfiner)
    {
        confiner.m_BoundingShape2D = newConfiner;
    }
}

 

위 FindObjectOfType가 정말 안좋은거지만 일단 구현하는게 우선이라 넣어서 만들었다. m_BoundingShape2D 를 변경함으로서 시네머신의 영역을 동적으로 할당할 수 있는 것이다

 

꼴을 보아라

 

그런데 이게 정말 보고 싶었는가?

다른 게임들처럼 스무스한 전환을 바랬지만 막상 만져보니 딱딱 변경되는 괴랄한 연출이 완성되었다. 카메라 메모리좀 아껴보겠다가 유저들 다 빠져나갈 연출이란 말이다.

 

그래서 생각해본건 카메라를 2개를 두고 번갈아가가면서 전환하는 방식을 사용해보기로 했다.

일단 원하는건 위와 같은 카메라 움직임이다

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;

public class CameraManager : MonoBehaviour
{
    public static CameraManager camManager;
    public static bool isCam1On;
    [SerializeField] GameObject cam1;
    [SerializeField] GameObject cam2;
    public CinemachineConfiner cam1Confiner;
    public CinemachineConfiner cam2Confiner;
    void Awake()
    {
        camManager = this;
        isCam1On = true;
    }

    public static void ChangeCam(Collider2D border)
    {
        if(isCam1On)
        {
            camManager.cam2Confiner.m_BoundingShape2D = border;
            isCam1On = false;
            camManager.cam2.gameObject.SetActive(true);
            camManager.cam1.gameObject.SetActive(false);
        }
        else
        {
            camManager.cam1Confiner.m_BoundingShape2D = border;
            isCam1On = true;
            camManager.cam1.gameObject.SetActive(true);
            camManager.cam2.gameObject.SetActive(false);
        }
    }

    
}

 

싱글톤으로 만들어진 위 오브젝트를 gamemanager처럼 사용하니 위 화면같은 연출이 잘 되었다. 여전히 카메라가 느리다는 단점이 있는것 빼고?

반응형