#What are more effective ways to take player input?

1 messages · Page 1 of 1 (latest)

bright pilot
#

I'm new to dots and would appreciate guidance.

public struct InputComponent : IComponentData
    {
        public float3 MovementAxis { get; set; }
        public float2 MouseDelta { get; set; }
        public bool isFiring { get; set; }
        public float2 MouseScreenPos { get; set; }
        public float3 MouseWorldPos { get; set; }
        public float3 CameraPos { get; set; }
    }

    public partial class PlayerInputSystem : SystemBase
    {
        public PlayerInputActions PlayerInputEvents;

        protected override void OnUpdate()
        {
            foreach ((var inputComponent, var playerTag) in SystemAPI.Query<RefRW<InputComponent>, PlayerTag>())
            {
                var direction = PlayerInputEvents.PlayerInputs.Move.ReadValue<Vector3>();
                var mouseDelta = PlayerInputEvents.PlayerInputs.Look.ReadValue<Vector2>();
                var mousePos = PlayerInputEvents.PlayerInputs.MousePosition.ReadValue<Vector2>();
                var didFire = PlayerInputEvents.PlayerInputs.Fire.WasPressedThisFrame();
                inputComponent.ValueRW.MovementAxis = direction;
                inputComponent.ValueRW.MouseDelta = mouseDelta;
                inputComponent.ValueRW.MouseScreenPos = mousePos;
                inputComponent.ValueRW.isFiring = didFire;
                Camera main = Camera.main!;
                var ray = main.ScreenPointToRay(mousePos);
                Physics.Raycast(ray, out var hit, 100f);
                inputComponent.ValueRW.MouseWorldPos = hit.point;
                inputComponent.ValueRW.CameraPos = main.transform.position;
            }
        }

        protected override void OnCreate()
        {
            PlayerInputEvents = new PlayerInputActions();
            PlayerInputEvents.PlayerInputs.Enable();
        }
    }


public struct InputComponent : IComponentData
    {
        public float3 MovementAxis { get; set; }
        public float2 MouseDelta { get; set; }
        public bool isFiring { get; set; }
        public float2 MouseScreenPos { get; set; }
        public float3 MouseWorldPos { get; set; }
        public float3 CameraPos { get; set; }
    }

    public partial class PlayerInputSystem : SystemBase
    {
        public PlayerInputActions PlayerInputEvents;

        protected override void OnUpdate()
        {
            foreach ((var inputComponent, var localTransform, var playerTag) in SystemAPI.Query<RefRW<InputComponent> , RefRO<LocalTransform>, PlayerTag>())
            {
                var direction = PlayerInputEvents.PlayerInputs.Move.ReadValue<Vector3>();
                var mouseDelta = PlayerInputEvents.PlayerInputs.Look.ReadValue<Vector2>();
                var mousePos = PlayerInputEvents.PlayerInputs.MousePosition.ReadValue<Vector2>();
                var didFire = PlayerInputEvents.PlayerInputs.Fire.WasPressedThisFrame();
                inputComponent.ValueRW.MovementAxis = direction;
                inputComponent.ValueRW.MouseDelta = mouseDelta;
                inputComponent.ValueRW.MouseScreenPos = mousePos;
                inputComponent.ValueRW.isFiring = didFire;
                Camera main = Camera.main!;
                var ray = main.ScreenPointToRay(mousePos);
                Physics.Raycast(ray, out var hit, 100f);
                inputComponent.ValueRW.MouseWorldPos = hit.point;
                inputComponent.ValueRW.CameraPos = main.transform.position;
            }
        }

        protected override void OnCreate()
        {
            PlayerInputEvents = new PlayerInputActions();
            PlayerInputEvents.PlayerInputs.Enable();
        }
    }
wild latch
#

there isn't much to optimize in reading input tbh

#

what you can do though is move everything except writing to component out of loop

#

so it's not repeated

#

or if it's singleton

#

you can access RW directly

#

would be slightly faster vs query

bright pilot
#

Would you say its fine if I have the InputComponent on many objects and I would have GoblinInputSystem, OrcInputSystem, PlayerInputSystem, etc. Is that the right idea/path forward for DOTS? Would I need something different if I wanted to implement multiplayer/netcode for entities?

valid flower
#

oh totally, if you can have your AI drive this component as well that's fantastic for re-usability

#

if you were using netcode you'd make it an IInputComponent to sync from client -> server

#

but as far as I remember, there's no harm in re-using this on server for AI as well