> 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/ko/docs/sample-projects/unity-netcodes/photon-fusion-2-on-edgegap.md).

# 포톤 퓨전 2

다음의 기법을 사용하여 Edgegap에서 Unity 프로젝트를 호스팅하는 방법을 알아보세요 [Fusion 2 Asteroids 샘플](https://doc.photonengine.com/fusion/current/game-samples/fusion-asteroids).

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

## ✔️ 준비

시작하기 전에 필요한 것은 다음과 같습니다:

* Unity 6 - [Unity Hub를 사용하여 다운로드](https://unity.com/releases/unity-6),
* Edgegap용으로 수정된 Fusion 2 Asteroids 샘플 프로젝트 - [GitHub에서 다운로드](https://github.com/edgegap/netcode-sample-photon-fusion-2).

## ⚡ 배포 및 연결

### 1. Edgegap에 서버 배포

☑️ 시작하려면 다음이 필요합니다 [Edgegap에서 무료 계정을 생성하세요](https://app.edgegap.com/auth/register). 신용카드는 필요하지 않습니다.

☑️ [애플리케이션의 새 앱 버전을 생성하세요](https://app.edgegap.com/application-management/applications/fusion-2-asteroids-sample/versions/create), Fusion 2 Asteroids Sample을 선택하세요.

☑️ Unity에서 새 프로젝트를 여세요.

☑️ Tools / Edgegap Hosting으로 이동한 다음 6단계. Edgegap에 서버 배포로 이동하세요.

☑️ Deploy to cloud를 누르고 [새 배포의 세부 정보를 여세요](https://app.edgegap.com/deployment-management/deployments/list).

☑️ 배포의 고유한 일회용 연결 정보를 찾으세요:

* **호스트 URL** 형식: `780aa4260e83.pr.edgegap.net` .

✅ 이제 다음 단계로 진행할 수 있습니다.

### 2. 에디터에서 연결

☑️ Unity에서 새 프로젝트를 여세요.

☑️ ▶️ 재생 버튼을 눌러 게임 클라이언트를 시작하세요.

☑️ 호스트 URL(이전 단계의 연결 정보)을 방 이름으로 입력하세요.

☑️ Start Edgegap 버튼을 눌러 서버에 연결하세요.

☑️ 다음을 사용하여 두 번째 가상 플레이어를 연결하세요 [Multiplayer Play Mode](https://docs-multiplayer.unity3d.com/mppm/current/about/) 또는 [ParrelSync](https://github.com/VeriorPies/ParrelSync).

🙌 Edgegap에서의 첫 배포를 축하합니다!

## ✏️ 서버 빌드 사용자 지정

{% hint style="success" %}
참조 [Unity](/ko/unity.md) Unity에서 **서버를 빌드하고 사용자 지정하는 방법을 알아보세요**.
{% endhint %}

### Photon에서 앱 생성

{% hint style="info" %}
초기 데모를 쉽게 만들기 위해 Edgegap 소유의 무료 등급 Photon Cloud 계정을 사용했습니다.
{% endhint %}

☑️ [Photon에서 무료 계정을 생성하세요](https://dashboard.photonengine.com/).

☑️ [Photon에서 애플리케이션 생성](https://dashboard.photonengine.com/app/create):

* `멀티플레이어 게임`,
* `Fusion` Photon SDK,
* `Fusion 2` SDK 버전.

☑️ 다음 형식의 Application ID를 찾으세요 `85314a99-56fc-4ab3-ba26-50efca09f303` .

☑️ Tools / Fusion / Fusion Hub (Alt + F) 아래의 Photon Settings에 ID를 입력하세요.

### Fusion 2 프로젝트를 Edgegap과 통합

{% hint style="success" %}
참조 `EdgegapServerManager.cs`  Edgegap과의 Fusion 2 예제 통합용 스크립트입니다.
{% endhint %}

{% hint style="warning" %}
귀하의 `NetworkProjectConfig`  **다음을 사용해야 합니다 `Peer Mode = Single` (전용 서버)**, 다음이 아니라 `Multiple` (클라이언트-호스트)!
{% endhint %}

게임 클라이언트는 다음을 통해 게임 서버에 연결합니다 [Photon Fusion 2 ](https://doc.photonengine.com/fusion/current/manual/connection-and-matchmaking/matchmaking#creating-and-joining-a-game-session)[세션(방) ](https://doc.photonengine.com/fusion/current/manual/connection-and-matchmaking/matchmaking#creating-and-joining-a-game-session)[기능](https://doc.photonengine.com/fusion/current/manual/connection-and-matchmaking/matchmaking#creating-and-joining-a-game-session).

게임 서버는 \_runnerInstance.StartGame(StartGameArgs args)를 호출할 때 Session 이름과 함께 IP 주소와 외부 포트를 등록해야 합니다. `_runnerInstance.StartGame(StartGameArgs args)`:

* 다음을 사용하세요 `GameMode.Server`  연결이 Photon Cloud를 통해 중계되지 않도록 보장합니다(지연 시간 증가),
* 다음을 사용하세요 `NetAddress.CreateFromIpPort` Fusion의 메서드,
* 서버의 IP 주소를 제공하세요:\
  `Environment.GetEnvironmentVariable("ARBITRIUM_PUBLIC_IP")`
* 서버의 외부 포트를 제공하세요:\
  `Environment.GetEnvironmentVariable("ARBITRIUM_PORT_GAMEPORT_EXTERNAL")`
  * 이것은 다음을 사용하는 경우의 기본 포트 매핑 이름입니다 [서버를 패키징하는 Unity 플러그인](/ko/unity.md).

Edgegap 배포 호스트 URL을 세션 이름으로 사용하세요:

* 게임 서버에서는 다음으로 가져옵니다\
  `$"{Environment.GetEnvironmentVariable(\"ARBITRIUM_REQUEST_ID\")}.pr.edgegap.net"`
* 게임 클라이언트를 테스트할 때는 대시보드 - 배포 세부 정보 페이지 / Host URL에서 가져옵니다
  * 다음을 통해 테스트용 배포를 생성하세요 [퀵스타트 호스팅 플러그인](/ko/unity/developer-tools.md#dedicated-servers-quickstart-plugin),
* 실제 게임 클라이언트에서는 다음에서 가져옵니다 [매치메이킹 / 티켓 할당 / fqdn](/ko/learn/matchmaking/matchmaker-in-depth.md#player-api):
  * 또한 참조: [Matchmaking 시작하기](/ko/learn/matchmaking.md).

{% tabs %}
{% tab title="클라이언트 통합" %}
{% code title="EdgegapClientManager.cs" %}

```csharp
// fusion 2 네트워크 러너 가져오기
_runnerInstance = FindFirstObjectByType<NetworkRunner>();
_runnerInstance.ProvideInput = true;

// 이 값은 Edgegap Matchmaker Assignment 또는 Fusion 2 Sessions API에서 가져옵니다
string sessionName = "<requestId.pr.edgegap.net>";

// fusion 2 세션 찾기(세션 이름 사용)
var result = await _runnerInstance.StartGame(
    new StartGameArgs() {
        GameMode = GameMode.Client,
        SessionName = sessionName,
        ObjectProvider = _runnerInstance.GetComponent<NetworkObjectPoolDefault>(),
    }
);

// 이제 fusion이 세션 이름을 기반으로 서버 IP와 포트를 가져와 연결합니다
```

{% endcode %}
{% endtab %}

{% tab title="서버 통합" %}
{% code title="EdgegapServerManager.cs" %}

```csharp
// edgegap이 주입한 환경 변수를 읽습니다
string requestId = Environment.GetEnvironmentVariable("ARBITRIUM_REQUEST_ID");
string listenPortStr = Environment.GetEnvironmentVariable("ARBITRIUM_PORT_GAMEPORT_INTERNAL");
string connectIP = Environment.GetEnvironmentVariable("ARBITRIUM_PUBLIC_IP");
string connectPort = Environment.GetEnvironmentVariable("ARBITRIUM_PORT_GAMEPORT_EXTERNAL");

// fusion 2 네트워크 러너 가져오기
_runnerInstance = FindFirstObjectByType<NetworkRunner>();
_runnerInstance.ProvideInput = true;

// listen 포트를 StartGame이 기대하는 ushort로 파싱합니다
ushort.TryParse(listenPortStr, out ushort listenPort);

// 클라이언트가 나중에 찾을 수 있도록 fusion 2 세션을 등록합니다(세션 이름 사용)
var result = await _runnerInstance.StartGame(
    new StartGameArgs() {
        GameMode = GameMode.Server,
        SessionName = $"{requestId}.pr.edgegap.net",
        ObjectProvider = _runnerInstance.GetComponent<NetworkObjectPoolDefault>(),
        Address = NetAddress.Any(listenPort),
        CustomPublicAddress = NetAddress.CreateFromIpPort(connectIP, connectPort),
    }
);

// 초기 씬을 로드합니다
if (result.Ok && _runnerInstance.IsServer) {
    await _runnerInstance.LoadScene(sceneName);
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

### 문제 해결

<details>

<summary><code>게임이 존재하지 않습니다 (32758)</code></summary>

* Photon 방은 플레이어가 배포가 위치한 Photon Cloud 리전에 연결되어 있어야 합니다. 대시보드에서 배포하면 무작위 플레이어 IP가 사용됩니다.
* 지도에서 배포 위치를 찾은 다음, Assets / Photon / Fusion / Resources / PhotonAppSettings.asset에서 게임 클라이언트를 다음과 일치하도록 구성해야 할 수 있습니다 [Photon Cloud 리전](https://doc.photonengine.com/fusion/current/manual/connection-and-matchmaking/regions#photon-cloud-for-gaming).
* Edgegap [플레이어에게 가능한 한 가깝게 배포합니다](https://docs.edgegap.com/ko/docs/sample-projects/unity-netcodes/pages/1e75126474c80b6c476cbd5e97b171fce5779d47#id-1.-server-score-strategy-best-practice) 다음을 사용할 때 [플러그인](/ko/unity/developer-tools.md) 또는 [API](/ko/docs/api/dedicated-servers.md) 따라서 프로덕션에서는 Photon Cloud 리전을 설정할 필요가 없습니다.

</details>
