Как включить в игру на UE4 достижения Steam

Как включить в игру на UE4 достижения Steam

При публикации игры этот пункт не является обязательным, но отмечен как настоятельно рекомендуемый. Но зачем рекомендовать разработчику то, что он сам бы с радостью сделал?

Намного полезней будет объяснить, как внедрить Steamworks SDK в UE4, и как после этого ковыряться в блюпринтах. При желании, по теме можно немного нагуглить, подумать и разобраться самому. Но не все разработчики настолько трудолюбивы. Возможно, кому-то эта статья сэкономит уйму времени и нервов. Должен признаться, у автора есть свой шкурный интерес. Давайте договоримся так: вы идете по ссылке https://store.steampowered.com/app/1786330/The_Pied_Piper_of_Gamelin/?beta=1 и давите кнопку «WISHLIST». Это бесплатно, и ни к чему не обязывает. А я в свою очередь рассказываю коротко и ясно, как мутить ачивки. Заметано?

Итак, качаем Steamworks_SDK_###.zip. У меня вместо решеток было 152, тут все понятно. Первый вопрос: куда распаковывать? Скорее всего, правильную папку надо создавать руками. Там, где лежит любимая версия UE4, откройте подкаталог Engine, далее Source, следом ThirdParty, и наконец SteamWorks. Посмотрите, что там творится? Лично я увидел подкаталог Steamv142, а потому был вынужден создать рядом подпапку Steamv152. Вот куда надо разворачивать архив. Внутри Steamv152 должны сидеть папки SDK, дальше glmr, publik, tools . . . Ну вы поняли. А еще в папке SteamWorks лежит файлик steamworks.build.cs, который надо открыть любым текстовым редактором и внимательно прочитать. Там я увидел крамольные строки: string SteamVersion = "v142"; и еще PublicDefinitions.Add("STEAM_SDK_VER=TEXT(\"1.42\")");

Аккуратно перебил четверки на пятерки. Большое дело сделано, но это только начало. Находясь в глубине дерева любимого движка, выходим немного выше в подкаталог Engine. Оттуда идем в Binaries, далее ThirdParty и опять же, Steamworks. Внутри снова делаем подпапку Steamv152, или какая будет актуальная версия. Там, внутри делаем еще две папки: Win32 и Win64. В Win32 кладем Steam_api.dll из SDK\redistributable_bin, а потом еще из корня клиента Steam подкладываем Steamclient.dll, tier0_s.dll, vstdlib_s.dll. В каталог Win64 из SDK\redistributable_bin\win64 копируем steam_api64.dll, а из клиента Steam копируем steamclient64.dll, tier0_s64.dll, vstdlib_s64.dll.

Гемор, да? Зато теперь Steamworks_SDK корректно вставлен в обойму UE4. Не забудьте в окне плагинов найти строчку «Online Platform», прокрутить список до блока «Online Susbsystem Steam» и взвести галку «Enabled». Потребуется перезагрузка, а как вы хотели?

Настало время конфигурить проект. Там в папке Config лежит файл DefaultEngine.ini, открываем его любым текстовым редактором и копипастим в хвост такой вот блок:

[/Script/Engine.GameEngine]

+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

[OnlineSubsystem]

DefaultPlatformService=Steam

[OnlineSubsystemSteam]

bEnabled=true

SteamDevAppId=480

[/Script/OnlineSubsystemSteam.SteamNetDriver]

NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"

И только теперь мы готовы добавлять ачивки. Делается это с двух сторон: на странице в SteamWorks и в DefaultEngine.ini.

В SteamWorks в «управлении приложениями» прокручиваем до блока «Облик в сообществе» и жмем «Достижения». Для каждого достижения нужно назначить три текстовые строки и загрузить две иконки. Точнее, два варианта одной иконки, цветной и черно-белый. «Название для API» - по сути идентификатор, некая уникальная строка, написанная латинскими буквами. «Название для отображения» - краткое имя ачивки, а «Описание» - краткая формулировка условий получения. К примеру, «100 хедшотов подряд» - это описание, за подвиг даем ачивку с названием для отображения «Desperado”. В строке «Название для API» можно написать «ACH_DESPERADO». Названия для API надо будет перечислить в DefaultEngine.ini в секции [OnlineSubsystemSteam]. Как-то так: Achievement_0_id="ACH_DESPERADO"

