> For the complete documentation index, see [llms.txt](https://docs.edgegap.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.edgegap.com/zh/docs/tools-and-integrations/cong-ugs-bu-shu.md).

# 从 UGS 部署

如果你希望继续使用 Unity Matchmaker 并将服务器部署到 Edgegap，请按照本指南操作。

{% hint style="success" %}
在寻找替代方案？可以考虑我们的托管 [匹配](/zh/learn/pi-pei.md) 搭配 [SDK 集成与示例](/zh/unity/pi-pei.md).
{% endhint %}

### 开始使用

{% embed url="<https://youtu.be/IwgOm2nmD9s>" %}

本指南重点介绍如何将 Edgegap 服务器托管作为托管提供商接入，假设：

* 你已经有一个可正常工作的 Unity 匹配设置，
* 你已在 Edgegap 注册，并且 [上传了你的 Unity 服务器构建](/zh/unity.md).

请参阅 [Unity 的 Matchmaking 文档](https://docs.unity.com/en-us/matchmaker) 了解匹配相关主题。

{% hint style="info" %}
参见 [从 Multiplay 迁移](/zh/docs/tools-and-integrations/cong-multiplay-qian-yi.md) 用于比较并将 Multiplay 概念映射到 Edgegap 托管。
{% endhint %}

[为服务器选择合适的位置，平均可将延迟降低高达 58%！](/zh/learn/bian-pai/deployments.md#server-placement)

在本指南中，我们将涵盖：

* 构建和部署 `EdgegapAllocator` 用于你的 Matchmaker 的云脚本模块，
* 获取玩家用于最佳服务器部署位置的公网 IP 地址，
* 在 UGS 云脚本中实现 webhook 监听器并检索服务器分配。

### Edgegap Allocator

首先， [下载托管提供商仓库](https://github.com/Unity-Technologies/matchmaker-hosting-providers/tree/main) 搭配 `EdgegapAllocator` 源代码。

这是 [我们的云脚本](https://github.com/Unity-Technologies/matchmaker-hosting-providers/blob/main/modules/EdgegapAllocator/CONFIGURATION.md) ，用于启动新服务器，由 Unity matchmaker 在匹配组建完成后启动。这是 Unity 官方批准的集成。

#### 所需密钥

首先，在以下位置添加这些密钥： [Unity 仪表板](https://cloud.unity.com/) 在 **管理** > **密钥**:

* `EDGEGAP_API_TOKEN` - 你的 Edgegap API 令牌。

在以下位置找到你的令牌： [Edgegap 仪表板](https://app.edgegap.com/user-settings?tab=tokens).

#### 所需代码更改

编辑 `Project/EdgegapAllocator.cs` 并更新这些常量：

替换为你的 Edgegap 应用名称，来源于 [应用程序列表](https://app.edgegap.com/application-management/applications/list).

{% code title="ApplicationName（第 34 行）" %}

```csharp
private const string ApplicationName = "MyApp"; // TODO: 替换为实际的应用名称
```

{% endcode %}

替换为你要使用的 Edgegap 应用版本名称。

{% code title="VersionName（第 35 行）" %}

```csharp
private const string VersionName = "MyVersion"; // TODO: 替换为实际的版本名称
```

{% endcode %}

替换为你的 Edgegap 应用版本中供玩家连接使用的端口名称。

{% code title="PortName（第 36 行）" %}

```csharp
private const string PortName = "gameport"; // TODO: 替换为实际的端口名称
```

{% endcode %}

#### 部署模块

[按照 Unity 官方说明，使用 CLI 或编辑器部署你自定义的模块。](https://github.com/Unity-Technologies/matchmaker-hosting-providers/tree/main#deploy-the-module)

### 获取玩家 IP

{% hint style="warning" %}
**如果未提供玩家 IP 地址，你的部署将回退到 Los Alamos 位置。**
{% endhint %}

为了按需为每场比赛提供最佳服务器位置，Edgegap 要求你在部署时提供玩家 IP 地址。虽然 Unity 不提供此功能，但你可以使用我们提供的 C# 代码片段，在游戏客户端中通过免费服务 [ipify](https://ipify.org):

{% code title="PlayerNetworkBehaviour.cs" %}

```csharp
public class PlayerNetworkBehaviour : MonoBehaviour {
    public IEnumerator GetPublicIP(Action<string> callback)
    {
        UnityWebRequest request = UnityWebRequest.Get("https://api.ipify.org?format=json");
        yield return request.SendWebRequest();
    
        if (request.result == UnityWebRequest.Result.Success)
        {
            string responseText = request.downloadHandler.text;
            string clientIp = JObject.Parse(responseText)["ip"].ToString();
            callback(clientIp);
        }
        else
        {
            Debug.LogError("获取公共 IP 地址失败。");
        }
        request.Dispose();
    }
}
```

{% endcode %}

预期每位玩家都使用票据中的自定义数据提供其公共 IP 地址：

```csharp
CreateTicketOptions ticketOptions = new CreateTicketOptions(
    queueName: "my-queue", 
    attributes: new Dictionary<string, object>
    {
        { "player_ip": "<insert-ip>" },
    }
);
```

### 接收分配

可使用标准的 Unity 匹配方法检索分配。

我们的示例将使用以下方式为你处理分配： [**状态 API，速率限制为 20 请求/秒**](https://docs.edgegap.com/docs/api/dedicated-servers#get-v1-status-deployment_id)**.**

这对大多数游戏来说已足够。如果你预计同时在线用户数超过 50,000，请考虑其他方法。

#### 替代分配方式

{% hint style="info" %}
对于面向全球的大规模上线，可使用更具可扩展性的替代方案： [Webhook](/zh/learn/bian-pai/deployments.md#webhooks) 可用。
{% endhint %}

一旦匹配成功，并且你的云脚本请求了新的部署，响应中还不会包含连接详情。你将收到一种回执——部署 ID。

你的分配器函数需要将此部署 ID 与匹配到的玩家 ID 一起存储到 UGS Game Data 中，以便之后查找玩家并提供连接详情。

现在，你需要创建另一个云脚本函数 `AssignmentProcessor`  并提供一个公开 URL。该 URL 必须作为以下内容包含在你的分配器部署请求中： `webhook_on_ready` .

当 Edgegap 部署好你的游戏服务器后，它会向你的新云脚本发送一个包含全部连接详情的 webhook HTTP 事件，例如 FQDN（URL）和客户端连接的外部端口。你的 `AssignmentProcessor`  需要查找部署 ID，并将连接详情一并存储。

你的游戏客户端必须轮询这些游戏数据，并在获取到 FQDN 和外部端口后立即尝试连接。

<figure><img src="/files/1b07231db9f42ef170d1eb14bc381692fd3b21e9" alt=""><figcaption></figcaption></figure>
