This document is about: QUANTUM 2
SWITCH TO

입력 & 연결 플래그

소개

Quantum에서는 DeterministicInputFlags는 아래 사항에 대해서 사용됩니다:

  • 플레이어가 존재 하고 있는지 식별, 즉, 시뮬레이션에 연결됨
  • 주어진 플레이어에 대한 다음 틱을 어떻게 예측 할 것인지 결정, 그리고
  • 확인된 프레임의 입력이 클라이언트에 의해 제공되었는지 아니면 서버에 의해 변경 되었는지 알 수 있습니다.

PlayerConnectedSystem을 구현하면 검사를 자동화할 수 있습니다. 자세한 내용은 Player 페이지의 엔트리를 참조하세요.

Types

C#

public enum DeterministicInputFlags : byte {
  Repeatable = 1 << 0,
  PlayerNotPresent = 1 << 1,
  ReplacedByServer = 1 << 2
}
  • PlayerNotPresent = 이 플레이어 인덱스에 연결된 클라이언트가 없음을 의미합니다.
  • ReplacedByServer = 플레이어 인덱스가 클라이언트에 의해 제어되지만 클라이언트가 입력을 제때 전송하지 않아 서버가 입력을 반복하거나 대체/영점 해제하게 되었다는 의미입니다.
  • Repeatable = 서버와 다른 클라이언트 모두에 이 입력 데이터를 다음 틱(시간 초과로 인해 입력을 바꿀 때 서버 및 로컬 예측 알고리즘의 다른 클라이언트)에 복사하도록 지시합니다. 이것은 플레이어 입력을 주입할 때 유니티의 개발자가 설정할 수 있으며 커맨드와 같은 입력(예: 아이템 구매)을 위한 것이 아니라 이동과 같은 직접 제어와 유사한 입력에 사용해야 합니다.

구현 예제

중요: DeterministicInputFlags검증된 프레임에서만 신뢰할 수 있습니다.

아래의 코드는 BotSDK 페이지에 있는 LittleGuys 샘플에서 추가된 것입니다.

C#

private void UpdateIsBot(Frame f, EntityRef littleGuyEntity)
{
  // Return if players shouldn't be replaced by bots
  if (!f.RuntimeConfig.ReplaceOnDisconnect)
    return;

  // Only update this information if this frame is Verified.
  if (!f.IsVerified) return;

  var littleGuyComponent = f.Unsafe.GetPointer<LittleGuyComponent>(littleGuyEntity);
 
  // Get the input flags for that player
  var inputFlags = f.GetPlayerInputFlags(littleGuyComponent->PlayerRef);
  // Bitwise operations to see if the PlayerNotPresent flag is activated
  var playerDisconnected = (inputFlags & DeterministicInputFlags.PlayerNotPresent) == DeterministicInputFlags.PlayerNotPresent;

  // Store it in the IsBot field so this can be evaluated in other parts of code
  littleGuyComponent->IsBot = playerDisconnected;

  // Only initialize the entity as a bot if it doesn't have the HFSM Agent component yet
  if (playerDisconnected && f.TryGet<HFSMAgent>(littleGuyEntity, out var hfsmAgent) == false)
  {
    // We're replacing players only by the HFSM, but this could easily be changed to be GOAP instead
    HFSMHelper.SetupHFSM(f, littleGuyEntity, f.RuntimeConfig.ReplacementHFSM);
  }
}
Back to top