This document is about: FUSION 2
SWITCH TO

플레이어

개요

Player(Player 스크립트, Player 프리팹)는 게임에 연결된 피어를 나타내며 시각적 요소가 없습니다. Player는 UserID, 닉네임, 선택한 캐릭터 및 Agent(게임 세계에 생성된 시각적 표현)의 리스폰 후에도 유지되어야 하는 기타 데이터와 같은 공통 메타데이터에 접근할 수 있게 합니다.

Agent(Agent 스크립트, AgentBase 프리팹 및 그 변형)은 플레이어가 조종하는 게임 내 캐릭터를 나타냅니다. GameplayMode에 의해 생성되며, Health, Weapons 및 기타 컴포넌트를 가지고 있습니다. 캐릭터는 필요에 따라 생성 및 제거됩니다.

아래 다이어그램은 실행 계단식으로서의 컴포넌트 계층을 보여줍니다:

agent components

입력 처리

아래 다이어그램은 입력 처리와 액션 실행을 보여줍니다:

input processing

설명:

  1. Frame: 유니티 프레임 번호(UnityEngine.Time.frameCount). 프레임 101과 102는 가독성을 위해 불완전하게 표시되었습니다.
  2. 각 프레임의 시작 시, 장치로부터 입력이 ProcessFrameInput()에서 수집되고 Render Input 데이터 구조에 기록됩니다(입력 권한만 해당).
  3. 동일한 입력이 Accumulated Input에도 누적됩니다(예: 회전 델타 보기).
  4. 누적된 델타 시간이 다음 고정 틱을 시뮬레이션하기에 충분히 크면(프레임 103):
    • Accumulated InputNetworkEvents.OnInput() 콜백을 통해 폴링/소모됩니다.
    • Fusion에서 플레이어 입력이 BeforeTick()에서 읽히고, Fixed Input에 저장됩니다(입력 및 상태 권한에서 실행).
    • AgentInput.FixedUpdateNetwork() 호출이 Agent.EarlyFixedUpdateNetwork()로 전달되며, 이 호출은 Fixed Input을 사용하여 움직임을 처리합니다. 이를 통해 현재 시뮬레이션 틱에서 다른 에이전트들이 총을 쏘기 전에 모두 움직일 수 있습니다.
    • Agent.FixedUpdateNetwork()Fixed Input을 읽고 사격을 처리합니다.
    • AgentInput.Render() 호출이 Agent.EarlyRender()로 전달되며, 이 호출은 Render Input(또는 Accumulated Input도 사용 가능)을 사용하여 렌더 예측된 움직임과 회전 보기를 처리합니다.
    • Agent.Render()는 렌더 예측된 사격 입력을 처리하지 않습니다. 이는 이 샘플의 범위를 벗어납니다. 사격은 고정 시뮬레이션에서만 이루어집니다.
  5. 누적된 델타 시간이 다음 고정 틱을 시뮬레이션하기에 충분하지 않으면(프레임 101, 102)
    • AgentInput.Render() 호출이 Agent.EarlyRender()로 전달됩니다(가독성을 위해 위 그래프에는 표시되지 않음). 이 호출은 Render Input(또는 Accumulated Input도 사용 가능)을 사용하여 렌더 예측된 움직임과 회전 보기를 처리합니다.

이 다이어그램은 단순화된 버전으로 모든 예외 상황을 다루지는 않습니다. 자세한 내용은 문서화된 코드를 참조하십시오.

회전 보기 스무딩

BR200은 어떤 조건에서도 부드러운 회전 보기를 위한 사용자 정의 솔루션을 제공합니다.

다음 로그는 일반 하드웨어(125Hz 속도로 폴링 된 마우스)를 사용할 때와 높은 렌더링/출력 새로 고침 속도(200+ FPS)를 사용할 때 원시 입력에서 발생하는 에일리어싱 문제를 보여줍니다. CPU/GPU가 아무리 좋아도 렌더링 된 출력은 항상 떨림을 느끼게 됩니다.

look rotation smoothing

이 문제를 해결하기 위해 입력 값은 타임스탬프와 함께 기록되며, 현재 프레임에 대한 값은 정의된 시간 범위의 평균값으로 계산됩니다(BR200은 기본적으로 25ms 창을 사용). 이로 인해 매우 부드러운 인식 경험이 제공되지만(특히 고속 새로 고침 모니터에서 눈에 띄게 느껴짐), 약간의 입력 지연이 발생합니다. 더 높은 샘플링 속도의 하드웨어를 사용하면 스무딩 창을 최소화할 수 있습니다.

다음 그래프는 시간에 따른 원시 마우스 델타(하단 선)와 캐릭터 회전 보기(상단 선)를 보여줍니다:

look rotation smoothing

다음 그래프는 시간에 따른 스무딩 된 마우스 델타(하단 선)와 캐릭터 회전 보기(상단 선)를 보여줍니다:

look rotation smoothing

