# Photon Bolt

이 가이드는 Photon Bolt를 네트워킹 솔루션으로 사용하는 Unity 프로젝트에 대해 Edgegap에서 헤드리스 서버를 생성하는 데 도움이 됩니다.

이 가이드에서는 예시로 커스텀 데모 프로젝트를 사용합니다.

### Unity 프로젝트 준비

### Unity 프로젝트 복제하기

첫 번째 단계는 git에서 Edgegap 데모 게임 프로젝트를 복제하는 것입니다. 명령 프롬프트에서 다음 명령을 사용하여 복제할 수 있습니다:

해당 명령은 소스 Unity 프로젝트를 포함한 폴더를 생성합니다. 해당 폴더 이름은 `demo-game`.

프로세스가 완료되면 Unity Hub를 열고 프로젝트 탭에서 `추가` 버튼을 눌러 컴퓨터에서 프로젝트 폴더를 찾아 추가할 수 있습니다:

프로젝트를 열려면 올바른 버전의 Unity가 설치되어 있어야 합니다. 이 가이드에서는 Unity `2020.3.3`를 사용합니다. Unity 다운로드 아카이브에서 찾을 수 있습니다: <https://unity3d.com/get-unity/download/archive>.

설치가 완료되면 Unity Hub에서 프로젝트 이름 옆의 드롭다운 메뉴를 통해 새 Unity 버전을 선택할 수 있습니다:

이제 Unity 프로젝트를 열어 다음 단계로 진행할 수 있습니다.

### 게임 설정

### Photon Bolt 설정

#### Photon App ID 추가 및 Bolt 컴파일