Главное — не ошибиться в названии для API.

И наконец, начинаем ваять блюпринты. К нашим услугам примерно пять нод. «Примерно» - это потому, что шестая устаревшая, а из пяти актуальных реально нужны только три. Вообще, онлайновые ноды примечательны тем, что имеют на выходе целых три контакта: один безымянный, а ниже - сладкая парочка: On Success/On Failure.

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

Кстати: для отладки ачивок не забудьте вместо Selected ViewPort запускать игру в режиме Standalone Game. Если все правильно настроено, будет виден оверлей и иконки ачивок.

Ноду «Cache Achievements» логично расположить где-то в последовательности «BeginPlay», причем если не в самом конце, то продолжать тянуть белую соплю надо именно из безымянного ключа. До тех пор, когда полученные из сети данные понадобятся, либо Success, либо Failure стопудово сработает. Я кстати, не знаю, что делать геймеру, если случилась Failure: все равно продолжать играть, или пойти гулять с собакой?

Лично я определяю Success или Failure по результату работы ноды Get Cached Achievement Progress: если ачивка не получена, но сервер норм отзывается, вернется вполне вразумительный ноль. А если сервер не виден - булевый выход «Found Id» вернет неправду.

Некоторые ачивки могут быть взаимозависимы, а потому Get Cached Achievement Progress иногда делать приходится, благо оно работает практически мгновенно.

А нода Write Achievement Progress опять имеет на выходе три ключа, и опять я не знаю, что будет с геймером, если под утро Write Achievement Progress вернет Failure. Видимо, делать паузу и пытаться записать повторно. А вообще, надо тоже понимать, что результат работы ноды можно узнать не мгновенно, а примерно через секунду. В ряде случаев это вечность.

Зачем внутри игры нужна Achievement Description – не понимаю в упор. Игрок все узнает из оверлея.

Если кому интересно, что у меня сейчас на уме — подписывайтесь на блог разработчика: https://vk.com/creatorone или https://t.me/TheCreatorOne кому как удобнее.

5050
31 комментарий

Всегда было интересно как именно работают ачивки/трофеи. Как, когда и где срабатывают триггеры, действительно ли существуют какие-то скрытые счетчики событий, регистрирующие количество условных попаданий в левую пятку из конкретного оружия, трудоемкий ли это вообще процесс, как вообще разрабы относятся к необходимости добавления трофеев (у плойки их наличие - это вроде обязательное условие выхода игры на платформе) и кто из команды обычно этим занимается и их придумывает. Но тут написано как-то кучеряво, мало что понятно, не для простого обывалы. Если есть где норм статьи про это, дайте почитать.

3

Это тема совсем другой статьи. И очень большая тема. Как именно оно работает - везде по разному, как разработчик реализовал, так и работает. А разрабы каждый во что горазд: у одних техзадание, у других - понятия, у третьих не знаю что. Трудоемко оно всегда, вариантов сделать хоть скрытый, хоть открытый счетчик невероятно много. Буквально все можно считать и показывать внутри игры, не связываясь со Стимом. Есть такая должность - геймдизайнер, в принципе оно в зоне его ответственности. Делать можно что угодно, но будет ли оно интерсно игроку? Разработчику вот интересно: надо геймеру число попаданий в левую пятку, или интереснее, как нога отваливается? Обычно идут методом проб и ошибок, если кто придумает что удачное - беззастенчиво скопируют все, кому не лень.

6

Подходы разные, но в целом ачивки легко добавлять.
1. Кто-то сразу по ивенту отправляет запрос к АПИ.
2. Кто-то пишет в локальный сейв ивент, чтобы потом можно было прочитать и восстановить ачивки, к примеру.
Единственное, в Стиме два типа ачивок:
1. Клиентские
2. Серверные
Если с первыми проблем нет (разве что, взлом тем же SAM'ом), то для вторых нужно писать логику дополнительную на серваке (обычно для мультиплеерных игр используют).
Был бы запрос на такое, я бы мог для Unity написать подробную статью.

1

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

В основном ачивка это проверка исполнено ли действие "А", если да, то либо начисляется указанный разработчиков прогресс для выполнения, либо выдается сама ачивка.

Зачем тебе последняя версия SteamWorks? Используй ту, которая идет с движком.

2

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

Комментарий недоступен

1