This document is about: QUANTUM 2
SWITCH TO

입력 & 컴포넌트 요구

실제 플레이어의 경우 시뮬레이션에 가치를 제공하는 방법에는 두 가지가 있습니다.

  1. 모든 시뮬레이션 프레임에 대해 폴링 되는 Quantum.Input 데이터 구조체
  2. 결정론적 명령

입력 요구

AI 플레이어는 시뮬레이션 내에서 완전히 실행되므로 명령을 전송할 수 없습니다. 이 문제를 해결하기 위해 FPS 템플릿은 모든 소스의 입력을 결합하는 InputDesires 데이터 구조체를 도입했습니다. 입력이 InputDesires 구조체로 결합되면 엔티티 컨트롤러의 처리에 사용할 수 있으며 즉시 작업을 호출할 수 있습니다. 그러나 이 접근 방식은 입력 값을 가로채거나 재정의하는 것을 고려하지 않습니다. 예를 들어 활성 기능이 이동 방향을 재정의하는 경우입니다.

컴포넌트 요구

입력 요구의 가로채기 및 오버라이드 동작을 처리하기 위해 FPS 템플릿은 컴포넌트 요구의 개념을 사용합니다. 일반적인 재사용 가능한 기능을 가진 각 컴포넌트는 동일한 데이터 구조를 가지고 있습니다. 예를 들어 Movement 컴포넌트는 일치하는 MovementDesires 구조체를 갖고 있으며 Weapons 컴포넌트는 WeaponsDesires를 갖고 있습니다.

입력에서부터 게임플이이 액션까지

다음 그림은 입력 동작에서 게임 플레이 동작으로 이어지는 데이터 흐름입니다.

fps template input data flow
FPS 템플릿 입력 데이터 흐름

플레이어용 입력 요구

모바일 입력을 생성하고 인터셉트를 포함한 게임 플레이 동작으로 변환하는 전체 프로세스는 다음과 같은 단계로 구성됩니다(입력과는 관련이 없는 코드 경로는 생략):

  1. 플레이어가 화면을 터치합니다.
  2. 유니티 프레임 시작 시 InputSystem 그리고 EventSystem이 업데이트되며, 이 업데이트는 입력 동작과 UI 이벤트 핸들러를 호출합니다.
  3. 호출된 입력 동작의 값은 전송할 명령을 포함한 InputSystemInput 클래스에 로컬로 캐시 됩니다.
  4. GameplayInputQuantum.Input 데이터 구조체에 로컬로 캐시되고 3단계의 데이터를 기준으로 값을 업데이트합니다. 이 단계에서 업데이트를 실행하는 서비스에 의해 명령 전송이 트리거 됩니다.
  5. Quantum 시뮬레이션은 입력을 폴링 합니다 - GameplayInputQuantum.Input은 로컬로 캐시 됨. 이후 캐시 된 입력이 소프트 리셋됩니다. 주의: 시뮬레이션에서 여러 프레임에 대한 입력을 폴링할 수 있습니다. 자세한 내용은 캐싱 페이지를 참조하십시오.
  6. Quantum 프레임 시작 시 ResetComponentDesiresSystem이 업데이트되어 모든 컴포넌트 요구를 효과적으로 기본 상태로 재설정합니다.
  7. PlayerSystem 그리고 Player 컴포넌트를 업데이트하고 Quantum.Input과 결정론적 명령을 InputDesires로 변환합니다.
  8. 구현된 경우 IInputController.ProcessInputDesires() 는 제어된 엔티티(플레이어의 엔티티가 아닙니다!)의 컨트롤러에서 호출됩니다. 컨트롤러는 InputDesires 처리를 담당하며 엔티티의 내부 상태를 확인하고 컴포넌트 요구에 값을 설정하거나 원하는 작업을 즉시 호출합니다.
  9. PreProcessComponentDesires() 인터페이스를 구현하는 모든 엔티티 컨트롤러에서 IPreProcessComponentDesiresController가 호출됩니다. 이를 통해 컨트롤러는 다음 시스템 중 하나를 업데이트하기 에 컴포넌트 요구에 특정 값을 설정할 수 있습니다(정확한 순서는 SystemSetup.cs 확인). 예를 들어 소유자의 룩 방향을 잠그는 Dash 기능이 있습니다. 즉, 각 프레임이 활성 상태인 한 특정 회전으로 LookDesires.LookRotation을 오버라이드 합니다.
  10. 초기/비조치 시스템(엔티티를 생성/파괴하지 않고 위치, 회전 등만 계산 및 업데이트)은 해당 컴포넌트 요구 사항에 따라 업데이트됩니다. 예, 속성, 이동(MovementDesires), 룩(LookDesires) 등...
  11. IPostProcessComponentDesiresController 인터페이스를 구현하는 모든 엔티티 컨트롤러에서 PostProcessComponentDesires()가 호출됩니다. 이를 통해 컨트롤러는 컴포넌트 요구에 특정 값을 설정할 수 있습니다. 이후 가장 최신의 계산은 이전 시스템에 의해 수행되며 다음 시스템 중 하나가 업데이트되기 전에 수행됩니다(정확한 순서는 SystemSetup.cs 확인). 이미 업데이트된 시스템과 관련된 요구를 설정하면 효과가 없습니다. 예를 들어, 효과가 지속되는 동안 WeaponsDesires.Fire를 오버라이드 하여 false로 함으로써 소유자가 총을 쏘지 못하도록 하는 효과로 사용될 수 있습니다.
  12. 지연/행동 시스템은 해당 컴포넌트의 요구에 따라 업데이트됩니다; 여기에는 효과, 발사체, 액터, 무기(WeaponsDesires), 능력(AbilitiesDesires) 등.
fps template input desires for player
플레이어용 FPS 템플릿 입력 요구
이 그림은 플레이어의 입력 처리와 관련된 시스템 및 메소드의 실행 순서(우선 왼쪽 => 오른쪽, 위쪽 => 아래쪽)를 보여줍니다.

AI 용 입력 요구

다음 그림은 AI 에이전트의 입력 처리와 관련된 시스템 및 메소드의 실행 순서(우선 왼쪽 => 오른쪽, 위쪽 => 아래쪽)를 나타냅니다.

fps template input desires for ai
AI 용 FPS 템플릿 입력 요구
다음은 플레이어에 대한 입력 요구와의 주요 차이점입니다:
  1. InputDesires 구조체는 Player 컴포넌트 대신 AI 컴포넌트 내부에 저장됩니다.
  2. AI 입력을 InputDesires로 생성하기 위해 Input 구조체와 Player.ProcessInput() 내의 명령어로 변환하는 대신 HFSM이 실행됩니다.
  3. 모든 로직은 단일 엔티티의 컴포넌트 및 컨트롤러에서 실행됩니다. 반면, Player 컴포넌트(플레이어 엔티티)는 제어 엔티티(일반적으로 행위자)의 컨트롤러로 입력을 전달합니다.
Back to top