試験運用版の YouTube ゲームルームの Unity ラッパー

このラッパーを使用すると、Unity C# で YouTube Playables SDK にアクセスできます。ラッパーには、開発を高速化するための .jslib プラグインと C# ファイルが含まれています。プロジェクトでこれらを使用する方法を示すサンプル プロジェクトもあります。

Unity パッケージは、ゲームルームのサンプル リポジトリからダウンロードできます。

用途

  1. Unity プロジェクトのプラットフォームが WebGL に設定されていることを確認します。この設定は Build Settings にあります。
  2. WebGLTemplate を使用してウェブ向けにゲームをビルドするか、独自の index.html ファイルを使用するセクションに沿って、index.html ファイルで ウェブ SDK を設定して初期化していることを確認します。
    • WebGLTemplate は、パッケージ Google-WebGLTemplate-only.unitypackage または GoogleYTGameWrapper-with-sample.unitypackage にあります。このテンプレートを設定して使用するには、WebGL テンプレート セクションの手順に沿って操作します。
    • 独自のウェブファイルと index.html ファイルを使用するには、index.html Unity 作成スクリプトに 2 行を追加する必要があります。統合については、独自の index.html ファイルを使用するセクションをご覧ください。
  3. Unity でプロジェクトを開き、いずれかのパッケージを開いてプロジェクトにインポートします。
    • GoogleYTGameWrapper.unitypackage: YouTube ゲームルーム SDK と C# ラッパーを接続するための JS プラグインが含まれています。このラッパーは、この SDK をプロダクトに接続するのに役立ちます。
    • GoogleYTGameWrapper-with-sample.unitypackage: GoogleYTGameWrapper パッケージに含まれているファイルと同じ内容のファイルと、C# で YouTube Playables SDK を使用する方法を示すサンプルが含まれています。
  4. 重要: メインシーンで新しいゲーム オブジェクトを作成し、YTGameWrapper という名前を付けます。このゲーム オブジェクトは、JS ブリッジとの通信に使用されます。
  5. 重要: インポートした YTGameWrapper.cs コードをスクリプト コンポーネントとして YTGameWrapper GameObject に追加します。
  6. プロジェクトに複数のシーンがある場合は、YTGameWrapper.cs スクリプトに DontDestroyOnLoad を追加してください(注: スクリプトの新しいバージョンには DontDestroyOnSceneChange 切り替えがあり、デフォルトでオンになっています)。これにより、スクリプトと GameObject がゲーム全体で維持されます。

    GameObject.DontDestroyOnLoad(this.gameObject);
    
  7. YTGameWrapper.cs コンポーネントと YTGameWrapper GameObject は、YouTube Playables SDK に接続するために使用されます。これらを使用して YouTube に接続します。 スクリプトを使用してオブジェクトとコンポーネントを見つけるか、Unity エディタを使用してゲームコードに手動で追加します。

  8. プロジェクトの技術要件を満たしていることを確認します。

独自の index.html ファイルを使用する

提供されている index.html の例を使用しない場合は、index.html Unity 作成スクリプトに 2 行のコードを追加する必要があります。

まず、プロジェクトで 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

この例は、C# での sendScore(int points) の実装を示しています。

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

これは、ゲームが YT Playables からの Pause イベントをリッスンし、必要に応じてエンジンを一時停止する方法の例です。

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

YouTube の WebGL テンプレートの例を使用する方法

非常に重い Unity プロジェクトでない限り、ビルドされた .wasm ファイルと .data ファイルは、個々のファイルサイズの上限を下回るはずです。この場合、プレイアブル ファイルの送信時に自動的に圧縮されるため、これらのファイルに対して追加の圧縮を行う必要はありません。この自動圧縮では、.wasm ファイルが初期バンドル サイズの要件を満たしていることも確認されます。たとえば、約 25 MiB の .wasm ファイルは、約 7 MiB に圧縮されます。

何らかの理由でファイルが個々のファイルサイズの最大上限を超えている場合は、ZIP 圧縮を使用して、上限内に収まることを確認することをおすすめします。再生可能な圧縮では、これらのファイルは再圧縮されません。

