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

С помощью этой оболочки вы получите доступ к YouTube Playables SDK в 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» .
    • Чтобы использовать собственный файл Web и index.html , вам потребуется добавить две строки в скрипт создания index.html в Unity, см. раздел Использование собственного файла index.html для интеграции.
  3. Откройте свой проект в Unity, затем откройте и импортируйте любой пакет в свой проект.
    • GoogleYTGameWrapper.unitypackage : содержит плагин JS для подключения YouTube Playables SDK и оболочку C#, помогающую подключить его к вашему продукту.
    • GoogleYTGameWrapper-with-sample.unitypackage : содержит те же файлы, что и в пакете GoogleYTGameWrapper, а также пример, демонстрирующий, как использовать YouTube Playables SDK в C#.
  4. ВАЖНО: В основной сцене создайте новый игровой объект и назовите его YTGameWrapper . Этот игровой объект будет использоваться для взаимодействия с JS-мостом.
  5. ВАЖНО: Добавьте импортированный код YTGameWrapper.cs как компонент скрипта в GameObject YTGameWrapper .
  6. Если в вашем проекте несколько сцен, обязательно добавьте DontDestroyOnLoad в скрипт YTGameWrapper.cs (примечание: в новых версиях скрипта есть переключатель DontDestroyOnSceneChange , который по умолчанию включён). Это обеспечит сохранение скрипта и GameObject на протяжении всей игры.

    GameObject.DontDestroyOnLoad(this.gameObject);
    
  7. Компонент YTGameWrapper.cs и игровой объект YTGameWrapper используются для подключения к YouTube Playables SDK. Используйте их для подключения к 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 см. в YouTube Playables SDK .

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 и отправлять его в YT Playables SDK:

...
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 и отправлять его в YT Playables SDK:

...
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.
    }
}

Как использовать пример шаблона WebGL от YouTube

Если у вас не очень тяжёлый проект Unity, ваши собранные файлы .wasm и .data не должны превышать установленного нами индивидуального ограничения на размер файла . В этом случае вам не нужно дополнительно сжимать эти файлы, так как они будут автоматически сжаты при отправке ваших воспроизводимых файлов. Это автоматическое сжатие также проверит, соответствует ли ваш файл .wasm требованиям к размеру исходного пакета . Например, файл .wasm размером около 25 МБ будет сжат до около 7 МБ.

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

Шаблон 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. Выполните сборку для WebGL в окне Build Settings затем перейдите к шагу 7 или 5 в зависимости от потребностей вашего проекта.
  5. Выполняйте шаги 5 и 6 только при использовании сжатия : после сборки проекта перейдите в папку сборки и откройте Build . Найдите файлы .wasm или .data , которые необходимо сжать, чтобы уложиться в ограничения по размеру, и упакуйте их в zip-архив. Обязательно удалите исходные сжатые файлы .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, включите также и эти файлы.

Обновите предоставленные примеры для использования Universal Render Pipeline (URP)

Одним из последних нововведений новых версий Unity является использование Universal Render Pipeline (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 .

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

Пакеты ресурсов полезны, поскольку позволяют разделить проект и загружать элементы «на лету». Они полезны для DLC, пакетов уровней, новых персонажей и многого другого. Пакеты ресурсов отлично подходят для самостоятельной загрузки и объединения контента. Их можно использовать, добавляя ресурсы в определённые пакеты и загружая их по мере необходимости. Подробнее см. в документации по пакету ресурсов Unity .

См. полный справочник по API YT Playables .