void DetirmineStance()
    {
        CharacterStance bestStance = currentStance;

        foreach (CharacterStance stance in stances)
        {
            if ((currentStance == null || stance.Priority > bestStance.Priority) && stance.CanEnterStance(this))
            {
                bestStance = stance;
            }
        }

        if (bestStance != currentStance)
        {
            currentStance = bestStance;
            bestStance.OnEnterStance(this);
        }
    }
    private void OnEnable()
    {
        InputManager.manager.inputs.FindAction("Movement").performed += ctx => movement = (Vector2)ctx.ReadValue <Vector2>();
        InputManager.manager.inputs.FindAction("Movement").canceled  += ctx => movement = (Vector2)ctx.ReadValue <Vector2>();

        InputManager.manager.inputs.FindAction("Rotation").performed += ctx => rotation = (Vector2)ctx.ReadValue <Vector2>();
        InputManager.manager.inputs.FindAction("Rotation").canceled  += ctx => rotation = (Vector2)ctx.ReadValue <Vector2>();

        InputManager.manager.AddEvent("Jump", Jump);

        for (int i = 0; i < stances.Length; i++)
        {
            CharacterStance original = stances[i];
            stances[i]      = Instantiate(stances[i]);
            stances[i].name = original.name;

            stances[i].OnEnableStance(this);
        }
    }
    private void Update()
    {
        onGround = OnGround();

        DetirmineStance();

        if (currentStance == null)
        {
            return;
        }

        currentStance.OnUpdateStance();

        if (!currentStance.OnValidateStance(this))
        {
            currentStance.OnExitStance();
            currentStance = null;
            DetirmineStance();
        }

        facing.rotation = Quaternion.Euler(0, cam.rotation.eulerAngles.y, 0);
        Rotate();
        movementDirection = Vector3.Dot(character.forward, rb.velocity.normalized);
    }