With this wrapper you can access the YouTube Playables SDK in Unity C#. The wrapper has a .jslib plug-in and a C# file to help speed up your development. There is also a sample project that shows how you can use these in your project.
Unity Packages can be downloaded from our Playables sample repo.
Usage
- Verify your Unity project Platform is set to
WebGL
. This setting can is found inBuild Settings
. - Either use the
WebGLTemplate
to build your game for web, or follow the Use your own index.html file section and verify you have setup and initialize the web SDK in yourindex.html
file.WebGLTemplate
can be found in the packageGoogle-WebGLTemplate-only.unitypackage
orGoogleYTGameWrapper-with-sample.unitypackage
. To set and use this template up follow the steps in the WebGL Template section.- To use your own Web and
index.html
file, you will need to add two lines to yourindex.html
Unity creation script, see Use your own index.html file section for integration.
- Open your project in Unity, then open and import either package into your
project.
GoogleYTGameWrapper.unitypackage
: Contains JS Plugin for connecting the YouTube Playables SDK and a C# wrapper to help connect this to your product.GoogleYTGameWrapper-with-sample.unitypackage
: Contains the same files content as those found in GoogleYTGameWrapper package and a sample showing how to use YouTube Playables SDK in C#.
- IMPORTANT: In your main scene create a new gameobject and name it
YTGameWrapper
. This game object is used to communicate with the JS bridge. - IMPORTANT: Add the imported
YTGameWrapper.cs
code as a script component to theYTGameWrapper
GameObject. If your project has multiple scenes make sure to add
DontDestroyOnLoad
to theYTGameWrapper.cs
script (note: new versions of the script have aDontDestroyOnSceneChange
toggle which is on by default). This will make sure the script and GameObject sticks around throughout your game.GameObject.DontDestroyOnLoad(this.gameObject);
The
YTGameWrapper.cs
component andYTGameWrapper
GameObject are used to connect to the YouTube Playables SDK. Use these to connect to YouTube. Either using Script to find the object and component or manually add these to your game code through the Unity Editor.Verify you are following technical requirements for your project.
Use your own index.html file
If you don't use the index.html
example provided you will need to add two
lines of code to your index.html
Unity creation script.
First, add this line in the same place your project sets up variables for the Unity container, canvas, etc.
var container = document.querySelector("#unity-container");
var canvas = document.querySelector("#unity-canvas");
var unityGameInstance = null; // <-- Add this line >
...
Second, inside the createUnityInstance
function add this line.
createUnityInstance(canvas, config, (progress) => {
progressBarFull.style.width = 100 * progress + "%";
}).then((unityInstance) => {
unityGameInstance = unityInstance; // <-- Add this line >
...
Examples
This section has some examples of how to use the C# wrapper, it is not the full list of available APIs. For the full list of available APIs, refer to the YouTube Playables SDK.
sendScore
This example shows an implementation of sendScore(int points)
in 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
This is an example of how a game can listen to Pause
events coming from YT
Playables, to pause its engine when needed:
...
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
This is an example of how to use saveData
, sending it to 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
This is an example of how to use loadData
, sending it to 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
This is an example of how to use requestInterstitialAd
, indicating it is a
good time to show an interstitial Ad, if available. For the best results, make
this call during a break in gameplay, for example, at the end of a level.
...
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.
}
}
How to use YouTube's example WebGL Template
Unless you have a very heavy Unity project your built .wasm
and .data
files
should be under our individual file size limit. If
this is the case no extra compression should be done on your end for these files
as they will be automatically compressed on submission of your Playable files.
This automatic compression will also verify that your .wasm file fits into the
initial bundle size requirement. As an example, a ~25
MiB .wasm
file will compress to ~7 MiB.
If for some reason your files are over the maximum individual file size limit, it is best to use ZIP compression to verify they fit into this limit. Playable compression won't re-compress these files.
WebGL Template
- Follow the Unity package instructions above for initial setup.
Make sure to use
Google-WebGLTemplate-only.unitypackage
orGoogleYTGameWrapper-with-sample.unitypackage
and import all files underWebGLTemplates/YTGameWrapperTemplate/
folder.- Note: if you have not already imported
YTGameWrapper.cs
andUnityYTGameSDKLib.jslib
you should import those as well.
- Note: if you have not already imported
- Set your WebGL Template to use
YTGameWrapperTemplate
. This setting is inEdit
->Project settings
->Player
->WebGL
tab ->Resolution and Presentation
section.- Note: Default Canvas Width and Height are set to 100% in the template so these Unity settings won't adjust anything.
- Make sure your
Compression Format
is set to Disabled. This setting is inProject settings
->Player
->WebGL
tab ->Publishing Settings
section. - Build for
WebGL
in theBuild Settings
window then go to step 7 or 5 based on your projects needs. - Only follow steps 5 & 6 if compression is used: After your project is
built navigate to your build folder location and open the
Build
folder. Find your projects.wasm
or.data
files that need compression to fit into the individual file size limits and zip these files. Make sure to delete the original.wasm
/.data
files that were compressed as you will be submitting the*.wasm.zip
and*.data.zip
files instead.- Note: if you are using a Mac you can right-click the file and select "Compress *". On PC you can right-click the file and select "Compress to ZIP file".
- Only follow if you did step 5: Update the
index.html
file built fromYTGameWrapperTemplate
to load zipped files and decompress them.- Near the end of the
index.html
files you will findPath 1
and comment out the following lineInitUnitySection();
. - Near the end of the
index.html
files you will findPath 2
and comment out the following lineloadResources(InitUnitySection);
.
- Near the end of the
- When submitting your project for Certification you will need to send all files built from Unity to your build location from Step 4. If steps 5 + 6 were followed, include these files as well.
Upgrade the provided samples to use Universal Render Pipeline (URP)
One of the latest advancements with newer versions of Unity is that they use Universal Render Pipeline (URP). To upgrade the sample so everything renders correctly.
- Start by importing the
GoogleYTGameWrapper-with-sample.unitypackage
package into a new or existing project. - Navigate to the
Render Pipeline Converter
window:Window
->Rendering
->Render Pipeline Converter
. - Select
Rendering Settings
,Material Upgrade
, andReadonly Material Converter
. - Next select
Initialize and Convert
, wait for this to finish and the sample should be ready for URP.
How to break up assets in your Unity project (Lazy Loading)
One of the main problems developers have highlighted when using Unity is staying under the individual file size requirements and the total bundle size requirements.
Lazy loading of assets is a great optimization you can make for your project as you can load assets, levels, and data as they are needed. Our certification team may waive the overall file size restrictions if this is properly done, as your full game won't be loaded up front, but as a user navigates your product.
To help with proper loading, Unity has a number of ways to split up your assets verifying that your individual asset groups are under the size limits and that you load content over time. We suggest using either Addressables or Asset Bundles.
Addressables
Addressables allow you to identify different files that should be loaded together and Unity will handle most of the packaging for you. Unity also provides some tools to manage file sizes and help make sure you are not duplicating assets.
To use Addressables you will need to import the Addressables package through the Package Manager in Unity then tag your assets into Addressable Groups. More details can be found through Unity documentation.
Asset Bundles
Asset Bundles are helpful as you can split up your project and load elements on the fly. These are helpful for DLC, levels packs, new characters, and more. Asset Bundles are great for self managed content loading and bundling. These can be used by tagging your assets into specific bundles, then loading bundles as you need them. More details can be found in Unity's Asset Bundle documentation.
See the full YT Playables API reference.