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를 호출할 경우 위와 같은 에러가 표시됩니다. 이미 객체가 상태 진입이 되었는데 다시 상태를 바꾸는 행동을 지시했기 때문입니다.