// ======================================================================================
    // PRIVATE MEMBERS - SUBSYSTEM EVENT STARTERS
    // ======================================================================================
    private void StartDash()
    {
        Vector2 velocity = m_rb.velocity;

        m_dashDirection = new Vector2(m_input.GetHorizontal(), m_input.GetVertical());

        if (m_dashDirection.sqrMagnitude == 0)
        {
            m_dashDirection = new Vector2(ForwardDir == eDirection.Right ? 1 : -1, 0);
        }
        else
        {
            m_dashDirection.Normalize();
        }


        if (!IsWallSnapped || m_dashDirection.x * m_snappedWallNormal.x > 0)
        {
            m_dashTargetPos = m_rb.position + m_dashDirection * m_dashDist;

            velocity      = m_dashMaxSpeed * m_dashDirection;
            m_rb.velocity = velocity;

            IsDashing = true;

            // stop any other action
            IsJumping = false;

            m_inAirDashPermission = false;
        }
    }
    // ======================================================================================
    // PRIVATE MEMBERS - SUBSYSTEM EVENT STARTERS
    // ======================================================================================
    private void StartAttack()
    {
        m_attackDirection = new Vector2(m_input.GetHorizontal(), 0);

        if (m_attackDirection.sqrMagnitude == 0)
        {
            m_attackDirection = new Vector2(0, m_input.GetVertical());
            if (m_attackDirection.sqrMagnitude == 0)
            {
                m_attackDirection = new Vector2(m_control.ForwardDir == PlayerController.eDirection.Right ? 1 : -1, 0);
            }
            else
            {
                m_attackDirection.Normalize();
            }
        }
        else
        {
            m_attackDirection.Normalize();
        }

        if (!m_control.IsWallSnapped && !m_control.IsWallSliding)
        {
            IsAttacking = true;

            switch (EquipWeap)
            {
            case eWeapon.Fists:
            {
                StartCoroutine(PunchAttack());
                break;
            }

            case eWeapon.Saber:
            {
                StartCoroutine(SaberAttack());
                break;
            }

            case eWeapon.Pistol:
            {
                StartCoroutine(PistolAttack());
                break;
            }
            }
        }
    }