소개
오디오와 분리된 자막, 폐쇄 자막, 씬 설명을 지원하도록 설계된 언리얼 엔진 플러그인입니다. 예를 들어, 이러한 새로운 자막은 관련 오디오 에셋의 길이나 재생 스테이트와 관계없이 다른 시스템의 큐를 받을 수 있습니다. 이 새로운 자막 시스템은 궁극적으로 사운드와 자막의 독립적인 사용을 지원하지 않는 기존 시스템을 대체할 것이며, 기존 시스템은 지원 중단될 것입니다. 자막의 표시 타이밍, 폰트, 컬러 등을 커스터마이징할 수 있습니다.
그 위치는 다음과 같습니다.
\Engine\Plugins\Experimental\SubtitlesAndClosedCaptions
Include: #include SubtitlesSubsystem.h
에디터에서 플러그인을 로드하려면 편집(Edit) > 플러그인(Plugins)으로 이동하고 탭이 열리면 이름을 입력하거나 자막 및 폐쇄 자막(Subtitles and Closed Captions)까지 스크롤하여 체크박스를 선택한 다음 에디터 재시작(Restart the Editor)을 클릭합니다.
사용 방법
각 자막은 UAssetUserData에서 파생된 USubtitleAssetUserData UCLASS로 저장되며, 서브클래스화하여 원하는 언리얼 에셋 오브젝트에 커스텀 데이터를 추가로 저장할 수 있습니다.
USubtitleAssetUserData Members
Text: 자막에 표시되는 현지화 가능한 FText입니다.
줄 바꿈은 Shift + Enter를 사용하거나 텍스트에 \n을 포함하여 지정할 수 있습니다.
FTexts는 현지화 시스템의 해시 키 구현을 사용하여 클라이언트의 현재 언어로 현지화되며, 현지화는 자막 시스템과 독립적으로 자막 시스템 이전에 이루어집니다.
Duration: 자막을 표시하는 시간(초)입니다.
디폴트 값은 3초입니다.
0.05초 이상이어야 합니다.
기간 타입이
UseDurationProperty로 설정된 경우에만 활성화됩니다.
Duration Type: UseDurationProperty로 설정하여 기간 프로퍼티를 활성화하거나, UseSoundDuration으로 설정하여 어태치된 사운드가 끝나면 자동으로 중지되도록 할 수 있습니다.
UseSoundDuration은 자막이SoundBase에셋에AssetUserData로 추가된 경우에만 작동합니다.
StartOffset: 자막 줄 표시를 시작할 시간 오프셋(초)입니다.
오디오 에셋당 여러 자막을 표시하는 작업을 간소화하는 데 사용할 수 있습니다. 예를 들어, 여러 문장으로 구성된 긴
SoundWave는 각 문장의 시작 시간 오프셋을StartOffset으로 설정한 여러 자막을 사용할 수 있습니다.디폴트 값은 0초입니다.
Priority: 여러 자막을 동시에 재생하는 경우, 최고(최댓값) 우선순위의 자막만 재생되고 그보다 값이 낮은 자막은 재생되지 않습니다.
이는 자막이 부분적으로만 오버랩되는 경우에도 적용됩니다. 오버랩은
StartOffset과 기간에 의해 결정됩니다.우선순위가 더 높은 자막이 표시되는 동안 새 자막을 즉시 표시되도록 설정하거나
StartOffset을 통해 표시되도록 설정한 경우, 우선순위가 낮은 자막은 표시되지 않습니다.각 카테고리(자막, 오디오 설명 등)는 한 번에 하나씩만 표시됩니다.
경쟁하는 두 자막의 우선순위가 같은 경우, 큐에 가장 먼저 등록된 자막이 계속해서 표시됩니다. 우선순위가 충돌하여 큐에 등록된 자막이 표시되지 않을 때마다 디버그 로그에 경고가 전송됩니다.
디폴트 값은 1입니다.
ESRB: 자막 카테고리의 ESRB 등급입니다. 게임 개발자가 설정하고 사용하는 설명 필드입니다.
호출자가 이 값을 확인하여 자막 줄을 표시해야 하는지 여부를 결정할 수 있습니다.
디폴트 값은 ESRB::Everyone입니다.
SubtitleType: 에셋이 Subtitle, ClosedCaption 또는 AudioDescription인지 지정합니다. 게임 개발자가 설정하는 설명 필드입니다.
호출자가 이 값을 확인하여 자막 줄을 표시해야 하는지 여부를 결정할 수 있습니다.
각
SubtitleType에는 아래에 설명된TextBlock위젯을 통해 설정된 독립적인 디스플레이 파라미터가 있습니다.자막이 표시되면 여러 자막 타입이 서로 겹치지 않도록 배치됩니다.
디스플레이 파라미터
자막은 TextBlock 위젯을 사용하여 표시됩니다.
언리얼 에디터에서 편집(Edit) > 프로젝트 세팅(Project Settings)으로 이동하여 게임(Game)까지 스크롤한 다음, 자막 및 폐쇄 자막을 클릭합니다.
메뉴에서 드롭다운을 사용하여
DefaultSubtitleWidget을 선택합니다.위젯을 확인하려면 에셋 탐색(Browse to Asset) 아이콘을 클릭합니다.
위젯을 더블클릭해서 엽니다.
디폴트 자막 위젯을 사용하면 자막, 폐쇄 자막, 오디오 설명에 배치, 폰트, 컬러, 오파시티 같은 독립적인 디스플레이 파라미터를 설정할 수 있습니다. 자막 텍스트 박스를 더블클릭하여 디테일(Details) 탭을 엽니다.
기본적으로 자막 색상의 경우, ClosedCaptions는 흰색 폰트, AudioDescriptions는 회색 폰트로 표시됩니다.
블루프린트 액세스
USubtitleAssetUserData 및 TextBlock 위젯 파라미터 외에도 C++ 및 블루프린트에서 사용할 수 있도록 다음 API가 노출되어 있습니다.
QueueSubtitle(const FQueueSubtitleParameters&, const ESubtitleTiming Timing = ESubtitleTiming::InternallyTimed)
여기서 FQueueSubtitleParameters에는 다음이 포함됩니다.
위에서 설명된 자막(
USubtitleAssetUserData)에셋의 기간을 오버라이드하는 옵션 파라미터
자막 표시가 이미 활성화된 경우, 활성 자막의 기간이 지정된 기간으로 업데이트됩니다.
타이밍
자막의 기간을 사용하지 않고 대신 자막의 큐 및 만료 시간을 수동으로 제어하려면 ESubtitleTiming::ExternallyTimed로 설정합니다. 외부에서 타이밍을 제어하는 자막은 StopSubtitle()을 사용하여 수동으로 제거하기 전까지 무기한 활성 상태로 유지됩니다. 시간 재생속도 조절 또는 워핑이 포함된 시퀀서 시나리오의 경우, ESubtitleTiming::ExternallyTimed를 사용하고 수동으로 자막을 큐에 등록하고 중지하는 것이 가장 좋습니다. 여러 자막을 큐에 등록하면 우선순위가 가장 높은 자막 중 가장 최근 자막이 표시됩니다.
| 코드 | 결과 |
|---|---|
IsSubtitleActive (const | 지정된 자막 에셋이 표시되면 true를 반환합니다. |
StopSubtitle (const | 지정된 자막 에셋의 표시를 중지합니다. 여기에는 |
StopSubtitle() | 큐에 등록된 모든 자막 표시를 중지합니다. 여기에는 |
동적으로 생성된 자막 표시하기
임의 소스(예: 멀티플레이어 서버에서 동적으로 복제된 텍스트)의 FText도 자막으로 표시될 수 있습니다. 예시:
USubtitlesSubsystem* Subsystem = NewObject<USubtitlesSubsystem>(pWorld, NAME_None, RF_Transient);
check(Subsystem != nullptr);
USubtitleAssetUserData* Subtitle = NewObject<USubtitleAssetUserData>(GetTransientPackage(), NAME_None, RF_Transient);
check(Subtitle != nullptr);
Subtitle->Text = <arbitrary FText input>;
const UAssetUserData& AssetUserData = *CastChecked<const UAssetUserData>(Subtitle);
시퀀서
자막 에셋을 시퀀서(Sequencer)의 자막 트랙으로 드래그합니다. 그런 다음, 자막을 우클릭하고 프로퍼티(Properties)를 선택하여 자막 프로퍼티를 편집할 수 있습니다. 시퀀서에서 자막 기간은 기간 프로퍼티가 아닌 선택 범위 시작 및 종료로 제어됩니다.
Localization
자막 시스템은 현지화할 수 있는 FText 프로퍼티로 현지화를 지원합니다. FTexts는 현지화 시스템의 해시 키 구현을 사용하여 클라이언트의 현재 언어로 현지화되며, 현지화는 자막 시스템과 독립적으로 자막 시스템 이전에 이루어집니다. 언리얼 엔진에서 콘텐츠 현지화하기 | 언리얼 엔진 5.5 문서 | 에픽 디벨로퍼 커뮤니티를 참조하세요.
이주 가이드
이주 툴(Migration Tool)은 지정된 DialogueWave 및/또는 SoundWave의 자막 데이터를 새 Subtitle 에셋 타입으로 복사합니다. 이는 새 에셋을 지정된 DialogueWave 및/또는 SoundWave의 AssetUserData에 넣습니다. 이미 이주된 자막은 지정된 DialogueWave 및/또는 SoundWave가 다시 이주되면 업데이트됩니다. 그러나 이주 결과에 변경사항이 없으면, 타깃 에셋은 더티로 표시되지 않으며, 디스크에 다시 저장할 필요가 없습니다.
이주는 변경 유지되므로, 기본적으로 이전 자막과 새 자막이 자동으로 표시되며 사용자가 어떤 콘텐츠를 사용할지 제어할 수 있습니다.
폰트나 컬러 같은 디스플레이 파라미터 세팅은 현재 이주 툴에 포함되어 있지 않습니다. 이는 앞서 설명한 TextBlock 위젯 세팅을 통해 카테고리별로 설정할 수 있습니다.
SoundWaves 이주하기
이 툴을 사용하려면 콘텐츠 브라우저(Content Browser)에서 SoundWave 에셋을 하나 이상 선택합니다. 그런 다음, 우클릭하고 스크립트 에디터 액션(Scripted Editor Actions) 서브메뉴를 찾은 다음 자막 생성(Create Subtitle)을 선택합니다. 이렇게 하면 이주된 자막 데이터가 포함된 SoundWave에 새로운 USubtitleAssetUserData가 생성됩니다.
원하는 경우, 다음 방법을 사용하여 이전 자막 시스템에서 데이터를 제거할 수 있습니다.
콘텐츠 브라우저에서
SoundWave에셋을 하나 이상 선택합니다.우클릭하고 스크립트 에디터 액션 서브메뉴를 찾습니다.
레거시 자막 제거(Remove Legacy Subtitles)를 선택하면 이전 자막 배열이 비워집니다...
DialogueWaves 이주하기
DialogueWave와 연결된 SoundWave를 이주한 후, 콘솔 명령 au.UseNewSubtitles 1을 사용하여 이 자막 플러그인에서 확인합니다. 콘솔 변수를 디폴트 값인 0으로 다시 설정하여 원래 콘텐츠 및 자막 시스템으로 되돌아갈 수 있습니다.
성능 참고 사항
디스크 사용량은 이전 시스템과 새 시스템 간에 약간 차이가 있으며, 새 시스템으로 이주된 자막은 표시 큐에 등록되어 있을 때 이전 시스템에서는 80바이트, 새 시스템에서는 96바이트로 자막당 약 16바이트가 더 필요합니다.
이전(큐 등록 자막당 80바이트)
FQueueSubtitleParams: 56바이트FSubtitleCue: 24바이트의 배수. 이 비교에서는 이 중 하나만 가정합니다.
이후(큐 등록 자막당 96바이트):
FQueueSubtitleParameters: 16바이트USubtitleAssetUserData: 80바이트
메모리의 큐에 등록되지 않은 자막은 FQueueSubtitleParameters 구조체를 사용하지 않으므로 '대량' 자막은 추가된 프로퍼티와 기능으로 인해 기존 24바이트에서 현재 80바이트로 56바이트의 큰 차이를 보입니다.
이주 툴 소스
수정이 필요한 경우, 이주 툴은 자막 플러그인의 폴더인 SubtitlesAndClosedCaptions/Content/EditorUtilities/CreateSubtitlesFromSoundWaves.uasset에 있습니다.
다른 새로운 자막 플러그인과 마찬가지로 이주 툴은 현재 실험단계 기능으로 표시되어 있습니다.