26

Система озвучки игр (с плагином для Unity)

Наша маленькая команда сделала игру AirHockeyVR под Oculus Quest, в ней есть обучение на английском языке, которое записал ютюбер, который сначала записал видео про игру -> мне понравился его голос -> я попросил его сделать озвучку -> он согласился и записал.


Дальше я начал смотреть, как Unity предполагает программировать локализацию звуков - и хоть решение есть, оно не удобное и не подразумевает заливку новых звуков по мере их поступления без ребилда игры. Поэтому я написал свое решение (аналогично тому решению, где вы можете хранить переводы в гугл таблицах, только тут не тексты, а звуки).


И теперь я представляю это решение вам :)


Вот что вам понадобится:

https://audio.sa-wd.ru/ - тут заливать звуки

https://audio.sa-wd.ru/storage/package/SAWDAudioManager.unit... - плагин для Unity


Общая идея очень простая: у вас уже есть игра, в ней уже есть звуки, а значит много переделывать вам не хочется.

И не надо.


Что бы звуки грузились в игру, вы просто подписываетесь на делегат в SAWDAudioManager когда вам нужно получить звуки (делегат возвращает наборы звуков по тэгу), и отписываетесь когда они вам больше не нужны.


Для случаев, когда у вас один AudioSource с одним звуком - докидываете хелпер, в котором указываете тэг [и сабтэг, опционально] звука.

Система озвучки игр (с плагином для Unity)

Предполагается так: только тег - это набор звуков, один созданный звук на сайте может быть перезалит набором звуков (для примера - это звук удара шайбы). Если есть сабтэг - значит это один звук, который заменяется один на один (для примера - это фраза "добро пожаловать!").


Так же потребуется капля работы с дизайном что бы можно было выбирать необходимые звуковые пакеты. Пример сцены есть в unitypackage. Можно не использовать, а просто вызвать загрузку других пакетов любым удобным вам способом.


Само собой, вы можете подписываться на теги только там, где хотите иметь возможность менять звук на другой.

В AirHockeyVR я подписался на изменения звуков обучения, написал в нашем дискорде, и нашелся француз, который записал для нас французский перевод - так что идея вполне работает :)

Так же я попросил своего друга записать перевод на русский язык.


И вообще любой человек или группа людей может записать перевод для вашей игры - и сразу же добавить его в релизную версию (разработчик всё еще должен будет заапрувить этот аудиопакет, иначе он не появится в игре).


Проект в альфа-релизе, но уже пора пробовать - я морально готов к допилам на основе комментариев :)

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

0
Котик
Автор поста оценил этот комментарий

оффтопик, а не расскажете про выход на Окулус?

Как долго шли переговоры с менеджерами Oculus прежде чем игру пустили в магазин? Вы делали эксклюзивно или планируете и в стим закинуть?

Отличается ли модель монетизации на площадках?

Отличается ли динамика продаж в Steam и Oculus сторе? Имеются в виду продажи на старте и в течение года-двух.

Влияет ли на это маркетинговая кампания? Насколько сильно она разделена на этих площадках?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Мы в окулусе в AppLab, а не в основном сторе,
но там уже можно продаваться и торговать (правда с российским счетом сейчас нельзя, фэйсбук не выводит сюда деньги).
В АппЛаб берут в целом всех, после прохождения проверки, а проверка начинается с отправки билда в их ЛК (developer.oculus.com ищите тут, но опять же - не открывается просто так, ну вы понимаете :) )
Если бы я когда-нибудь был в стиме - я бы мог что-то сказать. Но наша игра пока что живет только в окулусе, хотя да, мы работаем над своей личной сетевухой, что бы отказаться от окулусовской сетевухи, как раз что бы было можно выйти в стим/куда угодно еще.
В целом в окулусе в хорошие времена денежка капала (игра стоила 7$ - 30% окулусу - 6$ налогов) и приходило около 350$ в месяц без рекламы вообще, но и игра у нас ходовая, как по мне. Сейчас она бесплатная и у нас 200-300 установок в день без рекламы вообще (кроме той что уже есть - сайдквест и стримеры, которых я тыкал записать про мою игру хоть что-то :))

Маркетинговой кампании у нас нет...  я не настоящий сварщик, я маску нашел :D
У нас чистейшее инди и нет издателя, так что хрен его знает как там люди с издателями живут. И продаж теперь тоже нет - игра бесплатная.

показать ответы
0
Автор поста оценил этот комментарий

Соурсы где-нить можно глянуть ничего не скачивая?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

На самом деле, я один из той самой немногочисленной группы людей, которым не похуй)

Но, я тебя услышал. У нас получилась стандартная история про

- Вот вам мои костыли.
- Так они же поломанные.
- Но я все равно их люблю.

