This document is about: FUSION 2
SWITCH TO

관심 영역 & 멀티-피어

Level 4

개요

이 샘플 프로젝트는 Photon Fusion의 두 가지 핵심 기능인 관심 영역 및 멀티-피어 모드의 사용을 보여줍니다.

관심 영역은 Fusion이 제공하는 여러 유형의 관심 관리 중 하나입니다. 관심 영역(AoI)은 플레이어가 동시에 처리할 필요가 없는 네트워크 객체가 많은 애플리케이션에서 최적화하는 데 도움이 될 수 있습니다. 이는 플레이어에게 반경을 할당하고 이를 통해 그리드 시스템 내에서 사용하여 범위에 있는 네트워크 객체를 결정합니다. 객체가 더 이상 관심 영역에 없으면 해당 클라이언트에서 해당 네트워크 상태가 더 이상 전송되지 않고 업데이트되지 않습니다. 이 기능은 모든 토폴로지에서 사용할 수 있지만 공유 모드에서는 몇 가지 제한 사항이 있습니다.

멀티-피어 모드는 싱글 모드와 달리 동일한 빌드의 인스턴스를 여러 개 실행하거나 유니티 편집기를 실행하지 않고도 게임 세션에서 여러 클라이언트를 실행할 수 있습니다. 프로젝트의 네트워크 프로젝트 구성 에셋에서 멀티-피어 모드를 설정할 수 있습니다.

관심 영역은 NetworkObjects와 플레이어가 많을 때 가장 잘 사용되기 때문에 멀티-피어 모드와 함께 사용할 수 있으므로 이 기능을 보다 빠르고 쉽게 테스트할 수 있습니다. 이 샘플은 이 기능을 보여줍니다.

이 샘플에서 사용자는 지정된 수의 클라이언트를 생성할 수 있습니다. 각 클라이언트는 우주선으로 표현되며 유성도 있습니다. 이 샘플의 목표는 멀티-피어 및 관심 영역 구현에 초점을 맞추는 것이므로 우주선 및/또는 유성 간의 충돌은 없습니다.

다운로드

버전 릴리즈 일자 다운로드
2.0.1 Jun 20, 2024 Fusion Area of Interest Multi-Peer Technical Sample 2.0.1 Build 578

메인 메뉴

이 샘플에 대한 주메뉴 및 설정.

이 샘플의 메인 메뉴에는 사용자가 조정하고 테스트할 수 있는 매우 다양한 옵션이 포함되어 있습니다. 참고로, 화면 오른쪽 상단의 아래쪽 화살표를 클릭하면 언제든지 이 메뉴로 돌아갈 수 있습니다.

  • 게임 모드 & 클라이언트 개수
    • 게임 모드: 사용자가 공유 모드와 클라이언트/호스트 모드 사이를 전환할 수 있습니다.
    • 클라이언트 개수: 샘플을 실행할 때 생성할 클라이언트 수를 선택할 수 있습니다. 참고로 프로젝트의 CCU 수를 초과해서는 안 됩니다.
  • AoI 값
    • AoI 반경: 플레이어의 관심 영역 반경입니다. 기본값은 32입니다. 공유 모드에서는 300 단위를 초과할 수 없습니다.
    • AoI 셀 크기: 플레이어 AoI가 탐지된 셀의 크기로, 앞서 언급한 서버 영역으로 표시됩니다. 이 값은 기본적으로 32이며 공유 모드에서는 조정할 수 없습니다.
    • AoI 그리드 크기: 전체 AoI 그리드의 X, Y, Z 크기입니다. 기본적으로 1024 큐브이며 공유 모드에서는 조정할 수 없습니다.
  • 디스플레이
    • 디스플레이 플레이어 반경: 노란색 와이어 프레임 구체로 표시되는 AoI에서 사용하는 플레이어 반경을 토글 합니다.
    • 디스플레이 서버 존: 파란색 와이어 프레임 큐브로 표시된 활성 서버 영역을 전환합니다.
    • 디스플레이 플레이어 셀: 서버 영역 내에서 하늘색 하이라이트로 표시되는 플레이어가 현재 점유하고 있는 셀을 전환합니다.
    • 디스플레이 관심 그리드의 영역: 이렇게 하면 빨간색 와이어 프레임 큐브로 표시되는 전체 AoI 그리드가 전환됩니다.
  • 클라이언트 생성: 이 옵션을 클릭하면 지정된 수의 클라이언트를 생성하고 게임에 추가하는 스레드가 실행됩니다.

