# 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](/docs.edgegap.com-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 버전.

☑️ 다음 형식으로 애플리케이션 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 플러그인을 사용하는 경우 기본 포트 매핑 이름입니다](/docs.edgegap.com-ko/unity.md).

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

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

{% 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/docs/sample-projects/unity-netcodes/pages/1e75126474c80b6c476cbd5e97b171fce5779d47#id-1.-server-score-strategy-best-practice) 당사의 [플러그인을 사용할 때](/docs.edgegap.com-ko/unity/developer-tools.md) 또는 [API](/docs.edgegap.com-ko/docs/api/dedicated-servers.md) 따라서 운영 환경에서는 Photon Cloud 리전 설정이 필요하지 않습니다.

</details>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.edgegap.com/docs.edgegap.com-ko/docs/sample-projects/unity-netcodes/photon-fusion-2-on-edgegap.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
