This document is about: FUSION 2
SWITCH TO

데이터 레이어

KCC 설정

KCC는 일부 속성을 기본 구성으로 컴포넌트 인스펙터에 표시합니다. 런타임에 값을 추가로 구성할 수 있습니다.

kcc settings
KCC 설정

네트워크 설정

이러한 설정은 기본적으로 네트워크를 통해 동기화되며, 서버의 변경 사항은 모든 클라이언트에 자동으로 전달됩니다. 클라이언트의 로컬 오버라이드는 다음 재시뮬레이션 틱 표시 전에 되돌릴 수 있습니다.

  • Shape - KCC 물리 행동 정의.
    • None - 내부 물리 쿼리를 건너뛰며, 콜라이더는 스폰 해제됩니다. 다른 로직은 실행할 수 있습니다.
    • Capsule - 물리 완전 처리, 캡슐 콜라이더는 게임 객체의 자식으로 인스턴스화됩니다.
  • Is Trigger - KCC 콜라이더가 트리거로 표기됩니다.
  • Radius - 콜라이더의 반지름.
  • Height - 콜라이더의 높이.
  • Extent - 주변 충돌기 탐지에 대한 추가 반지름 확장을 정의합니다. 낮은 값은 안정성을 저하시키고 추가 검사를 수행할 때 잠재적으로 성능에 영향을 미칩니다. 높은 값은 지속적인 성능 영향을 증가시키는 대가로 안정성을 증가시킵니다. 권장 범위는 반지름의 10-20%입니다.
  • Collider Layer - 콜라이더 게임 객체의 레이어.
  • Collision Layer Mask - KCC가 충돌하는 레이어 마스크.
  • Features - 기본 KCC 특징 구성 (런타임에 값이 재정의 될 수 있습니다). 특징 섹션에서 더 많은 정보를 확인하실 수 있습니다.
    • CCD - 입체 통과를 방지하기 위해 지속적인 충돌 감지를 가능하게 합니다.
    • Anti Jitter - 이동 거리 공차(변환에 적용되는 위치 델타)를 활성화합니다.
    • Prediction Correction - 예측이 잘못된 경우 원활한 수정이 가능합니다(고정 업데이트와 렌더 업데이트 모두에서 잘못된 예측을 해결함).
  • Allow Client Teleports - 클라이언트가 시작한 텔레포트 RPC를 실행할 수 있습니다.
  • Input Authority Behavior - 입력 권한이 있는 KCC에 대한 업데이트 동작을 정의합니다. 객체에 입력 권한과 상태 권한이 동시에 있는 경우 상태 권한 동작보다 우선합니다.
    • Predict Fixed | Interpolate Render - 고정 업데이트에서 전체 처리/예측, 렌더 업데이트에서 마지막으로 예측된 두 고정 업데이트 상태 사이의 보간(기본값).
    • Predict Fixed | Predict Render - 고정 업데이트에서는 전체 처리/예측, 렌더 업데이트에서는 전체 처리/예측.
  • State Authority Behavior - 상태 권한을 가진 KCC의 업데이트 동작을 정의합니다.
    • Predict Fixed | Interpolate Render - 고정 업데이트에서 전체 처리/예측, 렌더 업데이트에서 마지막으로 예측된 두 고정 업데이트 상태 사이의 보간(기본값).
    • Predict Fixed | Predict Render - 고정 업데이트에서는 전체 처리/예측, 렌더 업데이트에서는 전체 처리/예측.
  • Proxy Behavior - KCC 프록시에 대한 업데이트 동작을 정의합니다.
    • Skip Fixed | Interpolate Render - 고정 업데이트에서 처리를 건너뜁니다. 렌더 업데이트에서 서버 상태 스냅샷 간의 보간(기본값).
    • Interpolate Fixed | Interpolate Render - 고정 업데이트에서 서버 상태 스냅샷 간의 보간, 렌더 업데이트에서 서버 상태 스냅샷 간의 보간.
    • Predict Fixed | Interpolate Render - 고정 업데이트에서 전체 처리/예측, 렌더 업데이트에서 마지막으로 예측된 두 고정 업데이트 상태 사이의 보간.
    • Predict Fixed | Predict Render - 고정 업데이트에서는 전체 처리/예측, 렌더 업데이트에서는 전체 처리/예측.

로컬 설정