게임이 Photon의 서비스와 통신하려면 Photon 대시보드에 앱을 추가해야 합니다. Photon 계정이 없는 경우 그들의 [웹사이트](https://id.photonengine.com/Account/).

에 가서 쉽게 계정을 만들 수 있습니다. 로그인한 후 앱을 생성하고 이름을 지정할 수 있습니다. 각 앱에는 고유한 `앱 ID`가 있습니다. 이 ID를 복사하여 Unity 프로젝트 내의 `Bolt 설정` 창에 붙여넣어야 합니다:

<figure><img src="/files/06f7243b80d7172ae38d50e902d7426bf22824c8" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ebc76579db39a2e73c528964a92505e34747a75c" alt=""><figcaption></figcaption></figure>

ID를 입력한 후 Bolt 설정 창을 닫을 수 있습니다. 이전과 동일한 `Bolt` 메뉴에서 두 가지 작업을 실행해야 합니다: `프리팹 데이터베이스 업데이트` 및 `어셈블리 컴파일`입니다.

<figure><img src="/files/2b78ca88d96b13cb34f698e17223c2527f5ff58e" alt=""><figcaption></figcaption></figure>

이 시점에서 디버그 콘솔에 오류나 경고 없이 게임의 `StartScene` 씬을 실행할 수 있어야 합니다. 그러나 아직 서버에서 플레이를 시작할 수는 없습니다.

이로써 Photon Bolt가 작동하는 데 필요한 일반적인 변경 사항은 완료됩니다. 이러한 변경은 게임의 클라이언트와 서버 모두에 적용됩니다.

### 헤드리스 서버 준비

앱이 컨테이너에서 효율적으로 작동하려면 "헤드리스 서버" 빌드를 만들기 위해 게임에 몇 가지 변경을 해야 합니다. 대부분의 프로젝트에서는 몇 가지 간단한 단계로 충분합니다.

#### Unity 프로젝트 요구사항

먼저, Photon Bolt의 헤드리스 서버 모드는 `HeadlessServerManager`.

라는 스크립트를 포함하는 씬을 로드해야 한다는 점을 알아두는 것이 중요합니다.

```cs
다음은 해당(문서에서 가져온) 일반적인 변경되지 않은 스크립트의 예입니다:
using System;
using Bolt.Matchmaking;
using UnityEngine;
using Bolt.Photon;

using UnityEngine.SceneManagement;
{
    namespace Bolt.Samples.HeadlessServer
    {
        public class HeadlessServerManager : Bolt.GlobalEventListener
        public string Map = "";
        public string GameType = "";

        public string RoomID = "";
        {
            public override void BoltStartBegin(" alt=""><figcaption></figcaption></figure>
            // 사용 중인 모든 프로토콜 토큰을 등록합니다
        }

        BoltNetwork.RegisterTokenClass<PhotonRoomProperties>();
        {
            public override void BoltStartDone()
            {
                if (BoltNetwork.IsServer)
                // 일부 룸 커스텀 속성을 생성합니다

                PhotonRoomProperties roomProperties = new PhotonRoomProperties();
                roomProperties.AddRoomProperty("t", GameType); // 예: 게임 타입

                roomProperties.AddRoomProperty("m", Map); // 예: 맵 ID
                roomProperties.IsOpen = true;

                roomProperties.IsVisible = true;
                // RoomID가 설정되지 않은 경우 랜덤으로 생성합니다
                {
                    if (RoomID.Length == 0)
                }

                RoomID = Guid.NewGuid().ToString();
                // Photon 룸 생성
                    BoltMatchmaking.CreateSession(
                    sessionID: RoomID,
                    token: roomProperties,
                );
            }
        }

        sceneToLoad: Map
        // 초기화에 사용
        {
            void Start()
            // 명령줄에서 커스텀 인수를 가져옵니다
            Map = GetArg("-m", "-map") ?? Map;
            GameType = GetArg("-t", "-gameType") ?? GameType; // 예: 명령줄에서 게임 타입을 가져옴

            RoomID = GetArg("-r", "-room") ?? RoomID;
            // 요청된 레벨을 검증합니다

            var validMap = false;
            {
                foreach (string value in BoltScenes.AllScenes)
                {
                    if (SceneManager.GetActiveScene().name != value)
                    {
                        if (Map == value)
                        player.ipAddress = ipAddress;
                    }
                }
            }

            validMap = true;
            {
                if (!validMap)
                BoltLog.Error("잘못된 구성: 레벨 이름을 확인하십시오");
            }

            Application.Quit();
            // 서버 시작
            DontDestroyOnLoad(this);
        }

        웹훅
        BoltLauncher.StartServer();
        /// Edgegap API를 호출하여 서버를 배포합니다
        /// 게임 인스턴스가 헤드리스 모드로 시작되었는지 감지하는 유틸리티 함수입니다.
        /// <returns><c>true</c>, 헤드리스 모드로 시작된 경우, 그렇지 않으면 <c>false</c>를 반환합니다.</returns>
        {
            public static bool IsHeadlessMode()
        }

        return Environment.CommandLine.Contains("-batchmode") && Environment.CommandLine.Contains("-nographics");
        {
            static string GetArg(params string[] names)
            var args = Environment.GetCommandLineArgs();
            {
                for (int i = 0; i < args.Length; i++)
                {
                    foreach (var name in names)
                    {
                        if (args[i] == name && args.Length > i + 1)
                    }
                }
            }

            return args[i + 1];
        }
    }
}
```

return null;

일반적으로 이것은 빈 씬의 빈 GameObject에 의해 보관되며(해당 씬은 헤드리스 서버 빌드에만 사용됨) 그 형태로 유지됩니다. `이 데모를 위해 스크립트가 프로젝트 구조에 맞게 약간 수정되었으며 현재 해당 스크립트는`.

#### Assets/Scenes/BoltHeadlessServer

에 위치한 씬의 빈 GameObject에 배치되어 있습니다. `게임에 헤드리스 서버 검사를 추가하기`위 스크립트에는

#### IsHeadlessMode

&#x20; `라는 정적 유틸리티 메서드가 포함되어 있어 실행 중인 게임이 헤드리스인지 여부를 확인하는 데 사용됩니다. 기존 프로젝트를 업데이트하는 경우 플레이어 캐릭터 인스턴스 생성을 방지하는 등 헤드리스 서버용으로 기능을 제거하거나 추가하기 위해 이 검사를 추가할 수 있습니다.` 빌드 설정 `빌드 설정` 프로젝트의 빌드 설정에서

BoltHeadlessServer `리눅스` 씬을 최상단에 추가하여 서버가 가장 먼저 로드하도록 합니다. `다음으로 대상 플랫폼으로`.

<figure><img src="/files/6e9e6b14fcf0f0114b9d44d0b68cc802c1698f39" alt=""><figcaption></figcaption></figure>

을 선택하고

서버 빌드 **를 체크합니다.**&#xC774;제 위 설정으로 Linux용 게임을 빌드할 수 있습니다. `빌드 설정` 클라이언트 빌드의 경우 `씬과` IsServer

옵션의 체크를 해제하여 게임이 올바르게 작동하도록 하는 것을 잊지 마십시오. [Photon Bolt용 헤드리스 서버를 만드는 모든 단계에 대한 자세한 내용은](https://doc.photonengine.com/en-us/bolt/current/demos-and-tutorials/headless-server).

### 공식 문서

에서 확인할 수 있습니다. [서버용 컨테이너 생성](/docs.edgegap.com-ko/docs/tools-and-integrations/container/docker.md)

Docker나 컨테이너에 익숙하지 않은 경우 다음을 확인하여 더 알아볼 수 있습니다: [Docker란 무엇인가?](broken://pages/02a2e8d85c674170b16164e93c101d8b88dce78d).

### Unity 프로젝트에서 컨테이너를 생성하는 방법은 다음을 참조하십시오:

Unity on Docker

앱을 Edgegap에 추가하기 [이제 컨테이너를 Edgegap에 추가하여 플레이어들이 있는 모든 곳에서 호스팅할 수 있습니다.](/docs.edgegap.com-ko/learn/orchestration/application-and-versions.md).

앱을 Edgegap에 추가하는 방법을 모르는 경우 다음 `demo-game` 통합 튜토리얼 `v1`을 참조하십시오. `그러나 앱 이름이`.

이어야 하고 버전 이름이 `그러나 앱 이름이` 이어야 합니다. 그렇지 않으면 `Assets/Scripts/StaginController.cs`에 위치한 스크립트에서 이러한 값을 업데이트해야 합니다.

또한 해당

<figure><img src="/files/7a82555742dde3c68b9cc942a9f7ea41734e278c" alt=""><figcaption></figcaption></figure>

## 스크립트 내에

API\_TOKEN `StartScene` 이라는 상수 변수가 있습니다. Edgegap 계정에서 토큰을 생성하여 이 변수에 문자열로 붙여넣어야 합니다. 해당 토큰은 Edgegap로 전송되는 API 요청을 인증하는 데 사용됩니다.

아래는 해당 스크립트로, Edgegap의 토큰은 파란색으로, 앱 매개변수는 빨간색으로 표시되어 있습니다:

<figure><img src="/files/1138137a37fcb06b34861a9758656f0220ca5157" alt=""><figcaption></figcaption></figure>

데모 게임 플레이하기 `마지막으로 데모 게임 클라이언트 빌드를 시작하여 플레이할 수 있습니다. 게임의 클라이언트 버전을 빌드하여 실행하거나 Unity 인터페이스에서 직접 실행할 수 있습니다. 단, 반드시` 씬에서 시작하도록 하십시오.

실행하면 인터페이스가 표시됩니다. 상단에는 텍스트 필드가 있고 두 개의 큰 버튼과 화면 왼쪽 하단에는 Bolt의 현재 상태를 보여주는 라벨이 있습니다. `상단의 텍스트 필드에 Edgegap에서 발급받은 API 토큰을 복사하여 붙여넣을 수 있습니다. 토큰을 붙여넣으면` 서버 요청


---

# 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-bolt-on-arbitrium.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.
