实验性 YouTube 游戏大本营 Unity 封装容器

借助此封装容器,您可以在 Unity C# 中访问 YouTube Playables SDK。封装容器包含一个 .jslib 插件和一个 C# 文件,可帮助您加快开发速度。此外,还有一个示例项目展示了如何在您的项目中使用这些功能。

您可以从我们的 Playables 示例代码库下载 Unity 软件包。

用法

  1. 验证您的 Unity 项目平台是否已设置为 WebGL。此设置可在 Build Settings 中找到。
  2. 您可以使用 WebGLTemplate 为 Web 构建游戏,也可以按照使用您自己的 index.html 文件部分中的说明操作,并验证您是否已在 index.html 文件中设置并初始化 Web SDK
    • WebGLTemplate 可在软件包 Google-WebGLTemplate-only.unitypackageGoogleYTGameWrapper-with-sample.unitypackage 中找到。如需设置和使用此模板,请按照 WebGL 模板部分中的步骤操作。
    • 如需使用您自己的 Web 和 index.html 文件,您需要在 index.html Unity 创建脚本中添加两行代码,请参阅使用您自己的 index.html 文件部分了解集成。
  3. 在 Unity 中打开您的项目,然后打开并将任一软件包导入到您的项目中。
    • GoogleYTGameWrapper.unitypackage:包含用于连接 YouTube Playables SDK 的 JS 插件和一个 C# 封装容器,可帮助您将此插件连接到您的产品。
    • GoogleYTGameWrapper-with-sample.unitypackage:包含与 GoogleYTGameWrapper 软件包中相同的文件内容,以及一个演示如何在 C# 中使用 YouTube Playables SDK 的示例。
  4. 重要提示:在主场景中创建一个新的游戏对象,并将其命名为 YTGameWrapper。此游戏对象用于与 JS 网桥通信。
  5. 重要提示:将导入的 YTGameWrapper.cs 代码作为脚本组件添加到 YTGameWrapper GameObject。
  6. 如果您的项目有多个场景,请务必将 DontDestroyOnLoad 添加到 YTGameWrapper.cs 脚本中(注意:新版脚本具有 DontDestroyOnSceneChange 切换开关,默认处于开启状态)。这样可确保脚本和 GameObject 在整个游戏过程中保持存在。

    GameObject.DontDestroyOnLoad(this.gameObject);
    
  7. YTGameWrapper.cs 组件和 YTGameWrapper GameObject 用于连接到 YouTube Playables SDK。使用这些账号登录 YouTube。 使用脚本查找对象和组件,或者通过 Unity 编辑器手动将这些内容添加到游戏代码中。

  8. 确认您是否遵循了项目的技术要求

使用您自己的 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 模板

  1. 按照上述 Unity 软件包说明进行初始设置。 请务必使用 Google-WebGLTemplate-only.unitypackageGoogleYTGameWrapper-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 文件夹位置并打开 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 步中的 build 位置。如果已完成第 5 步和第 6 步,请一并添加这些文件。

升级提供的示例以使用通用渲染管线 (URP)

新版 Unity 的最新进展之一是它们使用通用渲染管线 (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 时强调的主要问题之一是,如何满足单个文件大小要求和总软件包大小要求。

延迟加载资源是您可以为项目进行的一项出色优化,因为您可以根据需要加载资源、关卡和数据。如果此操作正确完成,我们的认证团队可能会免除总体文件大小限制,因为您的完整游戏不会预先加载,而是在用户浏览您的产品时加载。

为了帮助您正确加载,Unity 提供了多种方法来拆分素材资源,以确保各个素材资源组的大小不超过限制,并确保您随时间加载内容。我们建议使用 Addressables 或 Asset Bundles。

Addressables

借助 Addressables,您可以识别应一起加载的不同文件,而 Unity 将为您处理大部分打包工作。Unity 还提供了一些工具来管理文件大小,并帮助确保您不会重复使用素材资源。

若要使用 Addressables,您需要在 Unity 中通过 Package Manager 导入 Addressables 软件包,然后将资源标记到 Addressable Groups 中。如需了解详情,请参阅 Unity 文档

资源包

资源包非常有用,因为您可以拆分项目并动态加载元素。这些信息有助于您了解 DLC、关卡包、新角色等。 资源包非常适合用于自行管理的内容加载和打包。为此,您可以将资源标记到特定软件包中,然后根据需要加载软件包。如需了解更多详情,请参阅 Unity 的资源包文档

请参阅完整的 YT Playables API 参考文档