С помощью этой обертки вы можете получить доступ к SDK YouTube Playables в Unity C#. Обертка включает в себя плагин .jslib и файл C#, которые помогут ускорить разработку. Также имеется пример проекта, демонстрирующий, как вы можете использовать эти компоненты в своем проекте.
Пакеты Unity можно загрузить из нашего репозитория с примерами Playables.
Использование
- Убедитесь, что в настройках платформы вашего проекта Unity установлено значение
WebGL. Этот параметр находится вBuild Settings. - Либо используйте
WebGLTemplateдля создания игры для веб-платформы, либо следуйте инструкциям в разделе «Используйте собственный файл index.html» и убедитесь, что вы настроили и инициализировали веб-SDK в своем файлеindex.html.-
WebGLTemplateможно найти в пакетеGoogle-WebGLTemplate-only.unitypackageилиGoogleYTGameWrapper-with-sample.unitypackage. Чтобы установить и использовать этот шаблон, выполните действия, описанные в разделе «Шаблоны WebGL» . - Чтобы использовать собственный веб-файл и файл
index.html, вам потребуется добавить две строки в скрипт создания файлаindex.htmlв Unity (см. раздел «Использование собственного файла index.html» для интеграции).
-
- Откройте свой проект в Unity, затем откройте и импортируйте любой из этих пакетов в свой проект.
-
GoogleYTGameWrapper.unitypackage: Содержит JS-плагин для подключения к SDK YouTube Playables и обертку на C# для подключения к вашему продукту. -
GoogleYTGameWrapper-with-sample.unitypackage: Содержит те же файлы, что и в пакете GoogleYTGameWrapper, а также пример использования SDK YouTube Playables на C#.
-
- ВАЖНО: В основной сцене создайте новый игровой объект и назовите его
YTGameWrapper. Этот игровой объект используется для взаимодействия с JS-мостом. - ВАЖНО: Добавьте импортированный код
YTGameWrapper.csв качестве компонента скрипта к игровому объектуYTGameWrapper. Если ваш проект содержит несколько сцен, обязательно добавьте
DontDestroyOnLoadв скриптYTGameWrapper.cs(обратите внимание: в новых версиях скрипта есть переключательDontDestroyOnSceneChange, который включен по умолчанию). Это гарантирует, что скрипт и GameObject останутся активными на протяжении всей игры.GameObject.DontDestroyOnLoad(this.gameObject);Компонент
YTGameWrapper.csи игровой объектYTGameWrapperиспользуются для подключения к SDK YouTube Playables. Используйте их для подключения к YouTube. Вы можете найти объект и компонент с помощью скрипта или добавить их вручную в код игры через редактор Unity.Убедитесь, что вы соблюдаете технические требования вашего проекта.
Используйте собственный файл index.html.
Если вы не используете предоставленный пример index.html , вам потребуется добавить две строки кода в скрипт создания index.html в Unity.
Сначала добавьте эту строку в то же место, где ваш проект устанавливает переменные для контейнера Unity, холста и т. д.
var container = document.querySelector("#unity-container");
var canvas = document.querySelector("#unity-canvas");
var unityGameInstance = null; // <-- Add this line >
...
Во-вторых, добавьте эту строку внутрь функции createUnityInstance .
createUnityInstance(canvas, config, (progress) => {
progressBarFull.style.width = 100 * progress + "%";
}).then((unityInstance) => {
unityGameInstance = unityInstance; // <-- Add this line >
...
Примеры
В этом разделе приведены примеры использования обертки на C#, это не полный список доступных API. Полный список доступных API см. в SDK YouTube Playables .
sendScore
В этом примере показана реализация функции sendScore(int points) на языке C#:
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
public int battleScore = 0;
...
// Update the total score and send this to the YouTube Game Wrapper.
public void UpdateScores(int scoreAmt)
{
battleScore += scoreAmt;
// ytGameWrapper should be a reference to your YTGameWrapper component.
ytGameWrapper.SendGameScore(battleScore);
}
onPause
Это пример того, как игра может отслеживать события Pause , поступающие от YT Playables, чтобы приостанавливать работу движка при необходимости:
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
public bool gameIsPaused = false;
...
void Start()
{
// Sets the OnPause callback with the YT Playables SDK
ytGameWrapper.SetOnPauseCallback(PauseTheGameCallback);
}
// Pause game callback, will pause the game when called.
public void PauseTheGameCallback()
{
gameIsPaused = true;
}
saveData
Это пример использования функции saveData для отправки данных в SDK YouTube Playables:
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
...
// Saves the current score of the game and converts it to a JSON format.
public void SaveScore(int scoreAmt)
{
SaveGameData("{\"BestScore\": \"" + scoreAmt.ToString() + "\"}");
}
public void SaveGameData(string saveString)
{
if (string.IsNullOrEmpty(saveString)) return;
// Sends save data to the YT Playables SDK
ytGameWrapper.SendGameSaveData(saveString);
}
loadData
Это пример использования loadData для отправки данных в SDK YouTube Playables:
...
using UnityEngine;
using YTGameSDK;
...
[Serializable]
public class LoadedScores
{
public int BestScore;
public float BestTime;
}
public YTGameWrapper ytGameWrapper;
...
void Start()
{
ytGameWrapper.LoadGameSaveData(LoadSaveGameDataReturned);
}
public void LoadSaveGameDataReturned(string data)
{
if (!string.IsNullOrEmpty(data))
{
LoadedScores loadedScores = JsonUtility.FromJson<LoadedScores>(data);
Debug.Log("LoadSaveGameDataReturned > Score <" + loadedScores.BestScore.ToString()
+ "> Time <" + loadedScores.BestTime.ToString("0.00"));
}
}
requestInterstitialAd
Это пример использования requestInterstitialAd , указывающего на подходящее время для показа межстраничной рекламы, если она доступна. Для достижения наилучших результатов выполняйте этот вызов во время перерыва в игровом процессе, например, в конце уровня.
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
...
// At the end of a round send a request to show an interstitial Ad, if one is
// available an Ad will be shown and Pause Game Callback should be called.
// EXAMPLE: send and forget
public void RequestInterstitialAd()
{
ytGameWrapper.RequestInterstitialAd();
}
// EXAMPLE: send and react to if an Ad was shown
public void RequestInterstitialAd()
{
int status = ytGameWrapper.RequestInterstitialAd();
if (status == 0)
{
// Ad request was successful, do some action.
}
}
requestRewardedAd
Это пример использования requestRewardedAd . Он используется, когда пользователь выбрал просмотр рекламы с вознаграждением в обмен на какое-либо вознаграждение в вашей игре. Если реклама доступна, она будет показана пользователю.
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
...
public void RequestRewardedAd()
{
// Register callback for Rewarded Ads. If an Ad is available one will be
// shown. Pause Game Callback should be called. Any ID is fine as long as
// its identifyable for your game.
ytGameWrapper.RequestRewardedAd("my-reward-ad-id-123", (rewardEarned) => {
if (rewardEarned) {
// Rewarded Ad is earned, reward the user.
} else {
// Rewarded Ad not earned, take the appropriate action
}
});
}
Как использовать пример шаблона WebGL с YouTube
Если у вас не очень большой проект Unity, то размер ваших скомпилированных файлов .wasm и .data не должен превышать установленный нами лимит на размер отдельных файлов . В этом случае дополнительное сжатие этих файлов с вашей стороны не требуется, так как они будут автоматически сжаты при отправке воспроизводимых файлов. Это автоматическое сжатие также проверит, соответствует ли ваш файл .wasm требованиям к первоначальному размеру пакета . Например, файл .wasm размером около 25 МиБ будет сжат до ~7 МиБ.
Если по какой-либо причине размер ваших файлов превышает максимально допустимый предел, лучше всего использовать ZIP-сжатие, чтобы убедиться, что они укладываются в этот лимит. Сжатие Playable не будет повторно сжимать эти файлы.
Шаблон WebGL
- Для первоначальной настройки следуйте инструкциям по установке пакета Unity, указанным выше . Убедитесь, что используете
Google-WebGLTemplate-only.unitypackageилиGoogleYTGameWrapper-with-sample.unitypackageи импортируйте все файлы из папкиWebGLTemplates/YTGameWrapperTemplate/.- Примечание: если вы еще не импортировали
YTGameWrapper.csиUnityYTGameSDKLib.jslib, вам следует импортировать и их.
- Примечание: если вы еще не импортировали
- Установите для вашего шаблона WebGL значение
YTGameWrapperTemplate. Эта настройка находится вEdit» ->Project settings->Player-> вкладкаWebGL-> разделResolution and Presentation.- Примечание: В шаблоне ширина и высота холста по умолчанию установлены на 100%, поэтому эти настройки Unity ничего не изменят.
- Убедитесь, что для
Compression Formatустановлено значение «Отключено». Этот параметр находится вProject settings->Player-> вкладкаWebGL-> разделPublishing Settings. - В окне
Build Settingsвыполните сборку дляWebGL, затем перейдите к шагу 7 или 5 в зависимости от потребностей вашего проекта. - Шаги 5 и 6 следует выполнять только в том случае, если используется сжатие : После сборки проекта перейдите в папку сборки и откройте папку
Build. Найдите файлы.wasmили.dataвашего проекта, которые необходимо сжать, чтобы они соответствовали ограничениям по размеру отдельных файлов , и заархивируйте эти файлы. Обязательно удалите исходные файлы.wasm/.data, которые были сжаты, так как вместо них вы будете отправлять файлы*.wasm.zipи*.data.zip.- Примечание: если вы используете Mac, вы можете щелкнуть правой кнопкой мыши по файлу и выбрать «Сжать *». На ПК вы можете щелкнуть правой кнопкой мыши по файлу и выбрать «Сжать в ZIP-файл».
- Выполняйте эти действия только в том случае, если вы выполнили шаг 5 : Обновите файл
index.html, созданный на основеYTGameWrapperTemplate, чтобы он загружал заархивированные файлы и распаковывал их.- В конце файла
index.htmlвы найдетеPath 1и закомментируйте следующую строкуInitUnitySection();. - В конце файла
index.htmlвы найдетеPath 2и закомментируйте следующую строкуloadResources(InitUnitySection);.
- В конце файла
- При отправке проекта на сертификацию вам необходимо будет переслать все файлы, скомпилированные в Unity, в папку сборки, указанную в шаге 4. Если вы выполнили шаги 5 и 6, включите эти файлы также.
Обновите предоставленные примеры, чтобы они использовали универсальный конвейер рендеринга (URP).
Одно из последних достижений в новых версиях Unity — использование универсального конвейера рендеринга (URP). Это позволяет улучшить пример, чтобы всё отображалось корректно.
- Для начала импортируйте пакет
GoogleYTGameWrapper-with-sample.unitypackageв новый или существующий проект. - Перейдите в окно
Render Pipeline Converter:Window->Rendering->Render Pipeline Converter. - Выберите
Rendering Settings,Material UpgradeиReadonly Material Converter. - Далее выберите
Initialize and Convert, дождитесь завершения этого процесса, и образец должен быть готов для URP.
Как разбить ресурсы на части в проекте Unity (ленивая загрузка)
Одна из главных проблем, на которую указывают разработчики при использовании Unity, — это соблюдение требований к размеру отдельных файлов и общему размеру пакета .
Ленивая загрузка ресурсов — это отличная оптимизация для вашего проекта, поскольку вы можете загружать ресурсы, уровни и данные по мере необходимости. Наша команда по сертификации может отменить ограничения на общий размер файлов, если это будет сделано правильно, так как ваша игра не будет загружаться сразу, а будет загружаться по мере того, как пользователь будет перемещаться по вашему продукту.
Для обеспечения корректной загрузки Unity предлагает несколько способов разделения ресурсов, гарантируя, что отдельные группы ресурсов не превышают лимиты по размеру и что контент загружается постепенно. Мы рекомендуем использовать либо Addressables, либо Asset Bundles.
Адресуемые
Адресуемые объекты позволяют идентифицировать различные файлы, которые должны загружаться вместе, и Unity возьмет на себя большую часть процесса упаковки. Unity также предоставляет некоторые инструменты для управления размерами файлов и помогает избежать дублирования ресурсов.
Для использования Addressables вам потребуется импортировать пакет Addressables через менеджер пакетов в Unity, а затем добавить ваши ресурсы в группы Addressable. Более подробную информацию можно найти в документации Unity .
Пакеты активов
Наборы ресурсов (Asset Bundles) очень полезны, так как позволяют разделить проект и загружать элементы на лету. Они пригодятся для DLC, наборов уровней, новых персонажей и многого другого. Наборы ресурсов отлично подходят для самостоятельной загрузки и объединения контента. Их можно использовать, помечая ресурсы тегами и объединяя их в определенные наборы, а затем загружая наборы по мере необходимости. Более подробную информацию можно найти в документации Unity по наборам ресурсов .
См. полную справочную информацию по API YT Playables .