从 Unity 运行时调用

通过从 Unity 编辑器中经过身份验证的游戏客户端调用模块端点来运行它。

Note: If a module has not received any traffic in the last 15 minutes, you may experience a cold start latency. Any subsequent calls to the module are faster.

先决条件

要在 Unity 编辑器中使用云代码,您必须先安装云代码 SDK 并将您的 Unity Gaming Services 项目 链接到 Unity 编辑器。

将您的 Unity Gaming Services 项目 与 Unity 编辑器关联。您可以在 Unity 云仪表板中找到您的 UGS 项目 ID。

  1. 在 Unity 编辑器中,选择编辑 > 项目设置 > 服务

  2. 链接您的项目。

    • 如果您的项目没有 Unity 项目 ID

      1. 选择创建 Unity 项目 ID > 组织,然后从下拉菜单中选择一个组织。
      2. 选择创建项目 ID
    • 如果您有现有的 Unity 项目 ID

      1. 选择使用现有的 Unity 项目 ID
      2. 从下拉菜单中选择一个组织和一个项目。
      3. 选择链接项目 ID

您的 Unity 项目 ID 将出现,并且该项目现在已链接到 Unity 服务。您还可以使用 UnityEditor.CloudProjectSettings.projectId 在 Unity 编辑器脚本中访问您的项目 ID。

SDK 安装

要为 Unity 编辑器安装最新的云代码包,请执行以下操作

  1. 在 Unity 编辑器中,打开窗口 > 包管理器
  2. 在包管理器中,选择Unity 注册表列表视图。
  3. 搜索 com.unity.services.cloudcode,或在列表中找到云代码包。
  4. 选择该包,然后单击安装

Check Unity - Manual: Package Manager window to familiarize yourself with the Unity Package Manager interface.

SDK 设置

要开始使用云代码 SDK,请执行以下操作

  1. 确保通过云代码服务仪表板页面启用了该服务。
  2. 确保您已安装云代码和身份验证 SDK。
  3. 通过选择编辑 > 项目设置... > 服务,从 Unity 编辑器中登录到您的云项目。
  4. 在 Unity 编辑器中创建一个新的 C# Monobehaviour 脚本。请参阅 Unity 手册中的创建和使用脚本
  5. 在脚本中,使用 await UnityServices.InitializeAsync() 初始化核心 SDK。
  6. 在脚本中,初始化身份验证 SDK。

典型工作流程

您可以从 Unity 编辑器中的常规 MonoBehaviour C# 脚本调用云代码 SDK。

  1. 在 Unity 引擎中创建一个 C# MonoBehaviour 脚本。请参阅Unity - 手册:创建和使用脚本
  2. MonoBehaviour 脚本中,配置Unity 身份验证服务。
  3. MonoBehaviour 脚本中,添加对云代码 SDK 的调用。
  4. MonoBehaviour 脚本附加到游戏对象。请参阅编辑器脚本
  5. 选择播放并运行项目以查看云代码的实际效果。

身份验证

玩家必须具有有效的玩家 ID 和访问令牌才能访问云代码服务。在使用任何云代码 API 之前,您必须使用身份验证 SDK 对玩家进行身份验证。您可以通过在 C# Monobehaviour 脚本中初始化身份验证 SDK 来完成此操作。请参阅对玩家进行身份验证

要初始化身份验证 SDK,请在您的 C# Monobehaviour 脚本中包含以下内容

C#

await AuthenticationService.Instance.SignInAnonymouslyAsync();

首先,我们建议使用匿名身份验证。以下示例演示了如何使用身份验证包启动匿名身份验证,并在 Unity 编辑器中的脚本中记录玩家 ID。

C#

using Unity.Services.Authentication;
using System.Threading.Tasks;
using Unity.Services.Core;
using UnityEngine;

public class AuthenticationExample : MonoBehaviour
{
    internal async Task Awake()
    {
        await UnityServices.InitializeAsync();
        await SignInAnonymously();
    }

    private async Task SignInAnonymously()
    {
        AuthenticationService.Instance.SignedIn += () =>
        {
            var playerId = AuthenticationService.Instance.PlayerId;

            Debug.Log("Signed in as: " + playerId);
        };
        AuthenticationService.Instance.SignInFailed += s =>
        {
            // Take some action here...
            Debug.Log(s);
        };

        await AuthenticationService.Instance.SignInAnonymouslyAsync();
    }
}

调用云代码模块端点

在新创建的脚本中包含身份验证后,您就可以调用云代码模块端点。包含以下命名空间以将云代码集成到您的 Unity 编辑器项目中

