입력
턴 베이스 게임에서 대역 사용을 최적화하려면 Command
를 사용하는 것이 좋습니다. Command
는 요청이 있을 때만 전송되지만 일반 입력은 모든 틱에서 전송되므로, 전자는 후자보다 더 적은 대역폭을 사용합니다.
골프 템플릿은 PlayCommand
와 SkipCommand
의 두 가지 유형의 Command
입력을 구현합니다. 각각은 일반 구조체를 사용하여 게임별 명령 데이터를 전달하고 직렬화합니다. 주의: 새 Command
를 생성할 때 포함된 데이터의 직렬화를 수동으로 구현해야 합니다.
CommandSystem
은 플레이어가 보낸 명령을 수신하고 검증합니다.
커맨드
PlayCommand
플레이어는 차례대로 PlayCommand
를 보내 해당 차례 동안 내린 결정/동향에 대한 정보를 보낼 수 있습니다.
PlayCommandData
는 공을 치는 방향과 힘을 잡는 데 사용되는 FPVector3
와 FP
를 각각 감싸고 있습니다.
C#
[Serializable]
public struct PlayCommandData
{
// game-specific command data here
public FP Force;
public FPVector3 Direction;
}
public class PlayCommand : DeterministicCommand
{
public PlayCommandData Data;
public override void Serialize(BitStream stream)
{
// serialize command data here
stream.Serialize(ref Data.Force);
stream.Serialize(ref Data.Direction);
}
}
SkipCommand
플레이어들은 SkipCommand
를 보내 현재 순서를 건너뛸 수 있습니다.
C#
[Serializable]
public struct SkipCommandData
{
// game-specific command data here
}
public class SkipCommand : DeterministicCommand
{
public SkipCommandData Data;
public override void Serialize(BitStream stream)
{
// serialize command data here
}
}
유니티 측 헬퍼
유니티 쪽에는 입력의 캐싱과 전송을 돕는 몇 가지 스크립트가 있습니다.
CommandDispatcher
CommandDispatcher
는 모든 로컬 플레이어의 PlayCommand
와 SkipCommand
를 로컬 플레이어로 보낼 때 사용합니다.
StrikeInput
StrikeInput
은 InputPoller
가 등록하고 폴링 할 수 있도록 액티브 플레이어가 조준한 입력을 전달합니다.
StrikeInput
스크립트는 InputManager
가 보낸 활성 로컬 플레이어의 입력 이벤트를 리슨 합니다. 마우스 끌기를 사용하여 조준 방향을 업데이트합니다. 또 다른 책임은 포스바 표시 위치를 지속적으로 업데이트하는 것입니다.
플레이어가 조준을 하고 마우스 버튼을 놓으면 현재 조준 방향과 포스바 표시 위치가 표시된 PlayCommand
이 전송됩니다.
AimSensitivity
: 마우스를 드래그하고 촬영 방향을 변경할 때 사용되는 축척 비율입니다.ReverseControls
: 촬영 방향에 적용하기 전에 입력 드래그 값이 반전됩니다.ClampDirection
: 조준 방향각은GameConfig
에셋에 정의된 최소-최대 타격각 값에 따라 클램프 됩니다. 이러한 값은 시뮬레이션을 통해 이중 확인됩니다. 또한 시각화/UI 목적으로만 사용할 수 있지만 최대 스트라이크 오프닝 값을 클램프 합니다.MaxStrikeOpeningAngle
: 카메라 방향과 상대적인 최대 오프닝 각도입니다.
InputManager
클라이언트 시스템에는 로컬 플레이어가 여러 개 있을 수 있습니다. InputManager
는 현재 전송/폴링/읽고 있는 로컬 플레이어 입력을 관리합니다.
마우스 버튼 이벤트와 같은 입력 이벤트를 처리하기 위해 다양한 정적 이벤트를 구현합니다. 다른 스크립트는 이러한 종류의 입력/이벤트를 수신하고 싶은 경우 InputManager
에 등록합니다.
InputPoller
Quantum 시뮬레이션은 지정된 속도로 유니티의 입력을 폴링 합니다. 이는 Deterministic Config
에 정의되어 있습니다. 입력 폴러는 가장 최근에 등록된 입력을 시뮬레이션에서 폴링 할 수 있도록 로컬 플레이어들에게 읽어주는 역할을 합니다.
입력 데이터는 등록된 순간부터 같은 플레이어의 다른 입력에 의해 덮어쓰여지거나 플레이어의 순서가 끝날 때까지 저장됩니다. 후자의 경우 등록된 입력이 기본값으로 재설정됩니다. 이 설정을 사용하면 원격 플레이어가 조준할 때 시뮬레이션에서 조준 데이터를 폴링하고 로컬 플레이어가 조준할 때 InputPoller
에 등록된 입력에서 조준 데이터를 폴링 할 수 있으므로 시각적 반응이 더 선명해집니다.
에이밍 UI 디스플레이
AimingDisplay
는 플레이어가 조준할 때 방향 화살표, 포스 바 등의 시각적 기능을 업데이트하는 역할을 합니다.
에이밍 플레이어가 로컬인 경우, AimingDisplay
는 InputPoller
에서 특정 플레이어에 대해 등록된 입력을 폴링 합니다. 또는 플레이어가 원격인 경우 스크립트가 시뮬레이션에서 가장 최근의 해당 입력을 폴링 합니다.