개요
다른걸 만지기 전에 일단 구조를 뜯어고치는 것이 먼저입니다.
그 시작은 눈에 잡혔던 튜토리얼 구조와 가장 심각한 맵 구조입니다.
Tutorial
기존의 구조
기존에 사용하던 구조는 다음과 같은 플로우를 띕니다.
튜토리얼 한 스텝을 담당하는 Tutorial 클래스의 Update를 TutorialManager가 계속해서 실행시켜주고 Update에서 넘어오는 값이 true (현재 튜토리얼의 스텝이 완료 되었다는 뜻)라면 다음 튜토리얼로 넘기는 구조를 사용합니다.
수정
나름대로 괜찮은 구조 같아보이지만 조금 수정해야할 이유가 바로 각각의 튜토리얼 스텝들이 모두 MonoBehaviour를 상속받기때문에 생성자 호출 없이 객체를 가져오기 위해 컴포넌트로 추가해야 하기 때문입니다.
그렇기 때문에 MonoBehaviour를 때버리고 일반 클래스로 관리해주겠습니다.
public abstract class Tutorial
{
protected TutorialManager _manager;
public Tutorial(TutorialManager manager)
{
_manager = manager;
}
public abstract void OnStart();
public abstract bool UpdateTutorial();
public abstract void OnEnd();
}
혹시 코루틴을 사용하거나 인게임 오브젝트에 상호작용 해야 할때를 대비해서 각각의 Tutorial들은 매니저를 가지고 있게 해줍니다.
그리고 이제 TutorialManager를 수정해줍시다.
FSM을 만들 때 썼던 Reflection 코드를 바탕으로 짜주면 됩니다.
private void Awake()
{
for(int i = 0; i < 9; i++)
{
try
{
Type t = Type.GetType($"Tutorial{i}");
Tutorial tutorial = Activator.CreateInstance(t, this) as Tutorial;
tutorialList.Add(tutorial);
}
catch (Exception e)
{
Debug.LogError($"Tutorial{i} is loading error! Massage: {e.Message}");
}
}
}
마지막으로 Update에서 실행만 시켜주면 튜토리얼 끝입니다.
private void Update()
{
if (_currentTutorial.UpdateTutorial())
{
_currentTutorial.OnEnd();
_currnetIndex++;
_currentTutorial = tutorialList[_currnetIndex];
_currentTutorial.OnStart();
}
}
마치는 말
첫 글은 가볍게 가볼까요.
맵 구조 수정이 생각보다 길어질 것 같아서 같은 글에 넣기엔 조금 그렇기도 하더라구요.
오늘도 읽어주셔서 감사합니다. 당신이 왔다간 그 방문수 1 자체가 제게 큰 힘이 됩니다.
'개발 > 격 자' 카테고리의 다른 글
RE : 격 자 : 세번째 프로젝트 # 2 : 맵 구조 수정 (2) | 2024.08.03 |
---|---|
RE : 격 자 : 세번째 프로젝트 # 0 : 리메이크? 리워크? (1) | 2024.07.23 |
격 자 | 세번째 프로젝트 (0) | 2024.03.03 |