WebGL テンプレート

  1. 初期設定については、上記の Unity パッケージの手順に沿って操作します。Google-WebGLTemplate-only.unitypackage または GoogleYTGameWrapper-with-sample.unitypackage を使用して、WebGLTemplates/YTGameWrapperTemplate/ フォルダ内のすべてのファイルをインポートしてください。
    • 注: YTGameWrapper.csUnityYTGameSDKLib.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 ファイルを見つけて、これらのファイルを zip 圧縮します。圧縮された元の .wasm/.data ファイルは必ず削除してください。代わりに *.wasm.zip ファイルと *.data.zip ファイルを送信します。
    • 注: Mac を使用している場合は、ファイルを右クリックして [圧縮] を選択します。PC を使用している場合は、ファイルを右クリックして [ZIP ファイルに圧縮] を選択します。
  6. ステップ 5 を実行した場合のみ: YTGameWrapperTemplate からビルドされた index.html ファイルを更新して、圧縮されたファイルを読み込み、解凍します。
    • index.html ファイルの末尾付近に Path 1 があります。次の行 InitUnitySection(); をコメントアウトします。
    • index.html ファイルの末尾付近に Path 2 があります。次の行 loadResources(InitUnitySection); をコメントアウトします。
  7. 認証のためにプロジェクトを送信する際は、Unity でビルドされたすべてのファイルをステップ 4 のビルド場所に送信する必要があります。手順 5 と 6 を実施した場合は、これらのファイルも追加します。

提供されているサンプルを Universal Render Pipeline(URP)を使用するようにアップグレード

Unity の新しいバージョンにおける最新の進歩の 1 つは、ユニバーサル レンダリング パイプライン(URP)を使用していることです。サンプルをアップグレードして、すべてが正しくレンダリングされるようにします。

  1. まず、GoogleYTGameWrapper-with-sample.unitypackage パッケージを新規または既存のプロジェクトにインポートします。
  2. Render Pipeline Converter ウィンドウに移動します(Window -> Rendering -> Render Pipeline Converter)。
  3. Rendering SettingsMaterial UpgradeReadonly Material Converter を選択します。
  4. 次に Initialize and Convert を選択し、完了するまで待ちます。これで、サンプルは URP で使用できるようになります。

Unity プロジェクトでアセットを分割する方法(遅延読み込み)

Unity を使用する際にデベロッパーが指摘する主な問題の 1 つは、個々のファイルサイズの要件と合計バンドルサイズの要件を満たすことです。

アセットの遅延読み込みは、アセット、レベル、データを必要なときに読み込めるため、プロジェクトに最適な最適化です。この処理が適切に行われている場合、ゲーム全体が最初に読み込まれるのではなく、ユーザーがプロダクトを操作するにつれて読み込まれるため、認証チームはファイル サイズの全体的な制限を免除する可能性があります。

適切な読み込みを支援するため、Unity にはアセットを分割するさまざまな方法が用意されています。個々のアセット グループがサイズ制限内にあること、コンテンツを時間経過とともに読み込むことを確認できます。Addressables またはアセット バンドルのいずれかを使用することをおすすめします。

Addressables

Addressables を使用すると、一緒に読み込む必要があるさまざまなファイルを識別できます。Unity がパッケージングのほとんどを処理します。Unity には、ファイルサイズを管理し、アセットの重複を防ぐためのツールも用意されています。

Addressables を使用するには、Unity の Package Manager を通じて Addressables パッケージをインポートし、アセットを Addressable Groups にタグ付けする必要があります。詳しくは、Unity のドキュメントをご覧ください。

アセットバンドル

アセット バンドルは、プロジェクトを分割して要素をその場で読み込むことができるため便利です。DLC、レベルパック、新しいキャラクターなどに役立ちます。アセット バンドルは、コンテンツの読み込みとバンドルを自己管理するのに最適です。アセットを特定のバンドルにタグ付けし、必要に応じてバンドルを読み込むことで、これらを使用できます。詳しくは、Unity のアセット バンドルに関するドキュメントをご覧ください。

YT Playables API リファレンスの全文をご覧ください。