이러한 설정은 네트워크를 통해 동기화되지 않으며, 서버 또는 클라이언트의 변경사항은 항상 로컬에 있습니다.

  • Processors - 초기화 시 KCC.LocalProcessors로 전파되는 기본 프로세서 목록입니다. 모든 IKCCProcessor는 여기에 연결될 수 있습니다. 프로세서에 대한 자세한 내용은 상호작용 섹션에서 확인할 수 있습니다.
  • Teleport Threshold - 이동을 순간(텔레포트)으로 처리하기 위해 KCC가 한 번의 틱으로 이동해야 하는 최소 거리를 정의합니다. 이는 보간에도 영향을 미칩니다.
  • Max Penetration Steps - 단일 이동/CCD 단계는 여러 개의 더 작은 하위 단계로 분할되므로 전체적으로 더 높은 침투 품질을 얻을 수 있습니다.
  • CCD Radius Multiplier - 한 번의 CCD 단계에서 KCC가 이동하는 최대 거리를 제어합니다. 유효한 범위는 반경의 25% - 75%입니다. 캐릭터가 기하를 통과할 경우 더 낮은 값을 사용하십시오. 이 설정은 EKCCFeature.CCD가 활성화된 경우에만 유효합니다. CCD 최대 스텝 거리 = 반지를 * CCD 반지름 승수.
  • Anti Jitter Distance - 기하학적 구조로부터의 탈침투로 인해 발생하는 지터를 평활화하기 위해 렌더 위치 거리 공차를 정의합니다. 값이 높으면 지터가 더 줄어들지만 이동 방향을 전환할 때 현저한 지연이 발생할 수 있습니다.
    • X = 수평 축.
    • Y = 수직 축.
  • Prediction Correction Speed - 예측오차가 0을 향해 보간되는 속도는 특징 섹션에서 확인할 수 있습니다.
  • Networked Interactions - 네트워크를 통해 동기화된 최대 인터렉션(충돌, 수정자, 무시된 콜라이더). 상호작용 대한 자세한 내용은 상호작용 섹션에서 확인할 수 있습니다.
  • Force Single Overlap Query - 이동 중에 단일 오버랩 쿼리를 수행합니다. 히트는 탈침투 전에 위치 추적됩니다. 이는 이동 시 발생할 수 있는 오류를 감수하고 플레이어가 아닌 캐릭터에 대한 성능 최적화입니다.
  • Suppress Convex Mesh Colliders - 비볼록 메쉬 충돌기와의 충돌을 항상 확인하여 고스트 충돌 및 잘못된 침투 벡터를 방지할 수 있습니다. 자세한 내용은 알려진 문제 섹션에서 확인하실 수 있습니다.

코드에서 설정 변경하기

설정은 KCC.Settings 속성을 통해 스크립트에서 접근할 수 있습니다. 다른 스크립트에서 초기화하는 가장 안전한 방법은 KCC.InvokeOnSpawn()에 콜백을 등록하는 것입니다.

C#

public class Player : NetworkBehaviour
{
    protected override void OnSpawned()
    {
        // We don't know if the KCC is already spawned at this point.
        // KCC.InvokeOnSpawn() ensures the callback is executed after KCC.Spawned() and its API called in proper order.
        // If the KCC is already spawned the callback is executed immediately.
        GetComponent<KCC>().InvokeOnSpawn(InitializeKCC);
    }

    private void InitializeKCC(KCC kcc)
    {
        // The KCC.Spawned() has been already called and we can safely use its API.
        kcc.Settings.CCDRadiusMultiplier = 0.5f;

        // We want to update KCC manually to preserve correct execution order.
        kcc.SetManualUpdate(true);
    }
}

⚠️ KCC는 Spawned()의 설정을 자동으로 백업하고 Despawned()의 설정을 복원하여 객체 풀링과 호환됩니다.

Awake()에서 변경한 내용은 객체 풀링과 함께 위험할 수 있습니다. 인스펙터에서 설정한 값으로 Desfawned()에서 재설정되지 않기 때문입니다. 이 동작을 원하는 경우에만 Awake()에서 KCC를 구성하세요.

KCC 데이터

KCCData런타임 데이터를 저장하는 핵심 데이터 구조이며, 다음을 포함합니다:

  • Metadata - 프레임, 틱, 델타 타임, 인터폴레이션 알파, …
  • Persistent data - 위치, 룩 회전
  • Input values - 입력 방향, 점프 임펄스, 중력 등…
  • Intermediate calculations - 동역학적 속도, 운동학적 속도, …
  • Physics query results - 접지 정상, 접지, …
  • Move information - 텔레포트 함, 점프 함, 가장 자리에 있음, …
  • Collisions - KCC와 상호작용하는 네트워크 충돌 모음
  • Modifiers - KCC와 상호작용하는 수동 등록 수정자/프로세서 모음
  • Ignores - 무시하는 콜라이더의 모음
  • Hits - KCC가 중복되는 모든 콜라이더/트리거 모음

