비주얼 노벨 자동 진행은 무엇을 기다려야 할까: 음성 종료, 읽기 대기, 연출 완료 구분하기
한 문장을 자동으로 넘기려면 텍스트 표시, 읽기 대기, 음성 종료, 필수 연출을 각각 확인하고 독자가 조작을 넘겨받지 않았는지도 살펴야 합니다. 온실을 배경으로 한 가상의 세 문장으로 연출·구현 담당자에게 전달할 자동 진행 대기 규칙표를 작성합니다.

들어가며
자동 진행은 텍스트가 모두 표시되고, 정해진 읽기 대기 시간을 채우고, 현재 문장의 음성이 자연스럽게 끝나고, 필수 연출이 완료되었으며, 독자가 진행을 멈추고 조작을 넘겨받지 않았을 때만 다음 문장으로 넘어갈 수 있어야 합니다. 이 조건이 모두 충족되어야 ‘자동으로 넘어갈 수 있는 상태’가 됩니다. 어느 하나의 신호만으로 문장을 넘겨서는 안 됩니다.
아래 온실 장면은 설명을 위해 직접 창작한 가상의 예시입니다. 실제 사용자 사례나 실측 결과, 직접 조작해 본 테스트, DramaFork의 제품 기능이 아닙니다. 원예사가 음성으로 전하는 주의 대사에 이어 음성 없는 서술이 나오고, 마지막에는 커튼이 열리기를 기다립니다. 특정 엔진을 전제하지 않고 이 장면으로 문장별 규칙을 정해 보겠습니다.
1. 관찰할 수 있는 완료와 확인할 수 없는 이해를 구분하기
‘텍스트가 모두 표시되었다’는 것은 관찰할 수 있지만, ‘독자가 다 읽었다’는 것은 시간만으로 확인할 수 없습니다. 따라서 기획자는 후자를 실행 가능한 읽기 대기 규칙으로 정하고, 독자가 이를 조절하거나 일시 정지할 수 있게 해야 합니다. 카운트다운이 끝났다는 이유로 내용을 이해했다고 판단해서는 안 됩니다.
이 예시에서는 현재 문장의 마지막 글자가 완전히 표시된 시점부터 읽기 대기 시간을 누적하는 방식을 사용합니다. 필요한 시간은 해당 문장의 표시 텍스트 길이와 독자가 선택한 대기 설정에 따라 정합니다. 문장부호를 어떻게 셀지도 프로젝트 규칙에 명시하고, 음성이 있는 문장과 없는 문장에 같은 기준을 적용해야 합니다. 이 글에서는 모든 사람에게 적합한 고정 속도를 제시하지 않습니다.
음성 재생과 읽기 대기는 동시에 진행할 수 있습니다. 음성이 더 길면 음성을 계속 기다리고, 읽기 대기가 더 길면 텍스트를 유지합니다. 이 방식에서는 음성이 끝난 뒤 전체 읽기 대기 시간을 다시 추가하지 않습니다. 다른 방식으로는 음성을 다 들은 뒤 시간을 재기 시작할 수도 있습니다. 텍스트를 다시 살펴볼 시간을 따로 확보할 수 있지만, 짧은 문장에서는 흐름이 끊기는 느낌이 들기 쉽습니다. 두 방식 모두 가능하되, 같은 문단 안에서 설명 없이 섞어 쓰면 안 됩니다.
2. 다섯 가지 조건을 대기 규칙표에 적기
먼저 각 문장에 음성이 있는지, 다음 문장으로 넘어가는 것을 막는 연출이 있는지 등록한 뒤 아래 표를 작성합니다. 음성이 없는 것은 미리 정해진 설정이고, 재생 실패는 오류입니다. 둘을 같은 ‘종료됨’ 표시로 처리해서는 안 됩니다.
| 확인 항목 | 이 예시의 규칙 | 진행을 허용할 수 있는 관찰 근거 |
|---|---|---|
| 텍스트 표시 완료 | 현재 문장의 텍스트가 모두 표시됨 | 현재 문장의 전체 표시 완료 신호를 받음 |
| 읽기 대기 | 전체 표시 후 문장 길이와 사용자 설정에 따라 누적 | 현재 문장의 유효 대기 시간이 정해진 양에 도달함 |
| 음성 종료 | 음성이 있으면 자연스러운 종료를 기다리고, 없으면 명시적으로 면제 | 현재 문장의 종료 신호 또는 사전에 등록한 음성 없음 설정 |
| 연출에 따른 진행 차단 | 현재 문장의 진행 차단 목록에 있는 연출만 기다림 | 목록의 모든 항목이 지정된 완료 상태에 도달함 |
| 일시 정지와 조작 인계 | 자동 모드가 켜져 있고 독자가 조작을 넘겨받지 않음 | 독자가 일시 정지하지 않았고 대사 기록이나 메뉴도 열지 않음 |
사용자의 대기 설정은 읽기 대기 시간을 정하는 입력값이지, 별도의 독립적인 카운트다운이 아닙니다. 이 예시에서는 문장에 진입할 때 설정을 읽습니다. 독자가 도중에 설정을 열어 값을 바꾸면 먼저 일시 정지하고, 명시적으로 재개한 뒤 새 설정으로 현재 문장의 대기 시간을 다시 계산해 0부터 누적합니다. 한 번 더 기다리게 되지만, 느린 속도를 선택하자마자 문장이 넘어가는 일을 피할 수 있습니다.
‘연출 완료’는 구체적인 상태를 가리켜야 합니다. 예를 들어 이 예시에서는 ‘커튼이 완전히 열린 위치에 도달함’이라고 적고, ‘화면이 대충 준비됨’이라고 적지 않습니다. 온실 안에서 빛을 받아 떠다니는 먼지의 반복 효과는 진행 차단 목록에 넣지 않습니다. 끝이 없는 장식 효과를 넣으면 영원히 다음 문장으로 넘어갈 수 없기 때문입니다.
3. 세 문장을 따라 자동 진행 가능 여부 판단하기
첫 문장은 원예사가 음성으로 전하는 주의 대사입니다. “그 화분의 어린 모종은 아직 만지지 마. 내가 커튼을 열 때까지 기다려.” 이 문장에서는 주의만 줄 뿐, 아직 커튼을 열기 시작하지 않습니다. 텍스트가 모두 표시되면 읽기 대기를 시작하고 음성은 계속 재생합니다. 대기 시간을 먼저 채워도 넘어갈 수 없습니다. 음성이 자연스럽게 끝난 뒤 자동 모드와 일시 정지 상태를 다시 확인하고, 모든 조건이 갖춰졌을 때 서술로 넘어갑니다.
음성이 먼저 끝났는데 글자가 아직 한 자씩 나타나고 있다면, 전체 텍스트가 표시되기를 기다린 다음 읽기 대기를 마쳐야 합니다. 음성 종료는 음성에 관한 제약만 해제할 뿐, 텍스트가 충분히 오래 표시되었다는 증거가 아닙니다. 녹음에서 쉼을 덜어내야 할 때도 기존 호흡이 그대로 성립한다고 가정하지 말고, 완료 순서를 다시 검토해야 합니다.
두 번째 문장은 음성 없는 서술입니다. “그는 장갑을 긴 의자 위에 내려놓았다. 온실에는 잎이 스치는 작은 소리만 남았다.” 이 문장은 사전에 음성이 없는 것으로 등록하고, 반드시 기다려야 하는 연출도 두지 않습니다. 전체 텍스트가 표시된 뒤 읽기 대기 시간을 누적하고, 이를 채우면 자동으로 넘어갈 수 있는 상태가 됩니다. 가짜 오디오 종료 이벤트를 만들 필요가 없으며, 오디오가 없다는 이유로 곧바로 건너뛰어서도 안 됩니다.
세 번째 문장도 음성이 없습니다. “커튼이 양옆으로 걷히고, 첫 번째 빛줄기가 모종 트레이 위에 내려앉았다.” 이 문장에 진입할 때 커튼을 열기 시작하고, ‘커튼 완전히 열림’을 진행 차단 조건으로 등록합니다. 읽기 대기 시간을 채웠어도 커튼이 움직이고 있다면 현재 문장에 머뭅니다. 커튼이 먼저 완전히 열렸다면 텍스트 대기 시간을 계속 채웁니다. 두 조건이 모두 충족되어야 원예사의 다음 설명으로 넘어갈 수 있습니다.
이 세 문장은 각각 음성 대기, 음성 없는 문장의 대기, 연출 대기를 다룹니다. 작업을 전달할 때는 문장별 진입 상태, 각 조건의 완료 순서, 마지막으로 해제된 제약, 실제로 넘어갔는지를 기록합니다. 초 단위 수치를 지어내지 않아도 논리가 일관되는지 확인할 수 있습니다.
4. 독자가 조작을 넘겨받은 뒤에는 명시적으로 재개하기
이 예시에서는 독자가 본문을 클릭하거나, 대사 기록을 열거나, 메뉴에 들어가거나, 자동 모드를 직접 끄면 먼저 자동 진행을 일시 정지합니다. 텍스트가 모두 표시되기 전에 본문을 클릭했다면 그 입력은 현재 문장을 전부 표시하는 데만 사용합니다. 이미 모두 표시된 상태라면 일시 정지만 합니다. 이후의 수동 진행은 별도의 수동 조작 규칙에 따르며, 같은 한 번의 입력으로 다음 문장까지 넘어가게 하지 않습니다.
일시 정지 중에는 읽기 대기 시간의 누적을 멈춥니다. 음성과 연출을 계속 재생할지는 따로 정해야 합니다. 이 예시에서는 일반적인 본문 클릭으로 조작을 넘겨받을 때는 재생을 허용하고, 메뉴를 열면 일시 정지가 가능한 재생을 멈춥니다. 어떤 재생 방침을 택하든, 일시 정지 중에 받은 완료 신호는 상태만 갱신할 수 있으며 다음 문장으로 넘어가게 해서는 안 됩니다.
대사 기록이나 메뉴를 닫아도 자동으로 재개하지 않습니다. 독자가 자동 진행을 계속하겠다고 명시적으로 선택하면 현재 문장의 텍스트는 모두 표시된 상태로 유지하고, 읽기 대기 시간은 0부터 다시 시작합니다. 이미 자연스럽게 끝난 음성이나 완료된 커튼 연출은 반복하지 않고, 아직 완료되지 않은 항목은 계속 기다립니다. 재개할 때 조금 더 오래 머물 수 있다는 대가가 있지만, 본문으로 돌아오자마자 문장이 넘어가지 않는다는 이점이 있습니다.
독자가 이미 수동으로 다음 문장에 진입했다면 이전 문장의 대기 기록은 무효가 됩니다. 이전 음성의 종료 신호가 늦게 도착하더라도 새 문장의 제약을 해제해서는 안 됩니다. 따라서 완료 신호에는 어느 문장에 속하는지 식별할 정보도 함께 기록해야 합니다.
5. 오류에 대처할 방법을 마련하고 적용 범위 명시하기
음성 로딩 실패, 재생 중단, 수동 정지는 모두 자연스러운 재생 종료와 다릅니다. 이 예시에서는 자동 진행을 일시 정지하고, 재시도하거나 현재 문장을 음성 없이 읽도록 명시적으로 전환할 수 있게 합니다. 음성 없이 읽기를 선택한 뒤에는 읽기 대기를 다시 완료해야 합니다. 숨겨진 타임아웃으로 모든 오류를 조용히 성공 처리해서는 안 됩니다.
커튼이 완전히 열린 상태에 도달하지 않았다면 진행 차단도 유지합니다. 건너뛰기를 허용하는 설계라면 ‘건너뛴 뒤 즉시 완전히 열린 상태를 표시한다’는 별도 규칙을 적어야 합니다. 애니메이션만 멈추고 커튼은 반쯤 열린 채로 둔다면 연출이 완료된 것으로 볼 수 없습니다.
작업을 전달하기 전에 세 문장으로 음성이 먼저 끝나는 경우, 텍스트 대기 시간을 먼저 채우는 경우, 커튼이 먼저 완전히 열리는 경우, 일시 정지 중 종료 신호를 받는 경우, 이전 문장의 신호가 늦게 도착하는 경우를 확인합니다. 매번 ‘멈췄다’거나 ‘너무 빨리 넘어간다’는 기록에 그치지 않고, 아직 충족되지 않은 구체적인 조건을 짚을 수 있어야 합니다.
이 규칙은 한 문장씩 진행하는 선형적인 읽기 구간에 적용됩니다. 선택지, 지속적인 조작이 필요한 장면, 명확한 끝이 없는 연출에 진입하면 이 자동 진행 절차에서 벗어나 해당 상호작용 규칙에 맡겨야 합니다. 대기표는 언제 진행을 허용할 수 있는지 설명할 수 있지만, 모든 독자가 내용을 이해했다는 사실까지 증명하지는 못합니다.






