스페이스
스페이스
스페이스 및 매치메이킹
사용자가 갈 수 있는 각 장소를 "스페이스"라고 합니다.
사용자는 공용 스페이스에 가입하거나 개인 스페이스, 즉 동일한 "그룹"에 있는 모든 사용자로 제한된 스페이스에 가입할 수 있습니다.
지정된 스페이스/그룹 쌍에 대해 동일한 룸에 너무 많은 사용자가 있는 경우 추가 사용자는 여전히 연결할 수 있지만 새 룸으로 라우팅 됩니다.
이 로직은 Fusion 매치메이킹 기능으로 구현됩니다.
사용자가 가입하고자 하는 스페이스와 그룹은 세션 속성(노트: 메타버스 속성은 필요한 경우 더 많은 필터링을 허용하기 위해 사용되기도 하지만, 메타버스 속성이 없으면 전체 로직은 동일합니다.). 그런 다음, 플레이어에게 주어진 시작 게임 인수에 명시적인 룸 이름이 제공되지 않으므로, 매치메이킹 시스템은 스페이스 ID/그룹 ID 필터와 일치하는 세션으로 사용자를 이동시킵니다. 만약 생성된 첫 번째 룸이 꽉 차면, 다른 룸이 생성되고 다른 사용자들이 이 룸에 가입하여 더 이상 사용자들의 연결을 방해하지 않고 혼잡한 스페이스를 처리할 수 있습니다.
이 논리는 SpaceRoom
클래스에서 처리되며, 이 클래스는 ConnectionManager
를 구성하여 룸 이름 대신 세션 속성을 사용합니다.
그룹 스위칭
SpaceRoom
은 또한 그룹 전환 처리합니다: 사용자가 개인 그룹에 가입하기를 원할 때(또는 개인 그룹을 떠나 공용 그룹에 가입하기를 원할 때):
- 요청한 그룹 ID를
Playerprefs
에 저장합니다 - 사용자의 현재 위치를
PlayerPrefs
(SceneSpawnManager
컴포넌트를 통해)에 저장합니다 - 뷰를 페이드아웃 합니다
- 씬들을 재로드합니다
SpaceRoom
은ConnectionManager
에게 매치메이킹 API에서 세션 속성으로 사용할 그룹 ID를 제공합니다- 씬 로딩 중에 사용자는
SceneSpawnManager
컴포넌트에 의해 이전에 저장된 위치에 배치됩니다
SpaceDescription
Space id는 인스펙터의 SpaceRoom
컴포넌트에 설정하거나 SpaceDescription
을 작성하여 제공할 수 있습니다.
SpaceDescription
은 스크립트로 작성 가능한 객체로, 다음과 같은 필드가 있습니다:
spaceId
: 기술 데이터 필드는 각 스페이스를 고유하게 식별하고, 사용자를 이 스페이스에 적합한 Fusion 룸으로 라우팅할 세션 속성을SpaceRoom
컴포넌트에 입력합니다.sceneName
: 플레이어가 이 스페이스에 합류할 때 반드시 로드해야 하는 유니티 씬.spaceName
: 스페이스의 이름입니다. 스페이스 사이의 포털 패널에 표시됩니다. id로 사용되지 않고 그냥 프레젠테이션 텍스트로 사용됩니다.spaceDescription
: 스페이스에 대한 설명입니다. 사용자에게 대상 스페이스의 목적을 설명하기 위해 스페이스 사이의 포털 패널에 로드됩니다.spaceParam
: 선택적인 기술 데이터. 여러 스페이스가 동일한 씬을 사용할 때 해당 씬에 파라미터를 제공하기 위해 미래에 사용할 수 있습니다.spaceSecondaryParam
: 선택적인 기술 데이터. 여러 스페이스가 동일한 씬을 사용할 때 해당 씬에 파라미터를 제공하기 위해 미래에 사용할 수 있습니다.
다른 스페이스에 참가하기
다른 스페이스에 참가하는 것은 SpaceLoader
컴포넌트에 의해 처리됩니다. SpaceDescription
전체를 제공하거나 단순한 필요를 위해 Space ID 문자열을 제공할 수 있습니다.
어떤 유니티 씬을 로드할지 알려면 SpaceLoader
는 SpaceDescription
필드에 제공된 씬을 읽을 수 있습니다. 또는 간단한 경우에는 씬 이름이 직접 제공된 Space ID 문자열과 동일하다고 가정합니다.
SwitchScene()
메소드가 호출되면 대상 씬을 로드하여 스페이스 변경이 발생합니다:
- 먼저 현재 러너를 종료합니다
- 요청한
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)에 도착한 직후에 SpaceLoader
와 관련된 리턴 위치 변환에서 스폰 됩니다. 이는 공간 B와 관련된 리턴 위치를 사용자의 스폰 위치를 처리하는 SceneSpawnManager
에 제공함으로써 수행됩니다.
의존성
- ConnexionManager 애드온
데모
사용법을 설명하기 위해 데모 씬은 Assets\Photon\FusionAddons\Spaces\Demo\Scenes\
폴더에서 확인할 수 있습니다.
각 씬에는 두 개의 포털이 포함되어 있으며 플레이어가 SpaceLoader
컴포넌트 덕분에 이 포털에 들어가면 각 포털은 새로운 Space
를 로드합니다.
또한 PortalSpaceDescriptionLoader
스크립트는 스페이스 속성을 포털 패널에 표시합니다.
다운로도
이 애드온의 최신 버전은 애드온 프로젝트에 포함되어 있습니다.
지원하는 토폴로지
- 공유 모드
변경 내역
- 버전 2.0.0: Fusion 2.0 지원
- 버전 1.0.3: 데모 스크립트 이름 변경
- 버전 1.0.2: ConnectionManager 네임스페이스 변경으로 인한 수정
- 버전 1.0.1: 데모씬 추가 + 네임스페이스 추가
- 버전 1.0.0: 최초 릴리즈