사용 방법

2019. 7. 27. 19:59뷰 전환 시스템

최초 메인 뷰 초기화

최초 메인 뷰에 해당되는 클래스는 CView를 상속받습니다.. 여기서 LobbyView를 최초 뷰 입니다.

public class LobbyView : CView
{
}
최초 메인 뷰인 LobbyView 구현

 

최초 메인 뷰를 스택에 Push합니다. 최초 메인 뷰를 Push할 때는 CView의 Open이 아니라 꼭 SInitialize으로 초기화해야 합니다. LobbyManager의 경우 Lobby에서 사용되는 각 공통 자원을 참조하기 위한 스크립트라고 보시면 됩니다.

public class LobbyManager : SInstance<LobbyManager>
{
    protected override void Awake()
    {
        CView.SInitialize(m_LobbyView);
    }
 
    [SerializeField] private LobbyView m_LobbyView;   
}
최초 메인 뷰인 LobbyView Push

 

최초 메인 뷰 뿐만 아니라 메인 뷰에 해당되는 뷰 역시 CView를 상속받으면 됩니다.

public class EquipmentView : CView
{
}
메인 뷰인 EquipmentView 초기화

 

EquipmentView는 다른 목적으로 사용되는 메인 뷰 입니다.

활성화/비활성화

메인 뷰를 활성화할 때는 CView.SOpen(객체 명)을 호출하시면 됩니다.

public class LobbyView : CView
{
    public void OpenEquipmentView()
    {
        CView.SOpen(m_EquipmentView);
    }
 
    [SerializeField] private EquipmentView m_EquipmentView;
}
메인 뷰(EquipmentView) 활성화

 

하나의 뷰에서 다수의 뷰를 관리한다면 다음과 같은 처리 방식으로 활성화도 가능합니다.

public class LobbyView : CView
{
    public void OpenView(int index)
    {
        if (m_MainViews != null && 
            index < m_MainViews.Length &&
            m_MainViews[index] != null)
        {
            CView.SOpen(m_MainViews[index]);
        }
        else
        {
            Debug.LogError("OpenView의 처리가 유효하지 않습니다.");
        }
    }
 
    [SerializeField] private CView[] m_MainViews;
}

비활성화시에는 CView.SClose()을 호출하시면 됩니다 내부에서 스택을 사용하여 뷰의 순서를 관리하기 때문에 Close시 객체를 지정할 필요가 없습니다.

public class LobbyView : CView
{
    public void CloseView()
    {
        CView.SClose();
    }
}
메인 뷰 비활성화

활성화 직전/비활성화 직전에 처리

활성화 직전에 처리할 경우 Opening()함수를 override하시면 됩니다. 처리 이후 base.Opening() 함수를 호출해줘야 뷰가 활성화가 됩니다.

public class LobbyView : CView
{
    protected override void Opening()
    {
        base.Opening();
    }
}
메인 뷰 활성화 직전

 

비활성화도 활성화와 마찬가지로 처리하시면 됩니다. Closing() 함수를 오버라이딩을 하고 처리 이후 base.Closing()을 호출하면 됩니다.

public class LobbyView : CView
{
    protected override void Closing()
    {
        base.Closing();
    }
}
메인 뷰 비활성화 직전

빽 키 설정하는 방법

빽 키를 눌렀을 때 한 곳에서 관리할 수 있는 매니저 스크립트에 구현합니다.

public class LobbyManager : SInstance<LobbyManager>
{
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            CView.SClose();
        }
    }
}
관리자 스크립트에 빽 키 설정

 

다음은 로비 뷰(최초 메인 뷰)의 경우 빽 키 처리를 위해서 Closing을 override를 해야합니다. override를 받아야하는 이유는 로비 뷰가 마지막 뷰이므로 빽 키를 눌렀을 때 종료 팝업을 활성화해야 되기 때문입니다. 종료 팝업을 별도로 처리하려면 구현을 하실 필요는 없지만 반드시 override는 해야됩니다. 로비 뷰는 비활성화가 되면 안 되기 때문입니다.

public class LobbyView : CView
{
    protected override void Closing()
    {
        if (CView.SIsBase())
        {
            Debug.Log("Open ExitGamePopup");
        }
    }
}
로비 뷰(최초 메인 뷰)는 반드시 Closing을 override합니다.

PopupView 빽 키 설정

팝업 뷰의 경우 메인 뷰 위에 활성화가 됩니다. 팝업 뷰가 활성화된다고 해서 메인 뷰가 [활성화/비활성화]되는 것은 아닙니다. 팝업 뷰는 유저의 행위 혹은 프로세스의 특정 조건에 의해 활성화되는 것 입니다. 그렇기 때문에 팝업 뷰가 활성화가 되었을 때 이전 뷰를 비활성화를 시키는 로직이 필요없고 비활성화가 되었을 때 이전 뷰를 활성화를 시키는 로직이 필요없습니다.

public abstract class PopupView : CView
{
    protected override void Opened()
    {
        CView.SPush(this);
        base.Show();
    }
 
    protected override void Closed()
    {
        base.Hide();
        CView.SPop();;
    }
}
PopupView 설정

기타

뷰 전환 시 TweenAlpha와 연계되는 경우

연출 타이밍에 맞추어서 뷰를 전환해야 되므로 Opening/Closing을 상속받아 Hide시키는 타이밍을 별도로 지정해야 됩니다.

뷰 스크립트는 그대로 유지하고 객체들만 [활성화/비활성화]를 처리하고자 하는 경우

[활성화/비활성화]하고자 하는 객체들을 모아둔 부모 객체를 하나를 생성한 다음에 해당 View 스크립트의 매개변수와 연결 후 스크립트의 Opening/Closing에서 부모 객체를 [할성화/비활성화]를 하시면 됩니다.

 

팝업 뷰 이외에 메인 뷰 안에서 빽 키를 받아야하는 서브 뷰가 필요할 경우

메인 뷰와 같이 CView를 상속받고 해당 메인 뷰 안에서 CView.Open(객체 명)를 호출하시면 됩니다.

 

[GameObject is already being activated or deactivated] 디버그 창에 출력될 경우

Closed에서 Hide 함수를 호출했는데 위와 같은 에러가 뜰 경우 OnEnable/OnDisable과 관련이 있을 가능성이 큽니다. 예를 들면 OnDisable이 호출된 상태에서 SetActive를 호출할 경우 위와 같은 에러가 표시됩니다. 이미 객체가 상태 진입이 되었는데 다시 상태를 바꾸는 행동을 지시했기 때문입니다.

 

 

'뷰 전환 시스템' 카테고리의 다른 글

용어  (0) 2019.07.27
개요  (0) 2019.07.27