借助此封装容器,您可以在 Unity C# 中访问 YouTube Playables SDK。封装容器包含一个 .jslib 插件和一个 C# 文件,可帮助您加快开发速度。此外,还有一个示例项目展示了如何在您的项目中使用这些功能。
您可以从我们的 Playables 示例代码库下载 Unity 软件包。
用法
- 验证您的 Unity 项目平台是否已设置为
WebGL
。此设置可在Build Settings
中找到。 - 您可以使用
WebGLTemplate
为 Web 构建游戏,也可以按照使用您自己的 index.html 文件部分中的说明操作,并验证您是否已在index.html
文件中设置并初始化 Web SDK。WebGLTemplate
可在软件包Google-WebGLTemplate-only.unitypackage
或GoogleYTGameWrapper-with-sample.unitypackage
中找到。如需设置和使用此模板,请按照 WebGL 模板部分中的步骤操作。- 如需使用您自己的 Web 和
index.html
文件,您需要在index.html
Unity 创建脚本中添加两行代码,请参阅使用您自己的 index.html 文件部分了解集成。
- 在 Unity 中打开您的项目,然后打开并将任一软件包导入到您的项目中。
GoogleYTGameWrapper.unitypackage
:包含用于连接 YouTube Playables SDK 的 JS 插件和一个 C# 封装容器,可帮助您将此插件连接到您的产品。GoogleYTGameWrapper-with-sample.unitypackage
:包含与 GoogleYTGameWrapper 软件包中相同的文件内容,以及一个演示如何在 C# 中使用 YouTube Playables SDK 的示例。
- 重要提示:在主场景中创建一个新的游戏对象,并将其命名为
YTGameWrapper
。此游戏对象用于与 JS 网桥通信。 - 重要提示:将导入的
YTGameWrapper.cs
代码作为脚本组件添加到YTGameWrapper
GameObject。 如果您的项目有多个场景,请务必将
DontDestroyOnLoad
添加到YTGameWrapper.cs
脚本中(注意:新版脚本具有DontDestroyOnSceneChange
切换开关,默认处于开启状态)。这样可确保脚本和 GameObject 在整个游戏过程中保持存在。GameObject.DontDestroyOnLoad(this.gameObject);
YTGameWrapper.cs
组件和YTGameWrapper
GameObject 用于连接到 YouTube Playables SDK。使用这些账号登录 YouTube。 使用脚本查找对象和组件,或者通过 Unity 编辑器手动将这些内容添加到游戏代码中。确认您是否遵循了项目的技术要求。
使用您自己的 index.html 文件
如果您不使用提供的 index.html
示例,则需要在 index.html
Unity 创建脚本中添加两行代码。
首先,在项目中设置 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 文件夹位置并打开
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 步中的 build 位置。如果已完成第 5 步和第 6 步,请一并添加这些文件。
升级提供的示例以使用通用渲染管线 (URP)
新版 Unity 的最新进展之一是它们使用通用渲染管线 (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 时强调的主要问题之一是,如何满足单个文件大小要求和总软件包大小要求。
延迟加载资源是您可以为项目进行的一项出色优化,因为您可以根据需要加载资源、关卡和数据。如果此操作正确完成,我们的认证团队可能会免除总体文件大小限制,因为您的完整游戏不会预先加载,而是在用户浏览您的产品时加载。
为了帮助您正确加载,Unity 提供了多种方法来拆分素材资源,以确保各个素材资源组的大小不超过限制,并确保您随时间加载内容。我们建议使用 Addressables 或 Asset Bundles。
Addressables
借助 Addressables,您可以识别应一起加载的不同文件,而 Unity 将为您处理大部分打包工作。Unity 还提供了一些工具来管理文件大小,并帮助确保您不会重复使用素材资源。
若要使用 Addressables,您需要在 Unity 中通过 Package Manager 导入 Addressables 软件包,然后将资源标记到 Addressable Groups 中。如需了解详情,请参阅 Unity 文档。
资源包
资源包非常有用,因为您可以拆分项目并动态加载元素。这些信息有助于您了解 DLC、关卡包、新角色等。 资源包非常适合用于自行管理的内容加载和打包。为此,您可以将资源标记到特定软件包中,然后根据需要加载软件包。如需了解更多详情,请参阅 Unity 的资源包文档。
请参阅完整的 YT Playables API 参考文档。