Input Handling
Input handling in PurrDiction centers around the generic PredictedIdentity<INPUT, STATE> base class. Implement GetFinalInput(ref INPUT input) to gather per‑frame input, and optionally UpdateInput(ref INPUT input) to cache edge‑triggered inputs (e.g., key down) from Unity’s frame loop.
Key Concepts
INPUTmust be a struct implementingIPredictedData.Implement
protected virtual void GetFinalInput(ref INPUT input)to populate inputs deterministically each tick.Use
protected virtual void UpdateInput(ref INPUT input)inside Unity’s frame loop to accumulate one‑shot inputs.Use
protected virtual void SanitizeInput(ref INPUT input)to clamp or normalize values for determinism.
Basic Example
public struct SimpleWASDInput : IPredictedData {
public NormalizedFloat horizontal;
public NormalizedFloat vertical;
public bool jump;
public bool dash;
public void Dispose() {}
}
public class SimpleCC : PredictedIdentity<SimpleWASDInput, SimpleCCState>
{
protected override void GetFinalInput(ref SimpleWASDInput input)
{
input.horizontal = Input.GetAxisRaw("Horizontal");
input.vertical = Input.GetAxisRaw("Vertical");
input.dash = Input.GetKey(KeyCode.LeftShift);
}
protected override void UpdateInput(ref SimpleWASDInput input)
{
// Edge-triggered input is cached here and consumed once per tick
input.jump |= Input.GetKeyDown(KeyCode.Space);
}
protected override void SanitizeInput(ref SimpleWASDInput input)
{
var move = Vector2.ClampMagnitude(new Vector2(input.horizontal, input.vertical), 1f);
input.horizontal = move.x;
input.vertical = move.y;
}
}Extrapolation and Repeat
Remote players can use extrapolated input if the latest input is missing.
Control behavior via fields on
PredictedIdentity<INPUT, STATE>:Extrapolate Input: enables extrapolation for remote input.
Repeat Input Factor: caps how many ticks a prior input can be reused.
Override
ModifyExtrapolatedInput(ref INPUT input)to disable non‑continuous inputs during extrapolation (e.g.,jump = false).
Why This Pattern
Determinism: All input used in simulation is captured, sanitized, and stored per tick.
One‑shot safety: Edge‑triggered inputs are gathered in
UpdateInputand consumed once, preventing repeats.Flexibility: Works with any control scheme while keeping authoritative reconciliation stable.
Last updated