Инструмент субтитров
Система субтитров для Unity, работающая в рантайме: поддержка SRT и ASS, стилизация, анимации и пулинг ради производительности.
Купить в Unity Asset Store: Subtitles Player — SSA, ASS, SRT
Обзор
- Поддерживает SRT (простые субтитры по таймкодам) и ASS (богатая стилизация и анимация).
- Работает в рантайме, отрисовка идёт через TextMeshPro.
- Управление шрифтами через FontsContainer; в комплекте готовые префабы и примеры.
- Представления ASS-субтитров переиспользуются из пула, чтобы не плодить аллокации, когда на экране много строк.
Возможности подробно
- Два формата: SRT — когда нужно быстро, ASS — когда нужны стили, позиционирование и анимация.
- Шрифты и стили: централизованный список шрифтов в FontsContainer; ASS-стили задают цвета, обводку, тени и положение.
- Пулинг:
ShowAssSubtitlesпереиспользует объекты представлений (SubtitleViewPool, до 32 сохраняемых), снижая нагрузку на сборщик мусора. - Компонентный подход: готовые компоненты для SRT и ASS, базовые классы для расширения.
Как пользоваться
Воспроизведение разделено на два компонента: плеер разбирает файл и ведёт время, отображение его рисует.
- Добавьте плеер —
SRTSubtitlePlayerилиAssSubtitlePlayer— на игровой объект и назначьте ему Subtitle File (TextAsset). - Добавьте на тот же канвас соответствующий компонент отображения:
ShowSRTSubtitles— назначьте Subtitle Player и Text (TextComponentWrapper).ShowAssSubtitles— назначьте Subtitle Player, Text Prefab (префаб сAssSubtitlePartView) и Fonts Container. Разместите его на объекте сCanvasScaler: опорное разрешение берётся из ASS-скрипта вStart.
- (ASS) Убедитесь, что в FontsContainer лежат шрифты, на которые ссылается ASS-файл.
- Управляйте воспроизведением через
Play()/Pause()/Continue()/Stop()на плеере.
Канвас с назначенными SRT Subtitle Player (файл субтитров, текущее время, состояние воспроизведения) и Show SRT Subtitles (ссылки на обёртку текста и плеер).
Короткие примеры
Управление воспроизведением находится на компоненте-плеере, а не на компоненте Show….
SRT
var player = GetComponent<SRTSubtitlePlayer>();
player.Play(); // начать с 00:00
player.Play(12.5f); // начать с 12,5 секунды
player.Pause(); // остановить, сохранив текущую позицию
player.Continue(); // продолжить с места паузы
player.Stop(); // остановить и перемотать в начало
ASS
var player = GetComponent<AssSubtitlePlayer>();
player.Play();
if (player.IsPlaying)
Debug.Log($"At {player.CurrentTime:F2}s");
Файл субтитров — это сериализованное поле TextAsset, назначаемое в инспекторе; API для подмены файла в рантайме нет. Чтобы проиграть другой файл, используйте отдельный экземпляр плеера (или префаб на каждый файл) и включайте нужный.
Субтитры в окне Game в режиме Play; кнопки Play / Pause / Continue управляют плеером.
Компоненты
- ShowSRTSubtitles / SRTSubtitlePlayer / SRTParser: конвейер SRT.
- ShowAssSubtitles / AssSubtitlePlayer / AssParser / AssSubtitlePart / AssSubtitlePartView / AssStylesInfo / AssScriptInfo / AssFormat: конвейер ASS и стилизация.
- SubtitlePlayer: базовый класс воспроизведения —
Play/Pause/Continue/Stop,CurrentTime,IsPlaying,GetCurrentSubtitles. - FormatSubtitlePlayer<TParser>: создаёт парсер нужного формата в
Awake; база для SRT- и ASS-плееров. - SubtitleDisplayBase<TPlayer>: общий цикл
Updateдля компонентов отображения; переопределитеOnSubtitlesUpdated, чтобы рисовать по-своему. - SubtitlesParser / SubtitlePart: контракт разбора и модель разобранной строки.
- TextComponentWrapper: оборачивает
TextMeshProUGUIи даёт ASS-рендереру доступ к тексту, цвету, обводке, тени, шрифту и выравниванию. - FontsContainer:
ScriptableObjectсо списком шрифтов для ASS-стилей, создаётся черезAssets > Create > ManakhovN > Subtitles > FontsContainer. Шрифт ищется по имени семейства TMP. - SubtitleViewPool: пул объектов представлений, используемый ASS-рендерером.
Советы
- SRT — для простых субтитров, ASS — когда нужны стили, позиционирование или анимация.
- Держите шрифты в FontsContainer и ссылайтесь на них в ASS-стилях, чтобы не получить пропущенные глифы.
- Ради производительности не раздувайте файлы субтитров; пулинг для ASS включён по умолчанию.
- Тщательно проверяйте тайминги: расхождение FPS и таймкодов в ASS ломает синхронизацию.
Решение проблем
- Ничего не показывается: проверьте, что плееру назначен Subtitle File, что компонент отображения ссылается на этот плеер и что
IsPlayingравно true — до вызоваPlay()ничего не рисуется. - Не подхватываются шрифты: добавьте шрифт в FontsContainer. Поиск идёт по имени семейства TMP-ассета, и оно должно совпадать с именем в ASS-стиле.
- Просадки производительности: избегайте очень больших ASS-файлов; пул хранит не больше 32 объектов, сверх этого создаются новые.
Требования
- Unity 2020.3 или новее
- Рантайм-инструмент (работает в сборках)
- TextMeshPro — отрисовка идёт через
TextMeshProUGUI; обычныйTextиз Unity UI не поддерживается
Поддержка
По вопросам и пожеланиям пишите: nadirmanakhov@gmail.com
Другие инструменты: Редактор структур данных | Конвертер файлов | VCS Client