public override void FixedUpdateAbility()
        {
            base.FixedUpdateAbility();

            if (updatingPosition)
            {
                transform.position = Vector3.MoveTowards(transform.position, EnterTargetPosition, deltaPos * Time.deltaTime);
                transform.rotation = Quaternion.Lerp(transform.rotation, EnterTargetRotation, 0.2f);
                time += Time.deltaTime;

                if (Mathf.Approximately(Vector3.Distance(transform.position, EnterTargetPosition), 0) || time > transitionTimeToPosition)
                {
                    updatingPosition = false;
                }

                return;
            }

            CurrentCastResult = FoundLadder();

            if (CurrentCastResult == LadderCastResult.Both)
            {
                transform.position = TargetPosition;
                transform.rotation = Quaternion.Lerp(transform.rotation,
                                                     GetRotationFromDirection(m_CurrentLadderCollider.transform.forward), 0.2f);
            }
        }
        public override bool TryEnterAbility()
        {
            if (AbilityExitFixedTime + 0.1f > Time.fixedTime)
            {
                return(false);
            }

            LadderCastResult result = FoundLadder();

            if (result == LadderCastResult.Both)
            {
                if (m_System.ActiveAbility is ClimbJump)
                {
                    if (m_ClimbJump.JumpType != ClimbJumpType.FromGroundToHang ||
                        m_ClimbJump.JumpType != ClimbJumpType.FromGroundToLower)
                    {
                        if (m_ClimbJump.JumpTimeToTarget * 0.8f + m_ClimbJump.AbilityEnterFixedTime > Time.fixedTime)
                        {
                            return(false);
                        }
                    }
                }

                return(m_LastLadderCollider != m_CurrentLadderCollider && m_CurrentLadderCollider != null);
            }
            else if (result != LadderCastResult.Top)
            {
                m_LastLadderCollider = null;
            }

            return(base.TryEnterAbility());
        }
        public override void OnEnterAbility()
        {
            base.OnEnterAbility();

            m_System.m_Rigidbody.useGravity = false;
            m_System.m_Rigidbody.velocity   = Vector3.zero;

            updatingPosition    = true;
            EnterTargetPosition = TargetPosition;
            if (EnterTargetPosition.y < m_CurrentLadderCollider.bounds.min.y)
            {
                EnterTargetPosition.y = m_CurrentLadderCollider.bounds.min.y;
            }

            EnterTargetRotation = GetRotationFromDirection(m_CurrentLadderCollider.transform.forward);
            deltaPos            = Vector3.Distance(EnterTargetPosition, transform.position) / transitionTimeToPosition;
            time = 0;

            m_JumpDirection   = ClimbJumpType.Noone;
            CurrentCastResult = LadderCastResult.Both;
        }