121 lines
5.1 KiB
C#
121 lines
5.1 KiB
C#
using Unity.Burst;
|
|
using Unity.Entities;
|
|
using Unity.Mathematics;
|
|
using Unity.Transforms;
|
|
using UnityEngine;
|
|
using Unity.CharacterController;
|
|
using Unity.NetCode;
|
|
|
|
[UpdateInGroup(typeof(GhostInputSystemGroup))]
|
|
[WorldSystemFilter(WorldSystemFilterFlags.ClientSimulation)]
|
|
public partial class FirstPersonPlayerInputsSystem : SystemBase
|
|
{
|
|
protected override void OnCreate()
|
|
{
|
|
RequireForUpdate<NetworkTime>();
|
|
RequireForUpdate(SystemAPI.QueryBuilder().WithAll<FirstPersonPlayer, FirstPersonPlayerInputs>().Build());
|
|
}
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
var time = SystemAPI.GetSingleton<FixedTickSystem.Singleton>();
|
|
|
|
foreach (var (playerInputs, player) in SystemAPI.Query<RefRW<FirstPersonPlayerInputs>, FirstPersonPlayer>().WithAll<GhostOwnerIsLocal>())
|
|
{
|
|
playerInputs.ValueRW.MoveInput = new float2
|
|
{
|
|
x = (Input.GetKey(KeyCode.D) ? 1f : 0f) + (Input.GetKey(KeyCode.A) ? -1f : 0f),
|
|
y = (Input.GetKey(KeyCode.W) ? 1f : 0f) + (Input.GetKey(KeyCode.S) ? -1f : 0f),
|
|
};
|
|
|
|
InputDeltaUtilities.AddInputDelta(ref playerInputs.ValueRW.LookInput.x, Input.GetAxis("Mouse X"));
|
|
InputDeltaUtilities.AddInputDelta(ref playerInputs.ValueRW.LookInput.y, Input.GetAxis("Mouse Y"));
|
|
|
|
playerInputs.ValueRW.JumpPressed = default;
|
|
if (Input.GetKeyDown(KeyCode.Space))
|
|
{
|
|
playerInputs.ValueRW.JumpPressed.Set(time.Tick);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Apply inputs that need to be read at a variable rate
|
|
/// </summary>
|
|
[UpdateInGroup(typeof(PredictedSimulationSystemGroup))]
|
|
[UpdateAfter(typeof(PredictedFixedStepSimulationSystemGroup))]
|
|
[BurstCompile]
|
|
public partial struct FirstPersonPlayerVariableStepControlSystem : ISystem
|
|
{
|
|
[BurstCompile]
|
|
public void OnCreate(ref SystemState state)
|
|
{
|
|
state.RequireForUpdate<NetworkTime>();
|
|
state.RequireForUpdate(SystemAPI.QueryBuilder().WithAll<FirstPersonPlayer, FirstPersonPlayerInputs>().Build());
|
|
}
|
|
|
|
[BurstCompile]
|
|
public void OnUpdate(ref SystemState state)
|
|
{
|
|
foreach (var (playerInputs, playerNetworkInput, player) in SystemAPI.Query<FirstPersonPlayerInputs, RefRW<FirstPersonPlayerNetworkInput>, FirstPersonPlayer>().WithAll<Simulate>())
|
|
{
|
|
// Compute input deltas, compared to last known values
|
|
float2 lookInputDelta = InputDeltaUtilities.GetInputDelta(
|
|
playerInputs.LookInput,
|
|
playerNetworkInput.ValueRO.LastProcessedLookInput);
|
|
playerNetworkInput.ValueRW.LastProcessedLookInput = playerInputs.LookInput;
|
|
|
|
if (SystemAPI.HasComponent<FirstPersonCharacterControl>(player.ControlledCharacter))
|
|
{
|
|
FirstPersonCharacterControl characterControl = SystemAPI.GetComponent<FirstPersonCharacterControl>(player.ControlledCharacter);
|
|
characterControl.LookDegreesDelta = lookInputDelta;
|
|
SystemAPI.SetComponent(player.ControlledCharacter, characterControl);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Apply inputs that need to be read at a fixed rate.
|
|
/// It is necessary to handle this as part of the fixed step group, in case your framerate is lower than the fixed step rate.
|
|
/// </summary>
|
|
[UpdateInGroup(typeof(PredictedFixedStepSimulationSystemGroup), OrderFirst = true)]
|
|
[BurstCompile]
|
|
public partial struct FirstPersonPlayerFixedStepControlSystem : ISystem
|
|
{
|
|
[BurstCompile]
|
|
public void OnCreate(ref SystemState state)
|
|
{
|
|
|
|
state.RequireForUpdate<NetworkTime>();
|
|
state.RequireForUpdate(SystemAPI.QueryBuilder().WithAll<FirstPersonPlayer, FirstPersonPlayerInputs>().Build());
|
|
}
|
|
|
|
[BurstCompile]
|
|
public void OnUpdate(ref SystemState state)
|
|
{
|
|
var time = SystemAPI.GetSingleton<FixedTickSystem.Singleton>();
|
|
|
|
foreach (var (playerInputs, player) in SystemAPI.Query<FirstPersonPlayerInputs, FirstPersonPlayer>().WithAll<Simulate>())
|
|
{
|
|
if (SystemAPI.HasComponent<FirstPersonCharacterControl>(player.ControlledCharacter))
|
|
{
|
|
FirstPersonCharacterControl characterControl = SystemAPI.GetComponent<FirstPersonCharacterControl>(player.ControlledCharacter);
|
|
|
|
quaternion characterRotation = SystemAPI.GetComponent<LocalTransform>(player.ControlledCharacter).Rotation;
|
|
|
|
// Move
|
|
float3 characterForward = MathUtilities.GetForwardFromRotation(characterRotation);
|
|
float3 characterRight = MathUtilities.GetRightFromRotation(characterRotation);
|
|
characterControl.MoveVector = (playerInputs.MoveInput.y * characterForward) + (playerInputs.MoveInput.x * characterRight);
|
|
characterControl.MoveVector = MathUtilities.ClampToMaxLength(characterControl.MoveVector, 1f);
|
|
|
|
// Jump
|
|
characterControl.Jump = playerInputs.JumpPressed.IsSet(time.Tick);
|
|
|
|
SystemAPI.SetComponent(player.ControlledCharacter, characterControl);
|
|
}
|
|
}
|
|
}
|
|
} |