본문 바로가기

무제_LR

다이어로그 에디터 툴 - 선택지 툴, Dirty 체크

 

 

다이어로그에 선택지 데이터를 만드는 윈도우를 추가했습니다.

 

그리고 대화문/선택지마다 이전 선택지의 분기문 조건을 넣는 윈도우도 만들었습니다.

예시: 스테이지 2의 HelloTalking 시퀸스는 기본적으로 "HelloData"의 데이터를 출력한다.
그런데 만약 스테이지 1의 선택지 (L.A, R.B)를 선택한 적이 있다면 "HelloData" 대신 "HiData"를 출력하게 조건 설정

 

앞서 말했듯 내러티브 게임도 아니고 이 이상 복잡해봤자 그만큼 깊은 컨텐츠를 만들 수 있는 환경도 아니라 적당히 경험 쌓는 목적으로 만들었습니다.

 

이번 작업에서 시간이 상당히 걸렸던 이유가 개떡같은 데이터 구조 및 네이밍이었습니다.

이정도면 괜찮겠지 싶어 미리 데이터 구조를 짜지 않고 적당히 얼기설기 만들었다가 땅을 치고 후회했습니다.

위 스크린샷은 각종 겹치는 이름, 중복되는 데이터를 제거한 구조입니다.

다이어로그 하나 통째로 가지고 있는 [ DialogueData ]

한 턴짜리 지문 혹은 선택지 정보를 가지고 있는 [ DialogeSequenceBase ](및 SelectionData, TalkingDat)

([ SelectionData ], [ TalkingData ] 형변환은 외부에서)

[ DialogeSequenceBase ]의 등장 조건인 [ Condition ]

일단 저장 크기는 고려하지 않고 에디터용으로만 만들었습니다.

 

특이사항으로는 각 클래스마다 값 변경이 일어날 때 최상위 객체에 신호를 보내는 onDirty를 붙였습니다.

프로퍼티 혹은 메소드를 통해 값이 변경될 때마다 '여기 변경점 있음!!!!" 신호를 보내 저장이 필요한지 여부를 판단하게 합니다.

 

  private void SaveData(RootData dataSet)
  {
    if (dataSet.IsDirty == false)	//예시
      return;

    DeleteData(dataSet);

    var filePath = string.Format(FileNameFormat, ParseToHeadNumber(dataSet.Index), dataSet.Name);
    var newPath = Path.Combine(FolderPath, filePath);
    var json = JsonUtility.ToJson(dataSet.Data);
    File.WriteAllText(newPath, json);
    AssetDatabase.Refresh();

    dataSet.guid = AssetDatabase.AssetPathToGUID(newPath);
    dataSet.ClearDirty();
  }

세이브 호출은 자주 하되 실질적 변경점 여부 판단을 동반함

 

      public void CreateNewSequence()
      {
        switch (sequenceType)
        {
          case IDialogueSequence.Type.Talking:
            {
              sequences.Add(new DialogueTalkingData(false, "talking", onDirty));
            }
            break;

          case IDialogueSequence.Type.Selection:
            {
              sequences.Add(new DialogueSelectionData(false, "selection", onDirty));
            }
            break;
        }

        onDirty?.Invoke();
      }

      public void RemoveSequence(DialogueSequenceBase sequence)
      {
        if (sequences.Contains(sequence) == false)
          return;

        sequences.Remove(sequence);
        onDirty?.Invoke();
      }

데이터를 넣거나 삭제할 때마다 onDirty?.Invoke로 변경점 있다고 고래고래 소리치기

 

다음에 할거:

텍스트 테이블 만들고 Localization에 끼워넣거나 등등 연동할 방법 고민하기

TalkingData 에디터 윈도우 만들기