C#

Using Unity.Services.CloudCode;

以下示例假设您部署了一个名为 HelloWorld 的模块,该模块带有一个名为 RollDice 的端点,代码如下

C#

using System;
using System.Threading.Tasks;
using Unity.Services.CloudCode.Core;

namespace HelloWorld;

public class HelloWorld
{
    public class Response
    {
        public Response(int roll, int sides)
        {
            Roll = roll;
            Sides = sides;
        }

        public int Roll { get; set; }
        public int Sides { get; set; }
    }

    [CloudCodeFunction("RollDice")]
    public async Task<Response> RollDice(int diceSides)
    {
        var random = new Random();
        var roll = random.Next(1, diceSides);

        return new Response(roll, diceSides);
    }
}

使用编辑器绑定

您可以为您的云代码模块生成编辑器绑定,以便您可以在 Unity 编辑器界面中使用它们。有关更多信息,请参阅生成绑定

以下示例是从 Unity 编辑器调用云代码模块的类型安全方法。在 Unity 编辑器中创建一个 C# MonoBehaviour 脚本 RollDiceExample,并包含以下代码

C#

using Unity.Services.Authentication;
using Unity.Services.CloudCode;
using Unity.Services.CloudCode.GeneratedBindings;
using Unity.Services.Core;
using UnityEngine;

public class RollDiceExample : MonoBehaviour
{
    private async void Start()
    {
        // Initialize the Unity Services Core SDK
        await UnityServices.InitializeAsync();

        // Authenticate by logging into an anonymous account
        await AuthenticationService.Instance.SignInAnonymouslyAsync();

        try
        {
            // Call the function within the module and provide the parameters we defined in there
            var module = new HelloWorldBindings(CloudCodeService.Instance);
            var result = await module.RollDice(6);

            Debug.Log($"You've rolled {result.Roll}/{result.Sides}");
        }
        catch (CloudCodeException exception)
        {
            Debug.LogException(exception);
        }
    }
}

使用 CallModuleEndpointAsync

您还可以使用 CallModuleEndpointAsync API 客户端方法,您可以在 CloudCodeService.Instance 下找到它。

C#

/// <summary>
        /// Calls a Cloud Code function.
        /// </summary>
        /// <param name="module">Cloud Code Module to call</param>
        /// <param name="function">Cloud Code function to call.</param>
        /// <param name="args">Arguments for the cloud code function. Will be serialized to JSON.</param>
        /// <typeparam name="TResult">Serialized from JSON returned by Cloud Code.</typeparam>
        /// <returns>Serialized output from the called function.</returns>
        /// <exception cref="CloudCodeException">Thrown if request is unsuccessful.</exception>
        /// <exception cref="CloudCodeRateLimitedException">Thrown if the service returned rate limited error.</exception>
        Task<TResult> CallModuleEndpointAsync<TResult>(string module, string function, Dictionary<string, object> args = null);
  • module 参数是您的模块的名称。
  • function 参数是您的模块端点的名称,您使用 CloudCodeFunction 属性对其进行了标记。
  • args 参数是要传递给模块端点的参数字典。

在 Unity 编辑器中创建一个 C# Monobehaviour 脚本 RollDiceExample。以下是将身份验证和云代码集成到您的脚本中的完整示例

C#

using System.Collections.Generic;
using UnityEngine;
using Unity.Services.Authentication;
using Unity.Services.CloudCode;
using Unity.Services.Core;

public class RollDiceExample : MonoBehaviour
{
    // ResultType structure is the serialized response from the RollDice script in Cloud Code
    private class ResultType
    {
        public int Roll;
        public int Sides;
    }

    // Call this method
    public async void CallMethod()
    {
        await UnityServices.InitializeAsync();
        // Sign in anonymously into the Authentication service
        if (!AuthenticationService.Instance.IsSignedIn) await AuthenticationService.Instance.SignInAnonymouslyAsync();

        // Call out to the RollDice endpoint in the HelloWorld module in Cloud Code
        var response = await CloudCodeService.Instance.CallModuleEndpointAsync<ResultType>("HelloWorld", "RollDice", new Dictionary<string, object>( ) { { "diceSides", 6 } });

        // Log the response of the module endpoint in console
        Debug.Log($"You rolled {response.Roll} / {response.Sides}");
    }
}

运行脚本

要测试脚本,请将其附加到 Unity 编辑器中的游戏对象,然后选择播放

您可以在 Start() 方法中包含以下代码以调用 CallMethod() 方法

C#

public void Start()
    {
        CallMethod();
    }