> 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 %}

### 入门

本指南重点介绍将 Edgegap 服务器托管添加为托管提供商，前提是：

* 你已经有一个可用的 Unity Matchmaking 配置，
* 你已在 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-qie-huan.md) 用于比较并将 Multiplay 概念映射到 Edgegap 托管。
{% endhint %}

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

在本指南中，我们将介绍：

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

### Edgegap 分配器

首先， [下载托管提供商仓库](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 Dashboard](https://cloud.unity.com/) 下添加这些密钥： **管理** > **密钥**:

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

在 [Edgegap Dashboard](https://app.edgegap.com/user-settings?tab=tokens).

#### 所需代码更改

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

替换为你在 [应用列表](https://app.edgegap.com/application-management/applications/list).

{% code title="中的 Edgegap 应用名称（第 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 或 Editor 部署你自定义的模块。](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);
        }
        否则
        {
            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 matchmaking 方法检索分配信息。

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

这对大多数游戏已经足够。如果你预计并发在线人数超过 50,000，建议考虑其他方法。

#### 替代分配方式

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

一旦匹配完成，并且你的云脚本请求了新的部署，返回结果中还不会包含连接详情。相反，你会收到一种回执——部署 ID。

你的分配器函数需要将此部署 ID 与匹配到的玩家 ID 一起存储在 UGS 游戏数据中，这样你就可以稍后查找玩家并提供连接详情。

现在，你需要再创建一个云脚本函数 `AssignmentProcessor`  ，并提供一个公开 URL。该 URL 必须作为 `webhook_on_ready` .

包含在你的 Allocator 部署请求中。一旦 Edgegap 部署了你的游戏服务器，它就会向你的新云脚本发送一个 webhook HTTP 事件，其中包含所有连接详情，例如 FQDN（URL）和供客户端连接的外部端口。你的 `AssignmentProcessor`  将需要查找部署 ID，并将连接详情与之一起存储。

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

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