Удачи с развитием сайта. У тебя все получится)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Спасибо. Костыли - да, но работают и позволят людям жить лучше, и эти костыли работают, что на самом деле является самым важным моментом.
Цель не гордиться фактом что я вам тут что то запостил - цель дядям и тетям у которых рабочий рот дать возможность озвучивать что то не имея для этого технических навыков. А плагин допилится со временем, я ж еще и для анриала и прочих собираюсь плагины делать :D
1
Автор поста оценил этот комментарий
Менять аудио в игре на лету нужно для того, что бы люди могли озвучку на своем языке делать.

Нет. Не нужно. Делаешь в настройках выбор языка, если пакетик с выбранным языком не скачан, скачиваешь. Все. Если нужно обновлять, при загрузки игры, проверяешь версию на сервере, она выше, обновляешь. Когда у тебя идет инициализация аудио на уровне (а тем более геймплей), их не должны ебать какие-то там подгрузки, выборы и т.д., они должны хватать уже готовое. Точно так же как и "Хелпера" твои, их так же все эти проблемы ебать не должны, они не должны асинхронно из сети тянуть звуки, а потом их через 10 секунд проигрывать. Он должен запросить готовый звук по тегу, если его нет, проиграть заглушку.

Все звуки можно загрузить на одной сцене перед непосредственным запуском игры, и потом использовать на других сценах. Если бы вы читали код внимательнее, увидели бы что все кешируется на диск и не выкачивается заново при запросе звука :)

А я что-то говорил про это разве? То что у тебя реализовано костыльное скачивание треков это понятно. Непонятно зачем городить всю эту свистопляску с подписками.

Ну и раз мы затронули эту тему, то у тебя, судя по коду, может произойти ситуация когда хелпер тянет клип, его нет, он его докачивает, но при этом на диск уже не кэширует. Так что ерничать про понимание кода тут не нужно)

Жизненный цикл - выбрал пакеты звуков в виде ID, положил в строку, загрузил, юзаешь так же, как будто у тебя стандартные юньковские массивы/листы/очереди/да что угодно другое звуков.

Ты похоже не понимаешь, что такое жизненный цикл. В предложенном варианте, есть вероятность что пока твой менеджер будет скачивать звуки, игровые объекты уже пройдут через OnEnable, попробуют запустить звук (через метод подписки, какого-то хуя), и не запустят. И ты будешь сидеть без звука. Поэтому насколько я понимаю, ты стартуешь все звуки еще и при инициализации "базы". Потому как нет понимания, что за чем идет. Как повезет, так и сыграет.


У тебя вообще это по идее должно быть разделено на несколько отдельных классов.

Я не решаю за вас как вы будете использовать звуки - это просто пример как их получить, с дозагрузкой или без - ваше дело.

Ну у тебя там много чего тогда нужно удалить, потому что сейчас, ты решает что все подписанные объекты, прозвучат при простом обновлении "базы".

А таски с корутинами - начинал на корутинах, потом понял что таски в плане загрузки конечного АудиоКлипа сильно проще.

Обрати тогда внимание на UniTask.

В конце концов, это ж гитхаб - считаете что можно лучше - велком улучшать :)

Это ты конечно хорошо устроился) Но у тебя тут к сожалению нужно просто заново все переписать. Но тратить на это свое время, мы, конечно же, не будем. Бля, хотя обычно я как раз таки такой хуйней и страдаю...(


А вообще почитай про Adressable. Если ты заморачиваешься с сайтом, с идеей о том, что кто-то это будет использовать, то забей. Это неудобно, и не интересно никому кроме тебя. Никто не захочет зависеть от хуй пойми какого сайта, как минимум.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Нет. Не нужно. Делаешь в настройках выбор языка, если пакетик с выбранным языком не скачан, скачиваешь. Все. Если нужно обновлять, при загрузки игры, проверяешь версию на сервере, она выше, обновляешь. Когда у тебя идет инициализация аудио на уровне (а тем более геймплей), их не должны ебать какие-то там подгрузки, выборы и т.д., они должны хватать уже готовое. Точно так же как и "Хелпера" твои, их так же все эти проблемы ебать не должны, они не должны асинхронно из сети тянуть звуки, а потом их через 10 секунд проигрывать. Он должен запросить готовый звук по тегу, если его нет, проиграть заглушку.
Все звуки предзагружаются при клике на Apply в примере.
Они все записываются на диск - проверено на винде и на андройде.
Далее, по необходимости - что бы не грузить все в память - при подписке любому компоненту выдаются его звуки по тэгу. При отписке - на выход из памяти. Ничего в этот момент уже не скачивается из сети, все уже загружено - тут только заполняются АудиоКлипы с диска в переменные где они должны быть :)

А я что-то говорил про это разве? То что у тебя реализовано костыльное скачивание треков это понятно. Непонятно зачем городить всю эту свистопляску с подписками.
Ну и раз мы затронули эту тему, то у тебя, судя по коду, может произойти ситуация когда хелпер тянет клип, его нет, он его докачивает, но при этом на диск уже не кэширует. Так что ерничать про понимание кода тут не нужно)
Я не слежу что за чем идет - этим занимается конечный разраб.
Захочет - будет менять звуки на лету. Не захочет - сделает загрузку в отдельной сцене, после которой только будет включать всю остальную игру.
Подписка нужна для того случая, когда в игре уже и так все готово. И осталось просто добавить чуть-чуть кода, что бы во всем готовом можно было менять звуки, не трогая больше никакой код вообще. У тебя массив звуков - заполни его нашим массивом звуков и не парься. У тебя дикшенари звуков - заполни дикшенари.

