이런 베이스를 먼저 준비.
public abstract class BaseUI : MonoBehaviour
{
protected UIManager uiManager;
public virtual void Init(UIManager uiManager)
{
this.uiManager = uiManager;
}
protected abstract UIState GetUIState();
public void SetActive(UIState state)
{
gameObject.SetActive(GetUIState() == state);
}
}
여기서
public void SetActive(UIState state)
{
gameObject.SetActive(GetUIState() == state);
}
이 코드가 핵심적인 역할을 함.
public enum UIState
{
Home,
Game,
Score,
}
UI의 상태를 나타낼 수 있도록 열거형을 만든다.
이제 전환될 UI에 스크립트를 만들어 달아준다.
public class HomeUI : BaseUI
{
protected override UIState GetUIState()
{
return UIState.Home;
}
public override void Init(UIManager uiManager)
{
base.Init(uiManager);
}
}
열거형에는 Home, Game, Score 총 3개가 있으니 3개의 UI에 이름과 return 값만 맞게 설정해서 만든다.
이제 처음의 UIMANAGER에서 오브젝트의 스크립트들을 Get한뒤
public void ChangeState(UIState state)
{
currentState = state;
homeUI?.SetActive(currentState);
gameUI?.SetActive(currentState);
scoreUI?.SetActive(currentState);
}
이렇게 함수를 사용하면 (?는 null 검사용이다.) 각각의 스크립트의 Setactive가 자신의 GetUIState에 따라서 비교를 한다.
ex) HomeUI의 경우 UIState 열거형의 Home을 반환하니.
currentState가 UIState.Home일 경우 Home == Home이므로 다른 UI들은 false로 비활성화되고 HomeUI가 켜질 것이다.