Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Unity 3D] ECS & new Input System

    29 octobre 2019 à 14:01:18

    Bonjour, je poste ici ce message car j'aimerai avoir un avis sur mon code.

    J'ai voulu tester les nouvelles possibilités qu'offre la version alpha de Unity (2020) à savoir : pure ECS et le nouveau système d'input.

    Mon idée était assez simple : utiliser les touches zqsd pour déplacer une Entity "Player". 

    Le seul petit soucis : la totalité des tutos que j'ai vu sur le nouveau système d'input n'utilisait jamais le pure ECS et inversement les tutos de pure ECS utilisaient tous l'anciens système d'input... 

    J'ai cependant réussi à faire fonctionner le tout mais comme les System n'ont pas de fonction Enable et Disable, j'ai déplacé le code d'activation et de désactivation des Input dans OnStartRunning et OnStopRunning. J'ignore totalement si ce que j'ai fait est une bonne chose ou si il est préférable de garder un GameObjet avec le nouveau système d'Input qui est un peu le seul GameObjet de la scène car chaque éléments de jeu est converti en Entity.

    using Unity.Entities;
    using Unity.Mathematics;
    using UnityEngine.InputSystem;
    
    [UpdateBefore(typeof(MoveEntitySystem))]
    public class PlayerInputSystem : ComponentSystem
    {
    
        private InputControls Controls = null;
        private float2 Direction = float2.zero;
        private EntityQuery query = null;
    
        protected override void OnCreate()
        {
            Controls = new InputControls();
            Direction = float2.zero;
            query = GetEntityQuery(
                typeof(PlayerComponent),
                typeof(InputComponent),
                typeof(DirectionComponent)
            );   
        }
    
        protected override void OnStartRunning()
        {
            base.OnStartRunning();
            Controls.player.Enable();
            Controls.player.horizontal.performed += OnHorizontal;
            Controls.player.vertical.performed += OnVertical;
            Controls.player.stop_horizontal.performed += OnStopHorizontal;
            Controls.player.stop_vertical.performed += OnStopVertical;
        }
    
        protected override void OnStopRunning()
        {
            base.OnStopRunning();
            Controls.player.horizontal.performed -= OnHorizontal;
            Controls.player.vertical.performed -= OnVertical;
            Controls.player.stop_horizontal.performed -= OnStopHorizontal;
            Controls.player.stop_vertical.performed -= OnStopVertical;
            Controls.player.Disable();
        }
    
        public void OnHorizontal(InputAction.CallbackContext context)
        {
            float a = context.ReadValue<float>();
            if (!float.IsNaN(a))
            {
                Direction.x = a;
            }
        }
        public void OnVertical(InputAction.CallbackContext context)
        {
            float a = context.ReadValue<float>();
            if (!float.IsNaN(a))
            {
                Direction.y = a;
            }
        }
        public void OnStopHorizontal(InputAction.CallbackContext context) => Direction.x = 0;
        public void OnStopVertical(InputAction.CallbackContext context) => Direction.y = 0;
        protected override void OnUpdate()
        {
            Entities.With(query)
            .ForEach(
                delegate (ref InputComponent input, ref DirectionComponent direction)
                {
                    input.horizontal = Direction;
                    direction.direction = new float3(input.horizontal.x, input.horizontal.y, 0);
                }
            );
        } 
            
    }
    

    J'ai aussi créé 2 binding : un pour press et l'autre pour release car je n'arrivais pas à me déplacer en diagonale autrement.

    • Partager sur Facebook
    • Partager sur Twitter

    [Unity 3D] ECS & new Input System

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown