쾌락없는 책임 (공부)/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처럼 사용하니 위 화면같은 연출이 잘 되었다. 여전히 카메라가 느리다는 단점이 있는것 빼고?
반응형