Ну у тебя там много чего тогда нужно удалить, потому что сейчас, ты решает что все подписанные объекты, прозвучат при простом обновлении "базы".
Ну блин, пример для того и пример, что бы быть примером. Да, у меня звучат в примере, что бы было понятно, что загружаются новые.

Обрати тогда внимание на UniTask.
Никаких лишних зависимостей. Все работает на голом проекте от 2020.3 юнити. Просто открой пустой проект, залей туда плагин и открой сцену - заведется сходу без какого-либо конфига вообще.

Это ты конечно хорошо устроился) Но у тебя тут к сожалению нужно просто заново все переписать. Но тратить на это свое время, мы, конечно же, не будем. Бля, хотя обычно я как раз таки такой хуйней и страдаю...(
А вообще почитай про Adressable. Если ты заморачиваешься с сайтом, с идеей о том, что кто-то это будет использовать, то забей. Это неудобно, и не интересно никому кроме тебя. Никто не захочет зависеть от хуй пойми какого сайта, как минимум.
Пакетик с выбранным языком тебе кто переведет? Че то я вижу кучу игр с русским текстом, но не русским звуком. И уж явно не потому что всем лень переводить - потому что они не могут перевести. Вот я и даю интерфейс для этого.

Про адрессаблы я и читал, и использовал. Ты говоришь что у меня не удобно, но что бы добавить новую озвучку в игру - я залью файл на сайт и все. Ты в адрессаблах откроешь код, зальешь файл, сбилдишь, зальешь опять же на сервак. Ну и про хуй пойми какой сайт - все сайты хуй пойми какие, пока их никто не знает.

И фу блядь быть таким "с идеей о том, что кто-то это будет использовать, то забей". У меня в игру каждый день 300 человек добавляется, только потому что не забил.
А люди типа тебя с советами забить, только портят всё тем, кто не забивает.

показать ответы
1
Автор поста оценил этот комментарий

Сорян, но это пиздец)

Я даже не знаю с какой стороны тут начинать доебываться)

Таски в перемешку с коротинами,

коротины GetЧтототам которые ничего не возвращают,

Классы обертки с названием *List, а внутри массивы, при этом при налииxbb обертки в словаре по старинке ебется List<Audio>. АААааааа.

Все звуки запускаются через GetAudioClipsInfo. Я в ахуе.

Звуки зачем-то могут лениво дозагружаться, и проигрываться через хуй знает какое время, отследить это нельзя.

Все остальные процессы в коротинах так же ебутся сами по себе, и их так же нельзя отследить.

Жизненные циклы не понятны, и если что-то где-то лагнет, то все пойдет по пизде.

Про общую архитектуру и принципы проектирования, которые так же пошли нахуй, я промолчу.

Блин, это сложно описывать. Можно почти до каждой строчки доебаться.


Судя по тому что я увидел, это все больше похоже на попытку накостылить какой-то дебаг функционал, чтобы менять на сайте записи, и сразу слышать изменения в игре. Но зачем? Но при этом дергать обновление нужно все равно в ручную. И нахуя все это нужно, остается загадкой.

По идее обновленные звуки должны через те же адресСабли загружать перед загрузкой игры и все.


А эта тема должна была быть оформлена как отдельная УИшка в движке, где можно было бы протыкать чо нужно, без привязки к проекту. Это выглядело бы логичнее как по мне.


Использовать такое у себя, тихо, можно (но не долго). Предлагать такое остальным, нельзя.

Иллюстрация к комментарию
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ну вот не надо.
Менять аудио в игре на лету нужно для того, что бы люди могли озвучку на своем языке делать.

Все звуки можно загрузить на одной сцене перед непосредственным запуском игры, и потом использовать на других сценах. Если бы вы читали код внимательнее, увидели бы что все кешируется на диск и не выкачивается заново при запросе звука :)

Жизненный цикл - выбрал пакеты звуков в виде ID, положил в строку, загрузил, юзаешь так же, как будто у тебя стандартные юньковские массивы/листы/очереди/да что угодно другое звуков.
Я не решаю за вас как вы будете использовать звуки - это просто пример как их получить, с дозагрузкой или без - ваше дело.


А таски с корутинами - начинал на корутинах, потом понял что таски в плане загрузки конечного АудиоКлипа сильно проще.
В конце концов, это ж гитхаб - считаете что можно лучше - велком улучшать :)

показать ответы
0
Автор поста оценил этот комментарий

Соурсы где-нить можно глянуть ничего не скачивая?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Пока нет, но через час запилю в гит. Напишу как сделаю :)
0
Автор поста оценил этот комментарий

Сервак для проекта - минималка, так что если он тормозит - не злитесь :)

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества