관심 영역 & 멀티-피어
개요
이 샘플 프로젝트는 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
창과 유사한 정보가 포함된 다른 메뉴로 이동합니다.
- 러너 가시성, 입력 및 통계: 클라이언트가 생성되면 이 목록은 사용 가능한 네트워크 러너 수를 반영하도록 채워집니다.
- 가시성: 눈으로 표시되는 토글링 가시성은
NetworkRunner.SetVisiblity
메소드를 실행했으며 네트워크 객체들에 연결된EnableOnSingleRunner
컴포넌트에 설정된 다양한 컴포넌트를 활성화 또는 비활성화합니다. 시프트를 누른 상태에서 이 버튼을 왼쪽 클릭하면 선택한 NetworkRunner가 격리되고 다른 컴포넌트는 숨깁니다. - 입력: 게임 패드로 표시되는 토글링 입력은
NetworkRunner.ProvideInput
속성을 설정합니다. 입력을 제공하지 않으면GetInput
메소드가 인식되지 않습니다. 이 입력은 한 클라이언트에 대해서만 제공됩니다. 시프트를 누른 상태에서 이 버튼을 클릭하면 선택한 것을 제외한 모든 NetworkRunner의 입력이 꺼집니다. - 통계: 이를 클릭하면 선택한 NetworkRunner와 관련된 Fusion 통계 창이 나타납니다. Fusion 통계에 대한 자세한 내용은 여기에서 읽을 수 있습니다.
- 가시성: 눈으로 표시되는 토글링 가시성은
멀티-피어
네트워크 프로젝트 구성 설정
네트워크 프로젝트 구성 에셋
의 기본 설정에 대한 몇 가지 변경 사항을 알아둘 필요가 있습니다. 먼저 멀티 피어 모드가 작동하려면 Peer Mode
를 Multiple
로 설정해야 합니다. 다음 그림과 같이 Replication Features
를 Scheduling and Interest Management
로 설정해야 합니다:
NetworkRunner 설정
NetworkRunner
가 멀티-피어 및 AoI 기능과 제대로 작동하려면 클라이언트당 인스턴스화되는 NetworkRunner
프리팹에 추가해야 하는 몇 가지 컴포넌트가 있습니다.
- 러너 가시성 활성화: 이렇게 하면 연관된 NetworkRunner를 적절한 확장자와 함께 자동으로 등록하고 로드된 씬 개체와 생성된 객체를 피어의 가시성 처리와 함께 연결합니다.
- 러너 AoI 기즈모: 이 컴포넌트는 서버 관심 영역 및 플레이어 셀과 같은 관심 영역 정보를 나타내는 기즈모를 그립니다. 기즈모를 사용하기 때문에 이 정보는 편집기에서만 볼 수 있습니다.
- 러너 AoI 디스플레이: 이 컴포넌트는 이 샘플을 위해 특별히 제작되었으며 Runner AoI 기즈모 컴포넌트를 통해 제공된 동일한 정보를 보여주지만 앞서 언급한 정보를 표시하기 위해 게임 객체 풀을 사용하여 이를 수행합니다. 그러나 이 컴포넌트와 Runner AoI 기즈모는 모두 디버깅 목적이며 AoI 기능을 테스트할 때만 사용해야 합니다.
- Fusion 통계: 이 컴포넌트는 이 NetworkRunner에 대한 특정 정보를 표시하는 게임 객체를 생성합니다. 시작 시 비활성화되어 있어 바로 열리지 않습니다. 여기에서 Fusion 통계 도구에 대한 자세한 내용을 읽을 수 있습니다.
NetworkObject 설정
기본적으로 멀티-피어 모드를 실행하면 NetworkRunner의 가시성에 관계없이 모든 클라이언트에서 NetworkObjects
가 활성화됩니다. 이를 해결하기 위해 EnableOnSingleRunner
컴포넌트가 이 개체에 추가됩니다.
이 컴포넌트에는 보이는 네트워크 러너에서만 활성화해야 하는 컴포넌트 집합이 할당됩니다. 예를 들어 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의 비행선을 제어합니다:
- 회전:
A
및D
- 앞 & 뒤:
W
및S
- 수직 이동:
위 화살표
및아래 화살표
타사 에셋
여기에 사용된 우주선 및 유성 에셋은 Quaternius의 만든 Ultimate Space Kit의 일부이며 CC0 1.0 라이선스가 부여됩니다.
스카이 박스는 다음에 의해 제공되었습니다: https://opengameart.org/content/space-skyboxes-0 및 CC0 1.0 라이선스.
Back to top