-
Notifications
You must be signed in to change notification settings - Fork 3
ContentManager
필수. WJson 오브젝트를 만들어 넣어주세요.
설명. Content의 데이터가 저장됩니다.
초기 State를 설정할 수 있습니다.
기본 0으로 설정되어 있습니다.
참고. State 조건은 다음과 같습니다. (0 <= State <= ContentStateMax)
음수는 될 수 없습니다.
필수. SeatDataOption 오브젝트 2개를 만들어 넣어주세요.
각 SeatDataOption 오브젝트의 내용은 아래처럼 만들어주세요.
주의. 여기서 명시한 Name은 게임 오브젝트의 이름을 설정하라는 것이 아니라, SeatDataOption의 Field 중 Name을 설정하라는 것입니다.
- SeatDataOption
- Name: TurnData
- 설명. Content의 Turn이 변경될 때 초기화되는 휘발성 데이터입니다.
- SeatDataOption
- Name: IntData
- 설명. 따로 초기화하지 않는 한, 값이 유지되는 데이터입니다.
설명. Content에서 각 Seat에 저장할 Data를 정의합니다.
위에서 필수적으로 만들어야하는 TurnData와 IntData말고도, 원하는 데이터를 만들어 정의할 수 있습니다.
이때, 값 타입은 정수로 고정됩니다.
정수가 아닌 값을 설정하려면, 각 Seat의 SeatData (WJson)에 직접 설정해주세요.
State의 최대값을 설정할 수 있습니다.
만약 State가 최대값을 넘어가면, 0으로 루프됩니다.
ContentManager는 아래와 같이 사용할 수 있도록 만들어졌습니다.
ContentManager를 상속받는 Manager Class를 만드세요.
Content의 상태(State) 혹은 단계(Step)을 표현하는 Enum을 정의하세요.
ContentManager.ContentState(int)는 이 Enum을 통해 관리할 것입니다.
각 상태 혹은 단계에 따른 Event를 새 ContentManager에 정의하세요.
이때, Udon에서는 Delegate를 사용할 수 없기 때문에, ContentManager 내부에 함수를 만드는 것으로 대체합니다.
참고. 아래는 ContentManager를 상속받는 QuizManager.cs의 코드 일부입니다.
public virtual void OnWait()
{
WDebugLog($"{nameof(OnWait)}");
if (IsOwner() == false)
return;
foreach (WSeat seat in Seats)
seat.ResetTurnData();
}
public virtual void OnQuizTime() => WDebugLog($"{nameof(OnQuizTime)}");
public virtual void OnSelectAnswer() => WDebugLog($"{nameof(OnSelectAnswer)}");
public virtual void OnShowPlayerAnswer() => WDebugLog($"{nameof(OnShowPlayerAnswer)}");
public virtual void OnCheckAnswer() => WDebugLog($"{nameof(OnCheckAnswer)}");
public virtual void OnExplaining() => WDebugLog($"{nameof(OnExplaining)}");
public virtual void OnScoring() => WDebugLog($"{nameof(OnScoring)}");ContentManager로부터 OnContentStateChange(DataChangeState changeState) 함수를 상속받아 오버라이딩하세요.
ContentState 값이 바뀔 때 마다 (즉, Content의 상태 혹은 단계가 바뀔 때마다) OnContentStateChange(~)가 호출됩니다.
이 함수에서 현재 상태 혹은 단계에 맞게 Event를 호출하세요.
참고. 아래는 ContentManager를 상속받는 QuizManager.cs의 코드 일부입니다.
protected override void OnContentStateChange(DataChangeState changeState)
{
// if (changeState != DataChangeState.Less)
{
if (ContentState == (int)QuizContentState.Wait) OnWait();
else if (ContentState == (int)QuizContentState.ShowQuiz) OnQuizTime();
else if (ContentState == (int)QuizContentState.SelectAnswer) OnSelectAnswer();
else if (ContentState == (int)QuizContentState.ShowPlayerAnswer) OnShowPlayerAnswer();
else if (ContentState == (int)QuizContentState.CheckAnswer) OnCheckAnswer();
else if (ContentState == (int)QuizContentState.Explaining) OnExplaining();
else if (ContentState == (int)QuizContentState.Scoring) OnScoring();
}
base.OnContentStateChange(changeState);
}