데이터 레이어
KCC 설정
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()
의 설정을 복원하여 객체 풀링과 호환됩니다.
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
도 포함되어 있습니다.
다음 다이어그램은 데이터 흐름, 렌더 예측의 내부 메커니즘, 로컬 히스토리의 사용 및 서버(네트워크 버퍼에 저장된)로부터 수신된 데이터의 조정을 보여줍니다.
프레임 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 Data
는Render Data
(렌더용 데이터 준비)에 복사됩니다. Render()
에서 KCC는Render Data
로만 작업합니다.
위의 접근 방식은 렌더 예측이 고정 시뮬레이션으로부터 완전히 분리되도록 보장합니다.
다음 고정 틱을 시뮬레이션할 수 있는 델타 시간이 충분하면 이전 렌더링의 결과가 버려지고 렌더링이 최신 고정 틱의 상태로 시작됩니다.