비주얼 노벨에서 텍스트를 한 번에 표시한 클릭이 다음 대사까지 넘기지 않게 하려면
남은 텍스트 표시, 현재 대사에서 벗어나기, 선택지 화면 진입을 각각 별도의 규칙으로 정의합니다. 진행 입력은 수신 당시의 상태에만 속하며, 처리 직후 소비해 상태가 바뀌어도 다시 사용하지 않습니다. 가상의 전령 대사를 바탕으로 구현 담당자에게 전달할 클릭 진행 상태표를 작성합니다.

들어가며
클릭으로 남은 텍스트를 모두 표시한 뒤 다음 대사까지 넘어가는 일을 막으려면, 진행 입력을 수신 당시의 상태에 따라 한 번만 처리하도록 정해야 합니다. 텍스트가 아직 표시 중이면 나머지를 표시하기만 합니다. 전체 텍스트가 표시되었고 현재 대사에서 벗어날 수 있을 때만 진행합니다. 페이지를 떠나는 중이라면 입력을 버리고 나중에 쓰기 위해 남겨 두지 않습니다. 상태가 바뀌었다고 같은 입력이 다시 유효해져서는 안 됩니다.
아래에서는 전령의 대사를 예로 들어 구현 담당자에게 전달할 규칙을 작성합니다. 이는 가상의 교육용 예시이며, 실제 사용자 사례나 실측 결과, DramaFork의 제품 기능이 아닙니다. 특정 엔진의 기본 동작을 뜻하지도 않습니다.
‘텍스트 표시 완료’와 ‘현재 대사에서 벗어나기’를 구분하기
전령의 대사는 “편지가 도착했습니다. 날이 밝기 전에는 열지 말아 주세요.”입니다. 텍스트가 조금씩 나타나는 동안 전령은 문 옆에 서 있습니다. 독자의 첫 번째 클릭은 이 대사를 즉시 전부 보기 위한 것입니다. 두 번째로 명확한 진행 조작을 해야 전령이 퇴장하고, 그 뒤에 ‘편지 열기’와 ‘넣어 두기’라는 두 선택지가 나타납니다.
먼저 대본 옆에 세 가지 완료 시점을 적습니다. 전체 텍스트가 보이는 시점, 독자가 현재 대사에서 벗어나기를 요청한 시점, 퇴장 연출이 끝난 시점입니다. 서로 연달아 일어날 수는 있어도, 이를 모호한 ‘대사 종료’ 하나로 대신해서는 안 됩니다. 그러면 텍스트 담당자는 전체 텍스트를 표시하면서 종료 알림을 보내고, 캐릭터 담당자는 그 알림을 받아 퇴장시키며, 페이지까지 함께 전환될 수 있습니다.
이 예시에서는 전령의 퇴장을 ‘현재 대사에서 벗어나기’에 연결합니다. 텍스트가 자연스럽게 끝까지 표시되든 클릭으로 한 번에 표시되든, 전체 텍스트가 보일 뿐 전령은 계속 기다립니다. 따라서 부수 이벤트를 모두 전체 텍스트 표시와 함께 실행해서는 안 됩니다. 텍스트 표시가 끝났음을 알리는 장식 효과는 전체 텍스트가 보이는 시점에 연결할 수 있지만, 이야기의 진행 위치를 바꾸는 퇴장 동작은 명확한 진행 조작에 연결해야 합니다.
어떤 단어를 이해하는 데 노크 소리가 꼭 필요하다면, 텍스트를 한 번에 표시할 때 그 소리를 어떻게 처리할지 별도로 적어야 합니다. 여기서는 전체 텍스트를 표시한 뒤 이 필수 안내를 재생하고, 재생이 끝날 때까지 진행을 허용하지 않습니다. 독자가 곧바로 넘어갈 수 없다는 대가가 있지만, 전체 텍스트를 표시하면서 필요한 정보까지 함께 건너뛰지는 않게 됩니다.
상태표로 입력이 할 수 있는 일을 제한하기
여기서 ‘소비’란 해당 입력의 처리가 끝났으므로 이후의 텍스트, 캐릭터, 선택지가 그 입력을 다시 사용할 수 없다는 뜻입니다. ‘다음 입력’은 누르고 있던 버튼이나 키를 놓은 뒤 새로 눌러야 발생합니다. 한 번 누르고 있는 동안 발생한 반복 알림은 다음 입력이 아닙니다.
| 현재 표시 상태 | 입력 동작 | 소비 결과 | 발생 이벤트 | 다음 입력을 받을 조건 |
|---|---|---|---|---|
| 현재 대사가 아직 표시 중 | 새로운 진행 입력 | 현재 대사 전체를 표시하고 즉시 소비 | 전체 텍스트가 보임. 퇴장은 실행하지 않음 | 이번에 누른 버튼이나 키를 놓은 뒤 새로 누르면 진행 가능. 필수 안내가 끝나지 않았다면 계속 대기 |
| 전체 텍스트가 보이지만 필수 안내가 끝나지 않음 | 새로운 진행 입력 | 소비 후 버림. 대기열에 넣지 않음 | 퇴장은 실행하지 않음 | 안내가 끝나고 이전부터 누르고 있던 버튼이나 키를 놓은 뒤 새 입력을 받음 |
| 전체 텍스트가 보이며 현재 대사에서 벗어날 수 있음 | 새로운 진행 입력 | 현재 대사에서 벗어나기를 요청하고 즉시 소비 | 이 대사의 퇴장 연출을 한 번만 시작 | 떠나는 동안 진행 입력을 받지 않음 |
| 현재 페이지를 떠나는 중 | 클릭, 키 반복 알림 | 버리고 다음 페이지로 넘기지 않음 | 퇴장을 반복하거나 연출을 건너뛰지 않음 | 이동할 페이지가 준비되고 이전부터 누르고 있던 버튼이나 키를 놓은 뒤 다시 허용 |
| 선택지 화면이 나타남 | 이전부터 누르고 있던 버튼이나 키를 놓을 때의 알림 또는 반복 알림 | 버림 | 선택을 확정하지 않음 | 이 화면이 조작 가능해진 뒤 시작한 새 조작을 받음 |
| 선택지 화면을 조작할 수 있음 | 새로운 선택지 조작 | 선택지 규칙에 따라 처리 | 명확히 조작한 선택지만 확정 | 확정 후 이동할 상태를 기준으로 다시 판단 |
표에서 가장 놓치기 쉬운 부분은 ‘버리고 대기열에 넣지 않음’입니다. 퇴장 중의 클릭을 저장해 두었다가 페이지가 준비된 뒤 실행하면, 독자는 여전히 내용이 저절로 넘어갔다고 느낍니다. 인계할 때는 ‘지금은 처리하지 않음’을 명확한 ‘버림’ 또는 ‘보관’으로 바꾸어 적어야 합니다. 이 예시에서는 버립니다.
전령의 대사를 따라 조작을 하나씩 검토하기
첫 번째 단계에서는 화면에 “편지가 도착했습니다”만 보입니다. 독자가 마우스 버튼을 누르면, 입력을 받은 시점에는 텍스트가 아직 표시 중이므로 대사 전체를 표시하기만 하고 해당 입력을 소비한 것으로 표시합니다. 처리가 끝났을 때 텍스트가 완성되어 있더라도, 그 입력으로 진행할 수 있는지 다시 검사하지 않습니다. 전령은 여전히 문 옆에 서 있습니다.
두 번째 단계에서 독자가 마우스 버튼을 놓습니다. 이는 방금 누른 동작을 끝낼 뿐, 새로운 진행 입력이 아닙니다. 버튼을 놓을 때 클릭을 인식하도록 구현하더라도, 앞선 누르기와 이번 놓기를 하나의 조작으로 묶어야 합니다. 각각 별도의 동작을 실행해서는 안 됩니다.
세 번째 단계에서 독자가 다시 누릅니다. 이제 전체 텍스트가 보이고 현재 대사에서 벗어날 수 있습니다. 먼저 떠나는 상태로 바꾼 뒤 전령의 퇴장을 시작합니다. 이렇게 하면 연출을 시작하는 도중 다른 알림을 받더라도 떠나는 상태의 규칙에 따라 버릴 수밖에 없으므로, 같은 퇴장을 다시 시작하지 않습니다.
네 번째 단계에서 전령이 문밖으로 걸어가는 동안 독자가 한 번 더 클릭합니다. 이 클릭은 바로 버립니다. 퇴장이 끝나면 두 선택지가 나타나지만, 앞선 입력이 독자를 대신해 ‘편지 열기’를 선택해서는 안 됩니다. 이때 마우스 버튼을 계속 누르고 있더라도, 나중에 놓는 것만으로 선택을 확정하지 않습니다.
다섯 번째 단계에서는 이전부터 누르고 있던 버튼이나 키를 모두 놓았고 선택지 화면을 조작할 수 있습니다. 독자가 새로 누르고 선택지 클릭을 한 번 완료해야 ‘넣어 두기’가 확정됩니다. 이 일련의 검토에서 확인할 기준은 각 조작을 어느 단계에서 처리하는지가 명확하고, 전체 텍스트 표시와 퇴장, 선택 확정이 같은 입력을 공유하지 않는다는 것입니다. 이는 문서상으로 동작을 따라가 본 것이며, 이미 수행한 테스트의 결과 보고가 아닙니다.
한 번 클릭하기와 길게 누르기를 따로 정의하기
이 예시에서는 마우스, 터치, 키보드에 ‘새 조작이 시작될 때 한 번만 유효해진다’는 공통 규칙을 적용합니다. 누르는 순간과 클릭이 완료되는 순간 중 어느 쪽을 실행 시점으로 삼을지는 프로젝트에서 정할 수 있습니다. 다만 같은 조작에서 누를 때 전체 텍스트를 표시하고 놓을 때 다시 진행해서는 안 됩니다.
키를 길게 누른다고 해서 독자가 진행 의사를 반복해서 표현한 것은 아닙니다. 이 예시에서는 최초의 누르기만 받고, 계속 누르는 동안 발생하는 반복 알림은 모두 무시합니다. 놓았다가 다시 눌러야 다음 입력으로 셉니다. 키를 누른 채 선택지 화면에 들어가더라도 진행하거나 현재 선택지를 확정하지 않습니다.
작품에 길게 눌러 연속으로 읽는 기능이 필요하다면, 시작 방법과 중단 조건, 선택지를 만났을 때의 처리를 별도 규칙으로 정해야 합니다. 일반 진행 키의 반복 알림을 설명되지 않은 연속 읽기 기능처럼 사용해서는 안 됩니다. 두 규칙이 같은 입력원을 사용한다면 현재 어느 쪽이 입력을 받는지도 지정해야 합니다.
실제로 빠르게 두 번 클릭한 것은 두 번의 조작입니다. 첫 번째로 전체 텍스트가 표시되고, 두 번째로 현재 대사에서 벗어날 수 있습니다. 이 규칙이 해결하는 문제는 한 조작이 반복 사용되는 것이며, 실수로 발생한 모든 더블 클릭을 막는다고 보장하지는 않습니다. 두 번째 클릭이 유효해지기까지 추가 지연을 두려면 별도 규칙으로 적고, 의도적으로 빠르게 읽는 조작도 늦어진다는 절충을 받아들여야 합니다.
인계할 때는 순조로운 읽기뿐 아니라 경계 조건도 확인하기
구현 담당자에게 표의 각 행에 대해 수신 전 상태, 입력을 처리할 주체, 해당 입력으로 수행할 단 하나의 동작, 처리 후 상태를 채워 달라고 요청하세요. 특히 세 가지 실패 지점을 확인해야 합니다. 전체 텍스트를 표시한 뒤에도 진행 조건 검사를 계속하는 경우, 퇴장 중의 입력을 보관하는 경우, 이전 페이지에서 시작된 누르기 동작을 선택지 화면이 받는 경우입니다. 각각 이번 입력 처리를 끝내는 지점, 전환 중인 구간, 새 페이지의 진입 지점에서 경계를 확실히 적용해야 합니다.
텍스트가 자연스럽게 표시를 마치는 순간과 클릭이 거의 동시에 발생하는 경우도 검토해야 합니다. 이 예시에서는 읽기 로직이 입력을 받은 시점의 상태를 기준으로 삼습니다. 아직 표시 중이면 전체 텍스트를 표시하고, 이미 표시가 끝났다면 진행합니다. 입력을 어느 상태에서 처리할지 정한 뒤에는 후속 알림 때문에 바꾸지 않습니다. 자연스럽게 표시가 끝난 뒤 독자에게 보호 시간을 주고 싶다면 별도의 입력 허용 조건으로 적어야 합니다. 처리 순서 덕분에 우연히 그렇게 되기를 기대해서는 안 됩니다.
이 표는 수동으로 대사를 하나씩 읽는 방식에 적용됩니다. 자동 재생, 이전 내용 다시 보기, 저장 파일을 불러와 복원하기, 연출을 건너뛸 수 있는 모드에는 각각 진입과 종료 규칙을 추가해야 합니다. 인계할 때 대사, 퇴장 이벤트, 필수 안내, 선택지 화면을 같은 표에 넣어, 입력을 받는 모든 단계가 다음 질문에 답할 수 있도록 하세요. 이번 조작은 누가 처리하며, 동작을 마친 뒤 입력 처리는 어디에서 끝나는가?






