Experimenteller YouTube Playables Unity-Wrapper

Mit diesem Wrapper können Sie in Unity C# auf das YouTube Playables SDK zugreifen. Der Wrapper enthält ein .jslib-Plug-in und eine C#-Datei, um die Entwicklung zu beschleunigen. Es gibt auch ein Beispielprojekt, das zeigt, wie Sie diese in Ihrem Projekt verwenden können.

Unity-Pakete können aus unserem Playables-Beispiel-Repository heruntergeladen werden.

Nutzung

  1. Prüfen Sie, ob die Plattform Ihres Unity-Projekts auf WebGL festgelegt ist. Diese Einstellung finden Sie unter Build Settings.
  2. Entweder Sie verwenden WebGLTemplate, um Ihr Spiel für das Web zu erstellen, oder Sie folgen dem Abschnitt Eigene index.html-Datei verwenden und prüfen, ob Sie das Web-SDK in Ihrer index.html-Datei eingerichtet und initialisiert haben.
    • WebGLTemplate befindet sich im Paket Google-WebGLTemplate-only.unitypackage oder GoogleYTGameWrapper-with-sample.unitypackage. Folgen Sie den Schritten im Abschnitt WebGL-Vorlage, um diese Vorlage einzurichten und zu verwenden.
    • Wenn Sie Ihre eigene Web- und index.html-Datei verwenden möchten, müssen Sie Ihrem index.html-Unity-Erstellungsskript zwei Zeilen hinzufügen. Weitere Informationen zur Integration finden Sie im Abschnitt Eigene index.html-Datei verwenden.
  3. Öffnen Sie Ihr Projekt in Unity und importieren Sie dann eines der beiden Pakete in Ihr Projekt.
    • GoogleYTGameWrapper.unitypackage: Enthält das JS-Plug-in zum Verbinden des YouTube Playables SDK und einen C#-Wrapper, um die Verbindung zu Ihrem Produkt zu erleichtern.
    • GoogleYTGameWrapper-with-sample.unitypackage: Enthält dieselben Dateien wie das GoogleYTGameWrapper-Paket und ein Beispiel für die Verwendung des YouTube Playables SDK in C#.
  4. WICHTIG:Erstelle in deiner Hauptszene ein neues GameObject und gib ihm den Namen YTGameWrapper. Dieses Spielobjekt wird für die Kommunikation mit der JS-Bridge verwendet.
  5. WICHTIG:Fügen Sie den importierten YTGameWrapper.cs-Code als Skriptkomponente zum YTGameWrapper-GameObject hinzu.
  6. Wenn Ihr Projekt mehrere Szenen hat, fügen Sie DontDestroyOnLoad in das YTGameWrapper.cs-Script ein. Hinweis: In neuen Versionen des Scripts ist die DontDestroyOnSceneChange-Schaltfläche standardmäßig aktiviert. So wird sichergestellt, dass das Skript und das GameObject während des gesamten Spiels erhalten bleiben.

    GameObject.DontDestroyOnLoad(this.gameObject);
    
  7. Die Komponente YTGameWrapper.cs und das GameObject YTGameWrapper werden verwendet, um eine Verbindung zum YouTube Playables SDK herzustellen. Damit können Sie eine Verbindung zu YouTube herstellen. Entweder Sie verwenden ein Skript, um das Objekt und die Komponente zu finden, oder Sie fügen sie manuell über den Unity-Editor in Ihren Spielcode ein.

  8. Prüfen Sie, ob Sie die technischen Anforderungen für Ihr Projekt erfüllen.

Eigene index.html-Datei verwenden

Wenn Sie das bereitgestellte index.html-Beispiel nicht verwenden, müssen Sie Ihrem index.html-Unity-Erstellungsskript zwei Codezeilen hinzufügen.

Fügen Sie diese Zeile zuerst an derselben Stelle ein, an der in Ihrem Projekt Variablen für den Unity-Container, das Canvas usw. eingerichtet werden.

    var container = document.querySelector("#unity-container");
    var canvas = document.querySelector("#unity-canvas");

    var unityGameInstance = null; // <-- Add this line >

    ...

