このラッパーを使用すると、Unity C# で YouTube Playables SDK にアクセスできます。ラッパーには、開発を高速化するための .jslib プラグインと C# ファイルが含まれています。プロジェクトでこれらを使用する方法を示すサンプル プロジェクトもあります。
Unity パッケージは、ゲームルームのサンプル リポジトリからダウンロードできます。
用途
- Unity プロジェクトのプラットフォームが
WebGL
に設定されていることを確認します。この設定はBuild Settings
にあります。 WebGLTemplate
を使用してウェブ向けにゲームをビルドするか、独自の index.html ファイルを使用するセクションに沿って、index.html
ファイルで ウェブ SDK を設定して初期化していることを確認します。WebGLTemplate
は、パッケージGoogle-WebGLTemplate-only.unitypackage
またはGoogleYTGameWrapper-with-sample.unitypackage
にあります。このテンプレートを設定して使用するには、WebGL テンプレート セクションの手順に沿って操作します。- 独自のウェブファイルと
index.html
ファイルを使用するには、index.html
Unity 作成スクリプトに 2 行を追加する必要があります。統合については、独自の index.html ファイルを使用するセクションをご覧ください。
- Unity でプロジェクトを開き、いずれかのパッケージを開いてプロジェクトにインポートします。
GoogleYTGameWrapper.unitypackage
: YouTube ゲームルーム SDK と C# ラッパーを接続するための JS プラグインが含まれています。このラッパーは、この SDK をプロダクトに接続するのに役立ちます。GoogleYTGameWrapper-with-sample.unitypackage
: GoogleYTGameWrapper パッケージに含まれているファイルと同じ内容のファイルと、C# で YouTube Playables SDK を使用する方法を示すサンプルが含まれています。
- 重要: メインシーンで新しいゲーム オブジェクトを作成し、
YTGameWrapper
という名前を付けます。このゲーム オブジェクトは、JS ブリッジとの通信に使用されます。 - 重要: インポートした
YTGameWrapper.cs
コードをスクリプト コンポーネントとしてYTGameWrapper
GameObject に追加します。 プロジェクトに複数のシーンがある場合は、
YTGameWrapper.cs
スクリプトにDontDestroyOnLoad
を追加してください(注: スクリプトの新しいバージョンにはDontDestroyOnSceneChange
切り替えがあり、デフォルトでオンになっています)。これにより、スクリプトと GameObject がゲーム全体で維持されます。GameObject.DontDestroyOnLoad(this.gameObject);
YTGameWrapper.cs
コンポーネントとYTGameWrapper
GameObject は、YouTube Playables SDK に接続するために使用されます。これらを使用して YouTube に接続します。 スクリプトを使用してオブジェクトとコンポーネントを見つけるか、Unity エディタを使用してゲームコードに手動で追加します。プロジェクトの技術要件を満たしていることを確認します。
独自の 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 テンプレート
- 初期設定については、上記の Unity パッケージの手順に沿って操作します。
Google-WebGLTemplate-only.unitypackage
またはGoogleYTGameWrapper-with-sample.unitypackage
を使用して、WebGLTemplates/YTGameWrapperTemplate/
フォルダ内のすべてのファイルをインポートしてください。- 注:
YTGameWrapper.cs
とUnityYTGameSDKLib.jslib
をまだインポートしていない場合は、それらもインポートする必要があります。
- 注:
- WebGL テンプレートを
YTGameWrapperTemplate
を使用するように設定します。この設定は、[Edit
] -> [Project settings
] -> [Player
] -> [WebGL
] タブ -> [Resolution and Presentation
] セクションにあります。- 注: デフォルトのキャンバスの幅と高さはテンプレートで 100% に設定されているため、これらの Unity 設定では何も調整されません。
Compression Format
が [無効] に設定されていることを確認します。この設定は、[Project settings
] -> [Player
] -> [WebGL
] タブ -> [Publishing Settings
] セクションにあります。Build Settings
ウィンドウでWebGL
をビルドし、プロジェクトのニーズに応じてステップ 7 または 5 に進みます。- 圧縮を使用する場合のみ手順 5 と 6 を実行します: プロジェクトをビルドしたら、ビルド フォルダの場所に移動して
Build
フォルダを開きます。個々のファイルサイズの制限内に収まるように圧縮する必要があるプロジェクトの.wasm
ファイルまたは.data
ファイルを見つけて、これらのファイルを zip 圧縮します。圧縮された元の.wasm
/.data
ファイルは必ず削除してください。代わりに*.wasm.zip
ファイルと*.data.zip
ファイルを送信します。- 注: Mac を使用している場合は、ファイルを右クリックして [圧縮] を選択します。PC を使用している場合は、ファイルを右クリックして [ZIP ファイルに圧縮] を選択します。
- ステップ 5 を実行した場合のみ:
YTGameWrapperTemplate
からビルドされたindex.html
ファイルを更新して、圧縮されたファイルを読み込み、解凍します。index.html
ファイルの末尾付近にPath 1
があります。次の行InitUnitySection();
をコメントアウトします。index.html
ファイルの末尾付近にPath 2
があります。次の行loadResources(InitUnitySection);
をコメントアウトします。
- 認証のためにプロジェクトを送信する際は、Unity でビルドされたすべてのファイルをステップ 4 のビルド場所に送信する必要があります。手順 5 と 6 を実施した場合は、これらのファイルも追加します。
提供されているサンプルを Universal Render Pipeline(URP)を使用するようにアップグレード
Unity の新しいバージョンにおける最新の進歩の 1 つは、ユニバーサル レンダリング パイプライン(URP)を使用していることです。サンプルをアップグレードして、すべてが正しくレンダリングされるようにします。
- まず、
GoogleYTGameWrapper-with-sample.unitypackage
パッケージを新規または既存のプロジェクトにインポートします。 Render Pipeline Converter
ウィンドウに移動します(Window
->Rendering
->Render Pipeline Converter
)。Rendering Settings
、Material Upgrade
、Readonly Material Converter
を選択します。- 次に
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 リファレンスの全文をご覧ください。