스페이스
스페이스
스페이스 그리고 매치메이킹
사용자가 갈 수 있는 각각의 장소를 "스페이스"라고 부릅니다.
사용자는 공용 스페이스에 참여하거나 같은 "그룹"에 속한 모든 사용자로 제한된 스페이스인 개인 스페이스에 참여할 수 있습니다.
지정된 스페이스/그룹 쌍에 대해 너무 많은 사용자가 같은 룸에 있는 경우, 추가 사용자는 계속 연결할 수 있지만 새 룸으로 라우팅 됩니다.
이 로직은 Fusion 매치메이킹 기능으로 구현되었습니다.
사용자가 가입하고자 하는 스페이스 및 그룹은 세션 속성으로 설명됩니다(참고: 메타버스 속성을 사용하여 필요한 경우 더 많은 필터링이 가능하지만, 전체 로직은 동일). 그러면, 러너에게 주어진 시작 게임 인수에 명시적인 룸 이름이 제공되지 않으므로, 매치메이킹 시스템은 공간 id/group id 필터와 일치하는 세션으로 사용자를 라우팅합니다. 처음 만들어진 룸이 꽉 차면 다른 룸이 생성되고 다른 사용자가 참여하여 더 이상의 사용자가 연결하지 못하도록 방지하면서 혼잡한 스페이스를 처리할 수 있습니다.
이 로직은 룸 이름 대신 세션 속성을 사용하도록 ConnectionManager
를 구성하는 SpaceRoom
클래스에서 처리됩니다.
그룹 스위칭
SpaceRoom
은 또한 그룹 전환을 처리합니다: 사용자가 개인 그룹에 참여하고 싶을 때(또는 개인 그룹을 떠나 공개 그룹에 참여하고 싶을 때), SpaceRoom
은 다음과 같은 방식으로 처리합니다:
- 요청된 그룹 ID를
Playerprefs
에 저장합니다 - 사용자의 현재 위치를
Playerprefs
(SceneSpawnManager
컴포넌트를 통해)에 저장합니다 - 뷰가 흐려집니다
- 장면을 다시 로드합니다
SpaceRoom
은ConnectionManager
에게 매치메이킹 API에서 세션 속성으로 사용할 그룹 ID를 제공합니다- 씬 로드 중에 사용자는
SceneSpawnManager
컴포넌트에 의해 이전에 저장된 위치에 배치됩니다
SpaceDescription
Space ID는 인스펙터의 SpaceRoom
컴포넌트에 설정하거나 SpaceDescription
을 작성하여 제공할 수 있습니다.
SpaceDescription
은 스크립트가 가능한 객체로, 필드는 다음과 같습니다:
spaceId
: 각 공간을 고유하게 식별하고, 이 공간에 적합한 퓨전 룸으로 사용자를 라우팅할 세션 속성을 'SpaceRoom' 구성 요소에 채우는 기술 데이터 필드.sceneName
: 플레이어가 이 스페이스에 합류할 때 반드시 로드해야 하는 유니티 씬.spaceName
: 스페이스의 이름. 스페이스 사이의 포탈 패널에 로드됩니다. ID로 사용되지 않고 프레젠테이션 텍스트로만 사용됩니다.spaceDescription
: 스페이스에 대한 설명. 스페이스 사이의 포탈 패널에 적재되어 사용자에게 대상 스페이스의 용도를 설명합니다.spaceParam
: 선택적인 기술 데이터. 여러 스페이스에서 동일한 씬을 사용할 때 씬에 파라미터를 제공하기 위해 나중에 사용합니다.spaceSecondaryParam
: 선택적인 기술 데이터. 여러 스페이스에서 동일한 씬을 사용할 때 씬에 파라미터를 제공하기 위해 사용됩니다.
다른 스페이스에 참여
다른 스페이스에 참여하는 것은 SpaceLoader
컴포넌트에 의해 처리됩니다. 스페이스에 전체 SpaceDescription
을 제공하거나 단순한 필요를 위해 space id 문자열만 제공할 수 있습니다.
어떤 유니티 씬을 로드할지 알기 위해, SpaceLoader
는 SpaceDescription
필드에 제공된 씬을 읽을 수 있습니다. 또는, 단순한 경우에는 씬 이름이 직접 제공된 space id 문자열과 동일하다고 가정합니다.
SwitchScene()
메소드가 호출되면 대상 씬을 로드하여 스페이스 변경이 발생합니다. 이 메소드는 다음과 같습니다:
- 먼저 현재 Runner를 종료합니다
SpaceRoom.RegisterSpaceRequest()
를 사용하여 요청된SpaceDescription
을 기록합니다. 그러면 들어오는 씬의SpaceRoom
스페이스 설명은 무시되고 이SpaceLoader
에 저장된SpaceDescription
과 정확히 일치하는지 확인하도록 변경됩니다. 현재 샘플 상태와 같은 단순한 스페이스 구성에는 필요하지 않지만 하나의 유니티 씬을 여러 스페이스에 사용하는 보다 발전된 시나리오를 구현할 수 있습니다.- 그런 다음 새 유니티 씬을 로드합니다.
C#
private async void SwitchScene()
{
...
await runner.Shutdown(true);
Debug.Log("Loading new scene " + SceneName);
SpaceRoom.RegisterSpaceRequest(spaceDescription);
SceneManager.LoadScene(SceneName, LoadSceneMode.Single);
}
다른 스페에스에서 올 때 스폰 지점
SpaceLoader
컴포넌트는 autoRegisterAsReturnPoint
가 true일 경우 returnPosition
을 제공해 허브 씬이 직접 로드됐을 때와 다른 씬에 참여했다가 돌아올 때 플레이어의 스폰 지점을 구분할 수 있습니다.
사용자가 (스페이스 A와 관련된) 현재 씬에 합류할 때, SpaceLoader
가 목표로 하는 스페이스(스페이스 B)에 있는 직후에, 사용자는 스페이스 B로 이어지는 스페이스 로더와 관련된 returnPosition
트랜스폼에서 스폰 됩니다. 이는 스페이스 B와 관련된 리턴 위치를 사용자 스폰 위치를 처리하는 SceneSpawnManager
에 제공함으로써 수행됩니다.
데모
사용법을 설명하기 위해 데모 씬은 Assets\Photon\FusionAddons\Spaces\Demo\Scenes\
폴더에서 찾을 수 있습니다.
각 씬에는 두 개의 포털이 있으며 플레이어가 입력하면 SpaceLoader
컴포넌트 덕분에 각 포털에 새로운 스페이스가 로드됩니다.
또한 PortalSpaceDescriptionLoader
스크립트는 포털 패널에 스페이스 속성을 표시합니다.
다운로드
이 애드온은 최신 버전의애드온 프로젝트에 포함되어 있습니다.
지원하는 토폴로지
- 공유 모드
변경 내역
- 버전 1.0.3: 데모 스크립트 이름 변경
- 버전 1.0.2: ConnectionManager 네임스페이스 수정으로 인한 수정
- 버전 1.0.1: 데모 씬 + 네임스페이스 추가
- 버전 1.0.0: 최초 릴리즈