void Update()
    {
        // Early exits
        if (!m_player || !m_player.enabled || m_player.IsControlled)
        {
            return;
        }

        // Check if player is in valid state
        if (m_player.GetState() != APCharacterController.State.Standard)
        {
            return;
        }

        // Check inputs and update animation according to this
        APAnimation anim   = m_targetFront;
        bool        bFront = Mathf.Abs(m_player.m_inputs.m_axisX.GetValue()) > 0f;
        bool        bUp    = m_player.m_inputs.m_axisY.GetValue() > 0f;
        bool        bDown  = m_player.m_inputs.m_axisY.GetValue() < 0f;

        if (bFront)
        {
            if (bUp)
            {
                anim = m_targetFrontUp;
            }
            else if (bDown)
            {
                anim = m_targetFrontDown;
            }
        }
        else if (bUp)
        {
            anim = m_targetUp;
        }
        else if (bDown)
        {
            anim = m_targetDown;
        }

        // Use front running animation if needed
        if ((anim == m_targetFront) && m_player.IsRunning() && (m_targetFrontRun.GetAnimHash() != 0))
        {
            anim = m_targetFrontRun;
        }

        m_player.PlayAnim(anim);
    }