네트워크 러너 제어

메인 메뉴에서 Network Runner Controls 버튼을 클릭하면 유니티에서 액세스할 수 있는 Network Runner Controls 창과 유사한 정보가 포함된 다른 메뉴로 이동합니다.

활성 통계 패널이 있는 Network Runner Controls 메뉴.
  • 러너 가시성, 입력 및 통계: 클라이언트가 생성되면 이 목록은 사용 가능한 네트워크 러너 수를 반영하도록 채워집니다.
    • 가시성: 눈으로 표시되는 토글링 가시성은 NetworkRunner.SetVisiblity 메소드를 실행했으며 네트워크 객체들에 연결된 EnableOnSingleRunner 컴포넌트에 설정된 다양한 컴포넌트를 활성화 또는 비활성화합니다. 시프트를 누른 상태에서 이 버튼을 왼쪽 클릭하면 선택한 NetworkRunner가 격리되고 다른 컴포넌트는 숨깁니다.
    • 입력: 게임 패드로 표시되는 토글링 입력은 NetworkRunner.ProvideInput 속성을 설정합니다. 입력을 제공하지 않으면 GetInput 메소드가 인식되지 않습니다. 이 입력은 한 클라이언트에 대해서만 제공됩니다. 시프트를 누른 상태에서 이 버튼을 클릭하면 선택한 것을 제외한 모든 NetworkRunner의 입력이 꺼집니다.
    • 통계: 이를 클릭하면 선택한 NetworkRunner와 관련된 Fusion 통계 창이 나타납니다. Fusion 통계에 대한 자세한 내용은 여기에서 읽을 수 있습니다.

멀티-피어

네트워크 프로젝트 구성 설정

네트워크 프로젝트 구성 에셋의 기본 설정에 대한 몇 가지 변경 사항을 알아둘 필요가 있습니다. 먼저 멀티 피어 모드가 작동하려면 Peer ModeMultiple로 설정해야 합니다. 다음 그림과 같이 Replication FeaturesScheduling and Interest Management로 설정해야 합니다:

이 예제에 대한 `네트워크 프로젝트 구성` 설정.

NetworkRunner 설정

NetworkRunner가 멀티-피어 및 AoI 기능과 제대로 작동하려면 클라이언트당 인스턴스화되는 NetworkRunner 프리팹에 추가해야 하는 몇 가지 컴포넌트가 있습니다.

  • 러너 가시성 활성화: 이렇게 하면 연관된 NetworkRunner를 적절한 확장자와 함께 자동으로 등록하고 로드된 씬 개체와 생성된 객체를 피어의 가시성 처리와 함께 연결합니다.
  • 러너 AoI 기즈모: 이 컴포넌트는 서버 관심 영역 및 플레이어 셀과 같은 관심 영역 정보를 나타내는 기즈모를 그립니다. 기즈모를 사용하기 때문에 이 정보는 편집기에서만 볼 수 있습니다.
  • 러너 AoI 디스플레이: 이 컴포넌트는 이 샘플을 위해 특별히 제작되었으며 Runner AoI 기즈모 컴포넌트를 통해 제공된 동일한 정보를 보여주지만 앞서 언급한 정보를 표시하기 위해 게임 객체 풀을 사용하여 이를 수행합니다. 그러나 이 컴포넌트와 Runner AoI 기즈모는 모두 디버깅 목적이며 AoI 기능을 테스트할 때만 사용해야 합니다.
  • Fusion 통계: 이 컴포넌트는 이 NetworkRunner에 대한 특정 정보를 표시하는 게임 객체를 생성합니다. 시작 시 비활성화되어 있어 바로 열리지 않습니다. 여기에서 Fusion 통계 도구에 대한 자세한 내용을 읽을 수 있습니다.

