입력 & 연결 플래그
소개
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