Экспериментальная оболочка Unity для YouTube Playables

С помощью этой обертки вы можете получить доступ к SDK YouTube Playables в Unity C#. Обертка включает в себя плагин .jslib и файл C#, которые помогут ускорить разработку. Также имеется пример проекта, демонстрирующий, как вы можете использовать эти компоненты в своем проекте.

Пакеты Unity можно загрузить из нашего репозитория с примерами Playables.

Использование

  1. Убедитесь, что в настройках платформы вашего проекта Unity установлено значение WebGL . Этот параметр находится в Build Settings .
  2. Либо используйте WebGLTemplate для создания игры для веб-платформы, либо следуйте инструкциям в разделе «Используйте собственный файл index.html» и убедитесь, что вы настроили и инициализировали веб-SDK в своем файле index.html .
    • WebGLTemplate можно найти в пакете Google-WebGLTemplate-only.unitypackage или GoogleYTGameWrapper-with-sample.unitypackage . Чтобы установить и использовать этот шаблон, выполните действия, описанные в разделе «Шаблоны WebGL» .
    • Чтобы использовать собственный веб-файл и файл index.html , вам потребуется добавить две строки в скрипт создания файла index.html в Unity (см. раздел «Использование собственного файла index.html» для интеграции).
  3. Откройте свой проект в Unity, затем откройте и импортируйте любой из этих пакетов в свой проект.
    • GoogleYTGameWrapper.unitypackage : Содержит JS-плагин для подключения к SDK YouTube Playables и обертку на C# для подключения к вашему продукту.
    • GoogleYTGameWrapper-with-sample.unitypackage : Содержит те же файлы, что и в пакете GoogleYTGameWrapper, а также пример использования SDK YouTube Playables на C#.
  4. ВАЖНО: В основной сцене создайте новый игровой объект и назовите его YTGameWrapper . Этот игровой объект используется для взаимодействия с JS-мостом.
  5. ВАЖНО: Добавьте импортированный код YTGameWrapper.cs в качестве компонента скрипта к игровому объекту YTGameWrapper .
  6. Если ваш проект содержит несколько сцен, обязательно добавьте DontDestroyOnLoad в скрипт YTGameWrapper.cs (обратите внимание: в новых версиях скрипта есть переключатель DontDestroyOnSceneChange , который включен по умолчанию). Это гарантирует, что скрипт и GameObject останутся активными на протяжении всей игры.

    GameObject.DontDestroyOnLoad(this.gameObject);
    
  7. Компонент YTGameWrapper.cs и игровой объект YTGameWrapper используются для подключения к SDK YouTube Playables. Используйте их для подключения к YouTube. Вы можете найти объект и компонент с помощью скрипта или добавить их вручную в код игры через редактор Unity.

  8. Убедитесь, что вы соблюдаете технические требования вашего проекта.

Используйте собственный файл 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

  1. Для первоначальной настройки следуйте инструкциям по установке пакета Unity, указанным выше . Убедитесь, что используете Google-WebGLTemplate-only.unitypackage или GoogleYTGameWrapper-with-sample.unitypackage и импортируйте все файлы из папки WebGLTemplates/YTGameWrapperTemplate/ .
    • Примечание: если вы еще не импортировали YTGameWrapper.cs и UnityYTGameSDKLib.jslib , вам следует импортировать и их.
  2. Установите для вашего шаблона WebGL значение YTGameWrapperTemplate . Эта настройка находится в Edit » -> Project settings -> Player -> вкладка WebGL -> раздел Resolution and Presentation .
    • Примечание: В шаблоне ширина и высота холста по умолчанию установлены на 100%, поэтому эти настройки Unity ничего не изменят.
  3. Убедитесь, что для Compression Format установлено значение «Отключено». Этот параметр находится в Project settings -> Player -> вкладка WebGL -> раздел Publishing Settings .
  4. В окне Build Settings выполните сборку для WebGL , затем перейдите к шагу 7 или 5 в зависимости от потребностей вашего проекта.
  5. Шаги 5 и 6 следует выполнять только в том случае, если используется сжатие : После сборки проекта перейдите в папку сборки и откройте папку Build . Найдите файлы .wasm или .data вашего проекта, которые необходимо сжать, чтобы они соответствовали ограничениям по размеру отдельных файлов , и заархивируйте эти файлы. Обязательно удалите исходные файлы .wasm / .data , которые были сжаты, так как вместо них вы будете отправлять файлы *.wasm.zip и *.data.zip .
    • Примечание: если вы используете Mac, вы можете щелкнуть правой кнопкой мыши по файлу и выбрать «Сжать *». На ПК вы можете щелкнуть правой кнопкой мыши по файлу и выбрать «Сжать в ZIP-файл».
  6. Выполняйте эти действия только в том случае, если вы выполнили шаг 5 : Обновите файл index.html , созданный на основе YTGameWrapperTemplate , чтобы он загружал заархивированные файлы и распаковывал их.
    • В конце файла index.html вы найдете Path 1 и закомментируйте следующую строку InitUnitySection(); .
    • В конце файла index.html вы найдете Path 2 и закомментируйте следующую строку loadResources(InitUnitySection); .
  7. При отправке проекта на сертификацию вам необходимо будет переслать все файлы, скомпилированные в Unity, в папку сборки, указанную в шаге 4. Если вы выполнили шаги 5 и 6, включите эти файлы также.

Обновите предоставленные примеры, чтобы они использовали универсальный конвейер рендеринга (URP).

Одно из последних достижений в новых версиях Unity — использование универсального конвейера рендеринга (URP). Это позволяет улучшить пример, чтобы всё отображалось корректно.

  1. Для начала импортируйте пакет GoogleYTGameWrapper-with-sample.unitypackage в новый или существующий проект.
  2. Перейдите в окно Render Pipeline Converter : Window -> Rendering -> Render Pipeline Converter .
  3. Выберите Rendering Settings , Material Upgrade и Readonly Material Converter .
  4. Далее выберите Initialize and Convert , дождитесь завершения этого процесса, и образец должен быть готов для URP.

Как разбить ресурсы на части в проекте Unity (ленивая загрузка)

Одна из главных проблем, на которую указывают разработчики при использовании Unity, — это соблюдение требований к размеру отдельных файлов и общему размеру пакета .

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

Для обеспечения корректной загрузки Unity предлагает несколько способов разделения ресурсов, гарантируя, что отдельные группы ресурсов не превышают лимиты по размеру и что контент загружается постепенно. Мы рекомендуем использовать либо Addressables, либо Asset Bundles.

Адресуемые

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

Для использования Addressables вам потребуется импортировать пакет Addressables через менеджер пакетов в Unity, а затем добавить ваши ресурсы в группы Addressable. Более подробную информацию можно найти в документации Unity .

Пакеты активов

Наборы ресурсов (Asset Bundles) очень полезны, так как позволяют разделить проект и загружать элементы на лету. Они пригодятся для DLC, наборов уровней, новых персонажей и многого другого. Наборы ресурсов отлично подходят для самостоятельной загрузки и объединения контента. Их можно использовать, помечая ресурсы тегами и объединяя их в определенные наборы, а затем загружая наборы по мере необходимости. Более подробную информацию можно найти в документации Unity по наборам ресурсов .

См. полную справочную информацию по API YT Playables .