ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Unity Cinemachine Confiner change - 시네머신 confiner 변경
    쾌락없는 책임 (공부)/Unity 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처럼 사용하니 위 화면같은 연출이 잘 되었다. 여전히 카메라가 느리다는 단점이 있는것 빼고?

    반응형

    댓글

Designed by Tistory.