씬 서비스
개요
씬 서비스는 씬의 특정 문제/기능 요건을 해결하는 씬 관련 시스템입니다. 씬 서비스는 완전히 선택 사항으로 설계되어 있습니다(일부는 다른 서비스에 의존할 수도 있음). 따라서 씬마다 고유한 씬 서비스를 설정할 수 있습니다. 씬에는 최대 한 개의 활성 서비스 인스턴스가 있습니다. 씬 서비스는 연결된 씬만큼 오래 지속됩니다.
SceneService
는 단일 SimulationContext
인스턴스를 참조하고 다음 멤버들을 구현하기 위해 준비됩니다.
Scene
:SceneDirector
의 참조Context
: 현재 등록된SimulationContext
의 참조SetContext()
: 로컬로SimulationContext
를 캐시하고OnSetContext()
호출ClearContext()
:OnClearContext()
를 호출하고 로컬에 캐시된SimulationContext
제거OnInitialize()
: 가상 함수, 씬 서비스 초기화 단계에서 씬 로드 후 호출OnDeinitialize()
: 가상 함수, 씬 초기화 단계에서 씬 언로드 전에 호출OnSetContext()
: 가상 함수, 일반적으로 Quantum 시뮬레이션을 시작한 후SetContext()
에서 호출됩니다. 컨텍스트는 단일 씬에서 여러 번 전환 가능OnClearContext()
: 가상 함수, 일반적으로 Quantum 시뮬레이션이 수행되거나 씬 언로드 전에ClearContext()
에서 호출
다음 코드는 사용 방법을 보여줍니다:
C#
public unsafe sealed partial class SceneAudio : SceneService
{
protected override void OnInitialize()
{
// One-time initialization
_musicAudioSource = GetComponent<AudioSource>();
_musicAudioSource.enabled = true;
}
protected override void OnDeinitialize()
{
// Clean-up
StopAllCoroutines();
_currentPlayingSetup = null;
_playMusicRoutine = null;
_stopMusicRoutine = null;
_musicAudioSource.enabled = false;
}
protected override void OnSetContext()
{
// Subscribe events, refresh the service based on current gameplay state - to correctly synchronize game => replay => game switches
Context.Events.GameplayStateChanged += OnGameplayStateChanged;
OnGameplayStateSet(Context.VerifiedFrame.Gameplay->CurrentState);
}
protected override void OnClearContext()
{
// Unsubscribe events
Context.Events.GameplayStateChanged -= OnGameplayStateChanged;
}
}
자세한 내용은 FPS 템플릿 매뉴얼의 게임 아키텍처 섹션에 있는 SimulationContext
페이지를 참조하십시오.
UI
SceneUI
는 UI 관리를 담당합니다. 이것은 UIViews
와 UIWidgets
의 상호 연결된 모음집입니다. SimulationContext
전환의 경우 활성 SimulationContext
가 이러한 형식으로 전달되고 각 UIView
인스턴스는 주어진 시뮬레이션 상태에 따라 내부 상태를 올바르게 동기화합니다.
구체적인 구현은 씬에서 도출되었습니다.UI는 활성 씬에 추가 로드되는 별도의 씬 활성 씬의 SceneUI
에는 특정 씬에 필요한 UIViews
목록이 포함되어 있습니다. 각 뷰는 팀 친화적인 워크플로우의 프리팹으로 제공됩니다. 특정 게임 상태나 플랫폼(모바일/VR 등)에 대해 어떤 UIViews
가 표시되어야 하는지 정의할 수도 있습니다. 예를 들어, GameplayUI
는 제공된 시뮬레이션에서 게임 플레이 상태를 조사합니다.
다음 다이어그램은 FPS 템플릿에 포함된 기본 UI 구성을 보여줍니다.
입력
SceneInput
은 능동적인 플랫폼 입력 관리, 입력 동작 등록, 원하는 동작 실행 및 Quantum 시뮬레이션에 입력 값 제공을 담당합니다.
다음 그림은 다양한 씬과 입력 장치에 대한 입력 처리 방식을 보여줍니다.
매치메이킹
SceneMatchmaking
은 게임 디자인의 관점에서 매치메이킹 과정을 진행하는 역할을 합니다(예: 플레이어가 새로운 매치를 만들기 전에 매치에 참여하려고 하는 기간). 이 서비스는 임의의 매치를 결합하거나 만들 수 있는 기본적인 매치메이킹 기능을 제공합니다.
FPS 템플릿은 두 가지 서비스 변형을 지원합니다. 이러한 항목은 SceneMatchmaking
에서 파생되었으며 사용자 지정 구현을 위해 재정의되어야 합니다.
MenuMatchmaking
: 특정 씬이 로드되기 전에 메뉴에서 매치메이킹이 발생합니다.GameplayMatchmaking
: 이미 로드된 게임 씬에서 매치메이킹이 이뤄집니다. 이것은 매치메이킹 규칙에 반영됩니다.
다음 다이어그램은 메뉴 씬의 매치메이킹 프로세스의 간단한 예입니다.
다음 다이어그램은 게임 씬에서 발생하는 보다 복잡한 매치메이킹 프로세스의 예제입니다:
카메라
SceneCamera
는 카메라의 적극적인 관리와 전환을 책임지고 있습니다. 모든 카메라는 특정 CameraBehavior
구현의 결과로 정의됩니다. 한 번에 하나의 CameraBehavior
만 활성화할 수 있습니다. 기본적으로 FPS 템플릿은 다양한 CinemachineVirtualCamera
설정 및 간단한 전환을 통해 공유된 CameraBehavior
구현을 사용합니다.
다음 다이어그램에는 FPS 템플릿에 포함된 카메라 타입/행동이 나와 있습니다.
캐시
SceneCache
는 런타임 프리팹 풀링을 담당합니다. 정적 구성(드래그 & 드롭 프리탭 및 편집기의 설정 횟수), 런타임 준비, 인스턴스 제한 및 인스턴스가 여전히 시각적인 행동이 실행 중인 경우 지연된 리턴을 지원합니다.
C#
GameObject impactInstance = Context.Scene.Cache.Get(_impact);
if (impactInstance != null)
{
Context.Scene.Cache.ReturnDeferred(impactInstance, 1.0f);
}
오디오
SceneAudio
는 음악 재생과 음향 효과를 담당합니다. 특정 게임 플레이 상태에 따라 다른 오디오 클립을 정의할 수도 있습니다.