이는 또한 샘플링 오류(책상 표면)와 불균일한 손/마우스 움직임(책상 마찰, 근육)에 의해 발생하는 미세한 떨림을 줄이는 데 도움을 줍니다.

캐릭터 애니메이션

이 프로젝트는 Playables API를 기반으로 한 사용자 정의 애니메이션 컨트롤러 구현을 포함합니다. 이 컨트롤러는 틱-정확한 애니메이션 평가와 동적 성능 조정을 지원합니다.

다음 다이어그램은 Mecanim과 유사한 아키텍처를 보여줍니다:

animation controller

에이전트의 객체 계층에서 설정된 애니메이션 레이어와 상태:

animation layers

애니메이션 레이어:

  • Locomotion: 이동을 위한 기본 전체 몸체 레이어
  • FullBody: Locomotion과 혼합되는 전체 몸체 동작을 위한 오버라이드 레이어
  • LowerBody: 하반신 캐릭터 회전을 위한 오버라이드 레이어
  • UpperBody: 상반신 동작을 위한 오버라이드 레이어, 보통 Locomotion과 혼합됨
  • Shoot: 손동작(사격)을 위한 오버라이드 레이어, 보통 Locomotion과 혼합됨
  • Look: 위아래를 바라보는 상반신을 위한 애드온 레이어

애니메이션 컨트롤러의 복잡성에 따라 200명의 플레이어를 평가하는 것은 서버에서 쉽게 병목 현상이 될 수 있습니다. 성능을 개선하기 위해 서버는 연결된 플레이어 수에 따라 매 n번째 프레임마다 PlayableGraph 평가를 인터레이스 방식으로 허용합니다. 레이어나 상태 가중치와 같은 모든 중요한 속성은 여전히 매 프레임마다 계산됩니다. 다음 표는 인터레이스 평가 규칙을 보여줍니다.

연결된 플레이어 수 PlayableGraph 평가
> 150 6번째 프레임마다
> 100 4번째 프레임마다
> 50 2번째 프레임마다
그 외 매 프레임마다
이 프로젝트는 일반 리그로 구운 애니메이션을 사용합니다. 휴머노이드 리그를 사용하는 경우 리타게팅으로 인해 추가적인 성능 오버헤드가 발생할 수 있습니다.

캐릭터 컨트롤러

이 샘플은 이동을 위해 Fusion KCC(고급 키네마틱 캐릭터 컨트롤러 애드온)을 사용합니다. 이는 성능, 게임 플레이 상호작용, 그리고 커스터마이징에 중점을 둔 일반적인 저 수준 캐릭터 컨트롤러입니다.

Fusion KCC의 특징:

  • 위치 및 회전 보기 제어(피치 + 요)
  • 캡슐 콜라이더로 정의된 모양
  • 로컬 플레이어를 위한 예측된 렌더링 이동
  • 동적(물리적인) 및 키네마틱(비현실적인) 속도 기반 이동의 결합
  • 폭발, 이동 플랫폼 등에서 발생하는 외부 힘
  • 이동 가속 및 마찰
  • 커스터마이징을 위한 고급 KCC 프로세서 파이프라인(속도 및 방향 재정의, 차단)
  • 기본 속성에 대한 네트워크 동기화(반지름, 높이, 질량 등), 다른 속성의 선택적 동기화
  • 사용자 정의 콜라이더 필터링 및 무시 목록
  • CCD(연속 충돌 감지)
  • 충돌 콜백
  • 지면 스냅 및 계단 높이 지원
  • 로컬 모드 지원(네트워크 트래픽 없음)
  • 네트워크 및 성능 최적화
  • 플랫폼 독립적, 모바일 친화적
  • 프레임별 디버그에 대한 기본 지원 - 에디터 드로잉 및 로깅

플레이어의 체력이 특정 임곗값 이하로 떨어지고 현재 전투 중이 아니면, 자동 치유가 활성화되어 플레이어의 체력을 회복시킵니다.

제트팩

제트팩은 연료를 소모하면서 비행하고 빠르게 레벨을 탐색할 수 있는 기능을 제공합니다. 연료는 아이템 상자에서 발견되는 연료 캔을 주워서 보충할 수 있습니다.

제트팩의 상태는 연료 소비, 프로펠러, 사운드, 켜짐/꺼짐 상태를 처리하는 Jetpack 스크립트에 의해 관리됩니다. 실제 공중 이동은 JetpackKCCProcessor에 의해 처리됩니다. 이 스크립트는 KCC 속도를 재정의하고 기본 동작을 억제합니다.

jetpack

관전자 모드

플레이어가 제거되거나 게임에 너무 늦게 합류한 경우, 관전자 모드로 들어갑니다. 관전자 모드에서는 플레이어가 다른 플레이어의 시점을 관찰할 수 있습니다. 코드에서는 실제로 간단하게 처리됩니다. 카메라와 UI는 SceneContext에 할당된 ObservedAgent를 기준으로 작동합니다. ObservedAgent는 로컬 플레이어 에이전트일 수도 있고, 관찰 중인 플레이어 에이전트일 수도 있습니다.

Back to top