NetworkObject 설정

기본적으로 멀티-피어 모드를 실행하면 NetworkRunner의 가시성에 관계없이 모든 클라이언트에서 NetworkObjects가 활성화됩니다. 이를 해결하기 위해 EnableOnSingleRunner 컴포넌트가 이 개체에 추가됩니다.

AoI 플레이어 NetworkBehaviour 설정.

이 컴포넌트에는 보이는 네트워크 러너에서만 활성화해야 하는 컴포넌트 집합이 할당됩니다. 예를 들어 Light, Camera, AudioListener, 및 Renderers등은 보이는 NetworkRunners 에서만 볼 수 있습니다. 클라이언트로 설정된 기본 러너를 사용하면 보이는 모든 클라이언트에서 이 기능을 제대로 수행할 수 있습니다.

클라이언트 생성하기

사용자가 메인 메뉴에서 클라이언트 생성 버튼을 클릭하면 비동기 기능인 BeginMultipeerSession이 트리거 됩니다.

C#

public async void BeginMultipeerSession()
{
    mainPanel.SetActive(false);

    for (int i = 0; i < PlayersToSpawn; i++)
    {
        var newRunner = Instantiate(aoiRunnerPrefab);

        StartGameArgs startGameArgs = new StartGameArgs()
        {
            GameMode = currentGameMode,
            PlayerCount = 100,
        };

        var result = await newRunner.StartGame(startGameArgs);

        if (!result.Ok)
        {
            Debug.LogError(result.ErrorMessage);
            return;
        }

        if (newRunner.IsSceneAuthority)
        {
            var loadSceneResult = newRunner.LoadScene(aoiSceneName, loadSceneMode: UnityEngine.SceneManagement.LoadSceneMode.Additive);

            await loadSceneResult;

            if (loadSceneResult.IsDone)
            {
                Debug.Log("Scene Load Complete");
            }
        }

        runnerPanel.AddRunner(newRunner);
    }
}

이 비동기 기능은 지정된 플레이어 수를 통해 반복되며, 메인 메뉴에 지정된 게임 모드를 사용하여 게임을 시작합니다. NetworkRunner가 시작되면 NetworkRunner.IsSceneAuthority가 true 이면 샘플의 주요 씬이 로드됩니다. 또한 runnerPanel.AddRunner가 호출될 때 생성된 첫 번째 NetworkRunner에 대한 가시성과 입력이 활성화됩니다.

AoI

AoI 속성 설정

관심 영역은 상태 권한을 가진 NetworkRunner가 FixedUpdateNetwork 내에서만 설정해야 합니다. 이 샘플에서는 다음 작업을 통해 수행합니다:

C#

...
if ((Runner.IsServer || Object.HasStateAuthority) && !Object.InputAuthority.IsNone)
{
    // The player interest must be cleared when no in share mode.
    if (Runner.GameMode != GameMode.Shared)
        Runner.ClearPlayerAreaOfInterest(Object.InputAuthority);
    Runner.AddPlayerAreaOfInterest(Object.InputAuthority, transform.position, MainMenuUI.AreaOfInterestRadius);
}

먼저 NetworkObject의 NetworkRunner가 서버인지 또는 객체에 StateAuthority가 있는지 확인합니다. true이고 InputAuthority가 할당된 경우 계속합니다. 이제 공유 모드에서는 할당 시 관심 영역이 자동으로 지워지지만 다른 모드에서는 먼저 지워져야 합니다. 이 작업이 완료되면 메인 메뉴에 정의된 현재 플레이어의 InputAuthority, 위치 및 AoI 반경을 사용하여 할당할 수 있습니다.