Fügen Sie als Nächstes diese Zeile in die Funktion createUnityInstance ein.

    createUnityInstance(canvas, config, (progress) => {
        progressBarFull.style.width = 100 * progress + "%";
    }).then((unityInstance) => {

        unityGameInstance = unityInstance; // <-- Add this line >

    ...

Beispiele

Dieser Abschnitt enthält einige Beispiele für die Verwendung des C#-Wrappers. Es handelt sich dabei nicht um die vollständige Liste der verfügbaren APIs. Eine vollständige Liste der verfügbaren APIs finden Sie im YouTube Playables SDK.

sendScore

In diesem Beispiel wird die Implementierung von sendScore(int points) in C# gezeigt:

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

Hier sehen Sie ein Beispiel dafür, wie ein Spiel auf Pause-Ereignisse von YT Playables reagieren kann, um die Engine bei Bedarf zu pausieren:

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

Hier ist ein Beispiel für die Verwendung von saveData, das an das YT Playables SDK gesendet wird:

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

Hier ist ein Beispiel für die Verwendung von loadData, das an das YT Playables SDK gesendet wird:

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

Dies ist ein Beispiel für die Verwendung von requestInterstitialAd. Es wird angegeben, dass es ein guter Zeitpunkt ist, eine Interstitial-Anzeige einzublenden, sofern verfügbar. Die besten Ergebnisse erzielst du, wenn du diesen Aufruf während einer Spielpause ausführst, z. B. am Ende eines Levels.

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

Beispiel-WebGL-Vorlage von YouTube verwenden

Sofern Sie kein sehr umfangreiches Unity-Projekt haben, sollten die erstellten Dateien .wasm und .data unter dem Dateigrößenlimit liegen. In diesem Fall sollten Sie diese Dateien nicht zusätzlich komprimieren, da sie beim Einreichen Ihrer Playable-Dateien automatisch komprimiert werden. Durch diese automatische Komprimierung wird auch geprüft, ob Ihre .wasm-Datei die Anforderung an die anfängliche Bundle-Größe erfüllt. Eine .wasm-Datei mit einer Größe von etwa 25 MiB wird beispielsweise auf etwa 7 MiB komprimiert.

Wenn Ihre Dateien aus irgendeinem Grund die maximale Dateigröße überschreiten, sollten Sie sie mit ZIP komprimieren, um sicherzugehen, dass sie innerhalb dieses Limits liegen. Bei der komprimierten Wiedergabe werden diese Dateien nicht neu komprimiert.

WebGL-Vorlage

  1. Folgen Sie der Anleitung für das Unity-Paket oben für die Ersteinrichtung. Verwenden Sie Google-WebGLTemplate-only.unitypackage oder GoogleYTGameWrapper-with-sample.unitypackage und importieren Sie alle Dateien im Ordner WebGLTemplates/YTGameWrapperTemplate/.
    • Hinweis: Wenn Sie YTGameWrapper.cs und UnityYTGameSDKLib.jslib noch nicht importiert haben, sollten Sie das jetzt nachholen.
  2. Legen Sie fest, dass Ihre WebGL-Vorlage YTGameWrapperTemplate verwenden soll. Diese Einstellung befindet sich unter Edit -> Project settings -> Player -> Tab WebGL -> Bereich Resolution and Presentation.
    • Hinweis: Die Standardbreite und ‑höhe des Canvas sind in der Vorlage auf 100% festgelegt. Diese Unity-Einstellungen haben also keine Auswirkungen.
  3. Achte darauf, dass Compression Format auf „Deaktiviert“ eingestellt ist. Diese Einstellung befindet sich unter Project settings -> Player -> Tab WebGL -> Bereich Publishing Settings.
  4. Erstellen Sie WebGL im Fenster Build Settings und fahren Sie dann je nach den Anforderungen Ihres Projekts mit Schritt 7 oder 5 fort.
  5. Führen Sie nur die Schritte 5 und 6 aus, wenn die Komprimierung verwendet wird: Nachdem Ihr Projekt erstellt wurde, rufen Sie den Speicherort des Build-Ordners auf und öffnen Sie den Ordner Build. Suchen Sie die .wasm- oder .data-Dateien Ihrer Projekte, die komprimiert werden müssen, um die jeweiligen Dateigrößenlimits einzuhalten, und zippen Sie diese Dateien. Löschen Sie die Originaldateien .wasm/.data, die komprimiert wurden, da Sie stattdessen die Dateien *.wasm.zip und *.data.zip einreichen.
    • Hinweis: Wenn Sie einen Mac verwenden, können Sie mit der rechten Maustaste auf die Datei klicken und „* komprimieren“ auswählen. Auf einem PC können Sie mit der rechten Maustaste auf die Datei klicken und „In ZIP-Datei komprimieren“ auswählen.
  6. Nur ausführen, wenn Sie Schritt 5 ausgeführt haben: Aktualisieren Sie die index.html-Datei, die aus YTGameWrapperTemplate erstellt wurde, um gezippte Dateien zu laden und zu dekomprimieren.
    • Suchen Sie in den index.html-Dateien am Ende nach Path 1 und kommentieren Sie die folgende Zeile aus: InitUnitySection();.
    • Suchen Sie in den index.html-Dateien am Ende nach Path 2 und kommentieren Sie die folgende Zeile aus: loadResources(InitUnitySection);.
  7. Wenn Sie Ihr Projekt zur Zertifizierung einreichen, müssen Sie alle Dateien, die in Unity erstellt wurden, an den Build-Speicherort aus Schritt 4 senden. Wenn die Schritte 5 und 6 ausgeführt wurden, fügen Sie diese Dateien ebenfalls hinzu.

Stellen Sie die bereitgestellten Beispiele auf die Universal Render Pipeline (URP) um.

Einer der neuesten Fortschritte bei neueren Versionen von Unity ist die Verwendung der Universal Render Pipeline (URP). Um das Beispiel zu aktualisieren, damit alles korrekt gerendert wird.

  1. Importieren Sie zuerst das GoogleYTGameWrapper-with-sample.unitypackage-Paket in ein neues oder vorhandenes Projekt.
  2. Rufen Sie das Fenster Render Pipeline Converter auf: Window -> Rendering -> Render Pipeline Converter.
  3. Wählen Sie Rendering Settings, Material Upgrade und Readonly Material Converter aus.
  4. Wählen Sie dann Initialize and Convert aus. Warten Sie, bis der Vorgang abgeschlossen ist. Das Sample sollte dann für URP bereit sein.

Assets in Ihrem Unity-Projekt aufteilen (Lazy Loading)

Eines der Hauptprobleme, die Entwickler bei der Verwendung von Unity angesprochen haben, ist die Einhaltung der Anforderungen an die Dateigröße und die Bundle-Größe.

Das verzögerte Laden von Assets ist eine hervorragende Optimierung für Ihr Projekt, da Sie Assets, Ebenen und Daten nach Bedarf laden können. Unser Zertifizierungsteam kann die Beschränkungen für die Gesamtdateigröße aufheben, wenn dies ordnungsgemäß erfolgt, da Ihr vollständiges Spiel nicht im Voraus geladen wird, sondern erst, wenn ein Nutzer Ihr Produkt verwendet.

Damit das Laden reibungslos funktioniert, bietet Unity verschiedene Möglichkeiten, Ihre Assets aufzuteilen. So können Sie dafür sorgen, dass Ihre einzelnen Asset-Gruppen die Größenbeschränkungen einhalten und Inhalte im Laufe der Zeit geladen werden. Wir empfehlen, entweder Addressables oder Asset Bundles zu verwenden.

Addressables

Mit Addressables können Sie verschiedene Dateien identifizieren, die zusammen geladen werden sollen. Unity übernimmt den Großteil der Paketierung für Sie. Unity bietet auch einige Tools zum Verwalten von Dateigrößen und zum Vermeiden von doppelten Assets.

Wenn Sie Addressables verwenden möchten, müssen Sie das Addressables-Paket über den Paket-Manager in Unity importieren und Ihre Assets dann mit Addressable Groups taggen. Weitere Informationen finden Sie in der Unity-Dokumentation.

Asset-Bundles

Asset-Bundles sind hilfreich, da Sie Ihr Projekt aufteilen und Elemente spontan laden können. Sie sind hilfreich für DLCs, Levelpakete, neue Charaktere und mehr. Asset-Bundles eignen sich hervorragend für das selbstverwaltete Laden und Bündeln von Inhalten. Sie können sie verwenden, indem Sie Ihre Assets mit bestimmten Bundles taggen und dann Bundles nach Bedarf laden. Weitere Informationen finden Sie in der Dokumentation zu Asset Bundles von Unity.

Vollständige YT Playables API-Referenz