게임 구현에 필요한 필수적인 기능들을 어느정도 마무리하고 볼륨 늘리기에 들어갔다. 내가 맡은 부분은 튜토리얼. 기존에 만들었던 게임들과 마찬가지로 지금 게임은 게임 조작 방법에 대한 설명이 굉장히 부실하고, 임시로 만들어든 튜토리얼 페이지는 그냥 글로 설명만 주루룩 달려있었을 뿐이다.
이 부분은 중간 발표 피드백으로도 들었던 내용이었고, 개인적으로도 꼭 해보고 싶었기에 내가 튜토리얼을 제작하게 되었다.
튜토리얼을 구성하는 기술스택은 FSM이다. 튜토리얼은 하나하나 순서대로 동작을 확인하게 만들 예정인데, 만약 이것을 절차적 방식으로 하면 코드가 꼬이고 코드가 길어질 확률이 너무나 높았다. 그래서 미션 달성을 하면 다음 튜토리얼로 넘어가는 방식으로 제작을 하게 되었다.
이를 위해 계속해서 돌아가는 TutorialController 스크립트와 이 안에서 돌아갈 TutorialBase 스크립트가 핵심이다.
TutorialBase에서 Enter, Execute, Exit 메서드를 추상클래스로써 가지고있고 하나 달성할 때마다 다음 튜토리얼로 진행되는 방식이다.
생각보다 작업해야할 양이 많고, 기존에 사용하던 스크립트들을 최대한 활용하되 새로 만들어야 하는 부분도 많을 것 같아서 쉽지 않겠지만 이번 주 내에 최대한 진행해서 마무리를 해보고 싶다.
public class TutorialController : MonoBehaviour
{
[SerializeField]
private List<TutorialBase> tutorials;
[SerializeField]
private string nextSceneName = "";
private TutorialBase currentTutorial = null;
private int currentIndex = -1;
private void Start()
{
SetNextTutorial();
}
private void Update()
{
if (currentTutorial != null)
{
currentTutorial.Execute(this);
}
}
public void SetNextTutorial()
{
// 현재 튜토리얼의 Exit() 메서드 호출
if (currentTutorial != null)
{
currentTutorial.Exit();
}
// 마지막 튜토리얼을 진행했다면 CompletedAllTutorials() 메서드 호출
if (currentIndex >= tutorials.Count - 1)
{
CompletedAllTutorials();
return;
}
// 다음 튜토리얼 과정을 currentTutorial에 등록
currentIndex++;
currentTutorial = tutorials[currentIndex];
// 새로 바뀐 튜토리얼의 Enter() 메서드 호출
currentTutorial.Enter();
}
public void CompletedAllTutorials()
{
currentTutorial = null;
// 행동 양식이 여러 종류가 되었을 때 코드 추가 작성
// 현재는 씬 전환
Debug.Log("Complete All Tutorials");
if (!nextSceneName.Equals(""))
{
SceneManager.LoadScene(nextSceneName);
}
}
}
public abstract class TutorialBase : MonoBehaviour
{
// 해당 튜토리얼 과정을 시작할 때 1회 호출
public abstract void Enter();
// 해당 튜토리얼 과정을 진행하는 동안 매 프레임 호출
public abstract void Execute(TutorialController controller);
// 해당 튜토리얼 과정을 종료할 때 1회 호출
public abstract void Exit();
}