본문으로 건너뛰기

튜토리얼 시스템

게임 내 튜토리얼을 노드(ScriptableObject) 기반으로 설계합니다. 하드코딩 없이 기획자가 수정 가능하고, 스킵·재진입·저장·복구를 기본 지원합니다.

구조

TutorialSystem — 순수 C# 인스턴스. 완료 상태 저장/복원 관리
└── TutorialRunner — 실제 스텝 실행 코루틴 담당 (MonoBehaviour)

TutorialSequence — ScriptableObject. 스텝 목록 + 스킵 허용 여부
└── TutorialStep[] — ScriptableObject 베이스. 구체 스텝을 상속해서 제작

기본 제공 스텝

스텝설명
HighlightButtonStepUI 요소를 색상으로 강조하고 특정 액션 대기
WaitForActionStep키 이름으로 등록된 플레이어 액션 대기
DialogueStep메시지 패널 표시 + 자동 진행 또는 클릭 대기
DelayStepN초 대기

빠른 시작

1. 씬에 TutorialRunner 추가

// 코루틴 실행이 필요하므로 TutorialRunner만 GameObject에 붙입니다.
// TutorialSystem은 코드에서 생성합니다.

2. TutorialSequence 에셋 만들기

Project 창 → 우클릭 → Create → AchUtils/Tutorial/Tutorial Sequence

인스펙터에서 스텝을 추가합니다.

SequenceId : "FirstGacha"
CanSkip : true
Steps:
[0] HighlightButtonStep — GachaButton 강조, WaitForAction: "GachaClick"
[1] DialogueStep — "캐릭터를 획득했습니다!"
[2] HighlightButtonStep — EquipButton 강조

3. 튜토리얼 시작

[SerializeField] TutorialRunner tutorialRunner;
[SerializeField] TutorialSequence gachaSequence;

private TutorialSystem tutorialSystem;

void Awake()
{
tutorialSystem = new TutorialSystem(tutorialRunner);
}

void OnDestroy()
{
tutorialSystem.Dispose();
}

// 이미 완료한 튜토리얼은 자동으로 건너뜁니다.
tutorialSystem.StartTutorial(gachaSequence);

// 강제 재시작 (완료 여부 무시)
tutorialSystem.StartTutorialForce(gachaSequence);

4. 플레이어 액션 알리기

버튼 OnClick 또는 게임 이벤트 발생 시 호출합니다.

// 버튼 클릭 핸들러
public void OnGachaButtonClicked()
{
tutorialSystem.TriggerAction("GachaClick");
// 이후 게임 로직 ...
}

API

TutorialSystem

TutorialSystem(TutorialRunner runner, bool loadOnCreate = true)

// 튜토리얼 시작 (완료된 경우 무시)
void StartTutorial(TutorialSequence sequence)

// 강제 시작
void StartTutorialForce(TutorialSequence sequence)

// 현재 튜토리얼 스킵
void Skip()

// 플레이어 액션 발행 (WaitForActionStep이 수신)
void TriggerAction(string key)

// 완료 여부 확인
bool IsCompleted(string sequenceId)

// PlayerPrefs 저장/복원
void Save()
void Load()
void ResetAll()
void Dispose()

TutorialRunner

bool IsRunning // 실행 중 여부
int CurrentStepIndex // 현재 스텝 인덱스

event Action OnCompleted
event Action OnSkipped
event Action<int> OnStepChanged

커스텀 스텝 만들기

TutorialStep을 상속하고 Execute를 구현합니다.

[CreateAssetMenu(menuName = "AchUtils/Tutorial/Steps/My Step")]
public class MyCustomStep : TutorialStep
{
public GameObject TargetPanel;

public override IEnumerator Execute(TutorialRunner runner)
{
TargetPanel.SetActive(true);

// 특정 액션 대기
while (!runner.HasTriggeredAction("PanelClosed"))
yield return null;

runner.ConsumeAction("PanelClosed");
TargetPanel.SetActive(false);
}
}

저장 방식

PlayerPrefs에 완료된 SequenceId 목록을 콤마 구분 문자열로 저장합니다.

AchUtils_Tutorial_Completed = "FirstGacha,FirstEquip,FirstDungeon"

::: tip SequenceId를 비워두면 저장되지 않습니다. SaveProgress = false로도 비활성화할 수 있습니다. :::

플로우 예시

Start

HighlightButtonStep "가챠 버튼 클릭"

WaitForActionStep "GachaClick"

DialogueStep "캐릭터를 획득했습니다!"

HighlightButtonStep "장비창 열기"

End → MarkCompleted("FirstGacha")