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

このラッパーを使用すると、YouTube ゲームルーム 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 テンプレート セクションの手順に沿って操作します。
    • 独自のウェブファイルと index.html ファイルを使用するには、index.html Unity 作成スクリプトに 2 行を追加する必要があります。統合については、独自の index.html ファイルを使用する セクションをご覧ください。
  3. Unity でプロジェクトを開き、いずれかのパッケージを開いてプロジェクトにインポートします。
    • GoogleYTGameWrapper.unitypackage: YouTube ゲームルーム SDK に接続するための JS プラグインと、これをプロダクトに接続するための C# ラッパーが含まれています。
    • GoogleYTGameWrapper-with-sample.unitypackage: GoogleYTGameWrapper パッケージに含まれるファイルと同じファイルと、C# で YouTube ゲームルーム 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 ゲームルーム 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 ゲームルーム 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.
    }
}

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
        }
    });
}

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

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

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

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 が [Disabled] に設定されていることを確認します。この設定は、Project settings -> Player -> WebGL タブ -> Publishing Settings セクションにあります。
  4. Build Settings[Build Settings] ウィンドウで WebGL 用にビルドし、プロジェクトのニーズに応じてステップ 7 または 5 に進みます。
  5. 圧縮を使用している場合は、ステップ 5 と 6 のみを行ってください: プロジェクトがビルドされたら、ビルド フォルダの場所に移動して Build フォルダを開きます。 個々のファイルサイズの制限内に収まるように圧縮する必要があるプロジェクトの .wasm ファイルまたは .data ファイルを見つけて、これらの ファイルを圧縮します。*.wasm.zip ファイルと *.data.zip ファイルを送信するため、圧縮された元の .wasm ファイルと .data ファイルは削除してください。
    • 注: Mac を使用している場合は、ファイルを右クリックして [Compress *] を選択します。PC では、ファイルを右クリックして [Compress to ZIP file] を選択します。
  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 つは、Universal Render Pipeline(URP)を使用することです。すべてが正しくレンダリングされるようにサンプルをアップグレードするには、次の操作を行います。

  1. まず、GoogleYTGameWrapper-with-sample.unitypackage パッケージを新しいプロジェクトまたは既存のプロジェクトにインポートします。
  2. [Render Pipeline Converter] ウィンドウに移動します: Window -> Rendering -> Render Pipeline ConverterRender Pipeline Converter
  3. Rendering SettingsMaterial UpgradeReadonly Material Converter を選択します。
  4. 次に Initialize and Convert を選択します。完了するまで待つと、サンプル は URP の準備が整います。

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

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

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

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

Addressables

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

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

アセットバンドル

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

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