관심 영역 셀 및 그리드 설정은 공유 모드에서 수행할 수 없으며 서버에서만 수행할 수 있습니다. 그러나 매 프레임마다 업데이트할 필요는 없으며 대신 AoIPlayer 클래스의 Update 메소드에서 다음을 사용합니다:

C#

...
// Only the server can set these items.
if (Runner.IsServer && Object.InputAuthority == Runner.LocalPlayer)
{
    if (previousAoICell != MainMenuUI.AreaOfInterestCellSize)
    {
        Runner.SetAreaOfInterestCellSize(MainMenuUI.AreaOfInterestCellSize);
        previousAoICell = MainMenuUI.AreaOfInterestCellSize;
    }

    if (previousAoIGrid != MainMenuUI.AreaOfInterestGrid)
    {
        Runner.SetAreaOfInterestGrid(MainMenuUI.AreaOfInterestGrid.x, MainMenuUI.AreaOfInterestGrid.y, MainMenuUI.AreaOfInterestGrid.z);
        previousAoIGrid = MainMenuUI.AreaOfInterestGrid;
    }
}

이는 메인 메뉴의 파라미터가 변경되었는지 여부를 감지하고 변경된 경우 새로운 값을 설정합니다. 이러한 설정은 모든 플레이어에게 설정됩니다.

IInterestEnter & IInterestExit

NetworkObjects가 관심 영역에 들어가고 나갈 때 해당 네트워크 변환 및 기타 네트워크 속성은 로컬 클라이언트에서 업데이트되는 것을 중지합니다. 예를 들어 운석이 관심 영역에 다시 들어갈 경우 이동을 중지한 다음 적절한 위치로 팝 됩니다. 이를 방지하기 위해 NetworkBehaviors는 관심 영역에 들어가고 나갈 때 각각 트리거 하는 IInterestEnter 및 IInterestExit 인터페이스를 구현할 수 있습니다.

AoIPlayer에서 사용하는 코드는 다음과 같습니다:

C#

public void InterestEnter(PlayerRef player)
{
    if (Runner.LocalPlayer != player || !Runner.GetVisible())
        return;

    gameObject.SetActive(true);
}

public void InterestExit(PlayerRef player)
{
    if (Runner.LocalPlayer != player || !Runner.GetVisible())
        return;

    gameObject.SetActive(false);
}

관심 영역에 객체가 들어올 때 해당 객체가 로컬 플레이어의 것이 아닌지, 러너가 보이는지 확인합니다. 둘 다 참이면 GameObject.SetActive(true)로 표시됩니다. GameObject.SetActive(false) 호출을 제외하고 종료 시에도 동일하게 수행됩니다.

유성이 플레이어의 관심 영역을 벗어나면 비활성화됩니다.
노트: NetworkRunner가 객체에 대해 상태 권한을 가지면 항상 해당 객체에 관심을 갖게 됩니다. 예를 들어 공유 모드에서 SharedModeMasterClient는 모든 유성에 대해 상태 권한을 가지므로 관심 영역을 절대 떠나지 않습니다. 반면 클라이언트/호스트 모드에서는 호스트가 모든 네트워크 객체에 관심을 갖게 됩니다.

컨트롤

다음 컨트롤은 현재 입력을 제공하는 모든 NetworkRunner의 비행선을 제어합니다:

  • 회전: AD
  • 앞 & 뒤: WS
  • 수직 이동: 위 화살표아래 화살표

타사 에셋

여기에 사용된 우주선 및 유성 에셋은 Quaternius의 만든 Ultimate Space Kit의 일부이며 CC0 1.0 라이선스가 부여됩니다.

스카이 박스는 다음에 의해 제공되었습니다: https://opengameart.org/content/space-skyboxes-0 및 CC0 1.0 라이선스.

Back to top