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

借助此封装容器,您可以在 Unity C# 中访问 YouTube 游戏大本营 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 游戏大本营 SDK 的 JS 插件,以及有助于将此插件连接到您的产品的 C# 封装容器。
    • GoogleYTGameWrapper-with-sample.unitypackage:包含与 GoogleYTGameWrapper 软件包中相同的文件内容,以及一个示例,展示了如何在 C# 中使用 YouTube 游戏大本营 SDK。
  4. 重要提示: 在主场景中,创建一个新的游戏对象并将其命名为 YTGameWrapper。此游戏对象用于与 JS 桥接器通信。
  5. 重要提示: 将导入的 YTGameWrapper.cs 代码作为脚本 组件添加到 YTGameWrapper 游戏对象。
  6. 如果您的项目有多个场景,请务必将 DontDestroyOnLoad 添加到 YTGameWrapper.cs 脚本(注意:新版本的脚本具有 DontDestroyOnSceneChange 切换开关,默认处于开启状态)。这样可确保脚本和游戏对象在整个游戏中保持不变。

    GameObject.DontDestroyOnLoad(this.gameObject);
    
  7. YTGameWrapper.cs 组件和 YTGameWrapper 游戏对象用于 连接到 YouTube 游戏大本营 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 游戏大本营 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.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 设置为 Disabled。此设置位于 Project settings -> Player -> WebGL 标签页 -> Publishing Settings 部分。
  4. Build Settings 窗口中为 WebGL 构建,然后根据项目的需要转到第 7 步或第 5 步。
  5. 仅当使用压缩时,才按照第 5 步和第 6 步操作 :构建项目后,导航到构建文件夹位置并打开 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 步中的构建位置。如果按照第 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 中通过软件包管理器导入 Addressables 软件包,然后将素材资源标记到 Addressable Groups 中。如需了解更多 详细信息,请参阅 Unity 文档

Asset Bundles

Asset Bundles 非常有用,因为您可以拆分项目并即时加载元素。这些元素对于 DLC、关卡包、新角色等非常有用。 Asset Bundles 非常适合自行管理内容加载和捆绑。您可以通过将素材资源标记到特定 Bundle 中,然后在需要时加载 Bundle 来使用这些元素。如需了解更多详细信息,请参阅 Unity 的 Asset Bundle 文档

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