# Photon Fusion 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 샘플을 선택하세요.

☑️ 새 프로젝트를 Unity에서 엽니다.

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

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

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

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

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

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

☑️ 새 프로젝트를 Unity에서 엽니다.

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

☑️ Host 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](https://docs.edgegap.com/docs.edgegap.com-ko/unity "mention") 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 버전.

☑️ 다음 형식으로 애플리케이션 ID를 찾으세요 `85314a99-56fc-4ab3-ba26-50efca09f303` .

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

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

{% hint style="success" %}
다음을 참조하세요 `EdgegapServerManager.cs`  Fusion 2와 Edgegap의 예제 통합을 위한 스크립트입니다.
{% 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).

게임 서버는 세션 이름으로 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 플러그인을 사용하는 경우 기본 포트 매핑 이름입니다](https://docs.edgegap.com/docs.edgegap.com-ko/unity).

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

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

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

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

// 이 값은 Edgegap 매치메이커 할당 또는 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 listenPort = 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;

// 나중에 클라이언트가 찾을 수 있도록 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/docs.edgegap.com-ko/learn/orchestration/deployments#id-1.-server-score-strategy-best-practice) 당사의 [플러그인을 사용할 때](https://docs.edgegap.com/docs.edgegap.com-ko/unity/developer-tools) 또는 [API](https://docs.edgegap.com/docs.edgegap.com-ko/docs/api/dedicated-servers) 따라서 운영 환경에서는 Photon Cloud 리전 설정이 필요하지 않습니다.

</details>
