40 lines
1.9 KiB
C#
40 lines
1.9 KiB
C#
using Unity.Collections;
|
|
using Unity.Mathematics;
|
|
using Unity.NetCode;
|
|
|
|
namespace ProjectM.Simulation
|
|
{
|
|
/// <summary>
|
|
/// Twin-stick player input (server-authoritative, input-only clients). Gathered once per frame
|
|
/// on the owning client in <see cref="GhostInputSystemGroup"/> and streamed to the server via
|
|
/// AutoCommandTarget. Netcode source-gen produces InputBufferData<PlayerInput> plus the
|
|
/// copy/apply systems from this type. The [GhostField]s let remote owners be predicted; the
|
|
/// data replays deterministically under rollback.
|
|
/// </summary>
|
|
public struct PlayerInput : IInputComponentData
|
|
{
|
|
/// <summary>WASD / left-stick movement, normalized to roughly -1..1 per axis.</summary>
|
|
[GhostField(Quantization = 1000)] public float2 Move;
|
|
|
|
/// <summary>Right-stick / cursor aim direction (normalized). Zero => face movement direction.</summary>
|
|
[GhostField(Quantization = 1000)] public float2 Aim;
|
|
|
|
/// <summary>Primary ability fire. InputEvent survives the frame→tick→rollback boundary so a press fires exactly once.</summary>
|
|
[GhostField] public InputEvent Fire;
|
|
|
|
/// <summary>Active input scheme this tick (<see cref="InputSchemeId"/>: 0 = mouse/keyboard, 1 = gamepad).
|
|
/// The server reads it so the auto-target assist applies only to gamepad shots; precise mouse aim is left
|
|
/// exact. A byte (not an enum): it is compared inside the Burst-compiled <c>AbilityFireSystem</c>.</summary>
|
|
[GhostField] public byte Scheme;
|
|
|
|
public FixedString512Bytes ToFixedString()
|
|
{
|
|
var s = new FixedString512Bytes();
|
|
s.Append(Move.x); s.Append(','); s.Append(Move.y); s.Append(';');
|
|
s.Append(Aim.x); s.Append(','); s.Append(Aim.y); s.Append(';');
|
|
s.Append(Fire.Count); s.Append(';'); s.Append(Scheme);
|
|
return s;
|
|
}
|
|
}
|
|
}
|