이동 계산과 관련된 몇 가지 중요한 속성:

  • Alpha - 고정된 두 틱 시간 사이의 시간 상대 위치입니다.. 값 범위는 is <0.0f, 1.0f> 입니다
  • DeltaTime - 부분 델타 시간, CCD가 활성인 경우 가변. 유효 값 범위는 <0.0f, UpdateDeltaTime> 이지만, 변경될 수 있습니다.
  • UpdateDeltaTime - 렌더 업데이트/고정 틱의 델타 시간(CCD 독립).
  • BasePosition - 이동 전 베이스 위치, 각 KCC 단계 시작 시 TargetPosition으로 초기화.
  • DesiredPosition - 탈침투 및 후처리 전 원하는 위치.
  • TargetPosition - 최종 계산(탈침투 후) 또는 Transform으로 전파되는 명시적으로 설정된 위치.
  • LookRotation - KCC의 룩 회전(피치+요)
  • TransformRotation - KCC 요 회전(피치 미포함)
  • InputDirection - 비간섭 세계 공간 입력 방향 - 키보드 / 조이스틱 / NavMesh / ... 기준...
  • JumpImpulse - 세계 공간 점프 임펄스 벡터
  • Gravity - 중력 벡터
  • KinematicVelocity - InputDirection, KinematicDirection, KinematicTangent 그리고 KinematicSpeed에서 계산한 속도.
  • DynamicVelocity - Gravity, ExternalVelocity, ExternalAcceleration, ExternalImpulse, ExternalForce 그리고 JumpImpulse에서 계산된 속도.
  • IsGrounded - KCC가 MaxGroundAngle보다 낮은 수직각을 가진 콜라이더에 닿아 있음을 나타내는 플래그.

KCCData 속성에 관한 상세 내용은 KCCData.cs 소스 파일을 참고하세요.

KCC는 데이터가 고정 업데이트와 관련이 있는지 렌더 업데이트와 관련이 있는지 여부를 추가로 구분합니다:

  • Fixed Data - KCCData 인스턴스는 기본적으로 fixed update 에서 사용됩니다 - FixedUpdateNetwork() (KCC.FixedData 속성을 통해 접근 가능)
  • Render Data - KCCData 인스턴스는 기본적으로 render update에서 사용됩니다 - Render() (KCC.RenderData 속성을 통해 접근 가능)
  • History Data - 서버에서 새 스냅샷이 도착할 때 로컬 기록에서 데이터를 복원하기 위한 KCCData 인스턴스 (고정 데이터 백업, KCC.GetHistoryData(int tick)를 통해 접근 가능

⚠️ KCC에는 고정 또는 렌더 업데이트가 현재 활성화되어 있는지 여부를 자동으로 확인하고 올바른 인스턴스를 반환하는 속성 KCC.Data도 포함되어 있습니다.

다음 다이어그램은 데이터 흐름, 렌더 예측의 내부 메커니즘, 로컬 히스토리의 사용 및 서버(네트워크 버퍼에 저장된)로부터 수신된 데이터의 조정을 보여줍니다.

kcc data flow
KCC 데이터 흐름.

프레임 1

  • 두 개의 Fusion 틱을 시뮬레이션하는데, Fixed Data는 KCC가 시뮬레이션을 할 때 사용합니다.
  • 클릭할 때마다 Fixed Data로 로컬 히스토리에 복사됩니다.
  • 틱 2의 끝에 Fixed Data의 값이 (렌더를 위한 데이터를 준비하기 위해) Render Data로 복사됩니다.
  • Render()에서 KCC는 Render Data로만 작업합니다.

프레임 2/3

  • 다음 퓨전 틱을 시뮬레이션할 델타 시간이 충분하지 않습니다.
  • Render()만 실행되고 KCC는 이전 프레임의 Render Data로 계속 합니다.

프레임 4

  • 서버에서 네트워크 버퍼에 틱 1 스냅샷이 있는 새 데이터가 도착했습니다.
  • Tick 1에 대한 전체 Fixed Data로컬 히스토리에서 복원됩니다.
  • Network Buffer의 값은 복원된 Fixed Data => 위에 적용되어 서버에서 모든 네트워크 속성을 올바른 상태로 효과적으로 덮어씁니다.
  • 로컬 히스토리에 복사된 Fixed Data의 끝에 있는 틱 2의 시뮬레이션.
  • 틱 3의 순방향 시뮬레이션에 충분한 시간이 경과하면 Fixed Data는 로컬 히스토리에 복사되고 Fixed DataRender Data(렌더용 데이터 준비)에 복사됩니다.
  • Render()에서 KCC는 Render Data로만 작업합니다.

위의 접근 방식은 렌더 예측이 고정 시뮬레이션으로부터 완전히 분리되도록 보장합니다. 다음 고정 틱을 시뮬레이션할 수 있는 델타 시간이 충분하면 이전 렌더링의 결과가 버려지고 렌더링이 최신 고정 틱의 상태로 시작됩니다.

Back to top