코드 및 공부/씬

씬 전환시 해당씬의 CinemachineConfiner로 교체하기

ekrxjvpvj0110 2024. 12. 23. 21:02

유니티 버전 - 2022.3.17f1

 

 

 

 

 

목차


  • 들어가며
  • 현 프로젝트 세팅
  • 코드

 

 

 

 

 

들어가며


해당 코드를 이용하여 할 수 있는것은 씬이 전환 될때 전환된 씬의 Polygon Collider 2D를 가져와서 Cinemachine의 Cinemachine Confiner 2D의 Bounding Shape 2D를 설정해 주는 것입니다

 

 

 

 

 

현 프로젝트 세팅


1. 해당 스크립트는 가상 카메라(CinemachineVirtualCamera)와 같은 오브젝트에 있습니다

2. 2D 환경입니다

3. 메인씬은 변하지 않고 필요한 씬이 Addtive 모드로 로드 / 언로드 됩니다

 

 

 

 

 

코드


// 전체 코드
// 기능과 무관한 부분은 생략 하였습니다

public class CinemachineConfinerChanger : MonoBehaviour
{
    private CinemachineConfiner2D cinemachineConfiner2D;

    
    private void Awake()
    {
        cinemachineConfiner2D = GetComponent<CinemachineConfiner2D>();
    }
    
    
    private void ChangeConfiner(object p_Args)
    {
        Scene scene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);

        GameObject[] objs = scene.GetRootGameObjects();

        foreach (GameObject obj in objs)
        {
            if (obj.CompareTag(Setting.ConfinerTag))
            {
                PolygonCollider2D polygonCollider2D = obj.GetComponent<PolygonCollider2D>();
                
                cinemachineConfiner2D.m_BoundingShape2D = polygonCollider2D;
                
                cinemachineConfiner2D.InvalidateCache();
                
                return;
            }
        }
    }
  
}

 

 

 

 

매개변수 object p_Args : 해당 프로젝트에서 필요에 의해 설정된것으로 없어도 무방합니다

private void ChangeConfiner(object p_Args)

 

 

 

가장 마지막으로 로드되어있는 씬을 가져옵니다 (현재의 경우 Farm)

Scene scene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);

 

 

 

Find 계열 함수 사용을 피하기 위해 Farm씬의 루트 오브젝트를 배열에 담아 오브젝트의 태그를 비교할 준비를 합니다

Polygon Collider 2D는 루트 오브젝트로 존재 하여야 합니다

GameObject[] objs = scene.GetRootGameObjects();

 

 

 

 

모든 루트 오브젝트가 들어있는 objs 배열의 각 요소(게임 오브젝트)의 태그가 BoundsConfiner인지 검사합니다

그리고 해당한다면 오브젝트의 PolygonCollider2D를 가져와 적용시켜주고 캐시된 confiner를 강제로 빼고 다시 계산하도록 하여줍니다

foreach (GameObject obj in objs)
{
    if (obj.CompareTag(Setting.ConfinerTag))
    {
        PolygonCollider2D polygonCollider2D = obj.GetComponent<PolygonCollider2D>();
        
        cinemachineConfiner2D.m_BoundingShape2D = polygonCollider2D;
        
        cinemachineConfiner2D.InvalidateCache();
        
        return;
    }
}



 Setting.cs
 [Header("시네머신")]
    public const string ConfinerTag = "BoundsConfiner";

 

 

 

코드가 실행되고 나면 바뀐 씬의 컨파이너가 적용되어있음을 확인 할 수 있습니다