public override bool CheckEnterTransition(CharacterState fromState) { if (!CharacterActor.IsGrounded) { return(false); } if (useInteractAction && !CharacterActions.interact.Started) { return(false); } for (int i = 0; i < CharacterActor.Triggers.Count; i++) { Trigger trigger = CharacterActor.Triggers[i]; Ladder ladder = ladders.GetOrRegisterValue <Transform, Ladder>(trigger.transform); if (ladder != null) { if (!useInteractAction && !trigger.firstContact) { return(false); } currentLadder = ladder; // Check if the character is closer to the top or the bottom float distanceToTop = Vector3.Distance(CharacterActor.Position, currentLadder.TopReference.position); float distanceToBottom = Vector3.Distance(CharacterActor.Position, currentLadder.BottomReference.position); isBottom = distanceToBottom < distanceToTop; if (filterByAngle) { Vector3 ladderToCharacter = CharacterActor.Position - currentLadder.transform.position; ladderToCharacter = Vector3.ProjectOnPlane(ladderToCharacter, currentLadder.transform.up); float angle = Vector3.Angle(currentLadder.FacingDirectionVector, ladderToCharacter); if (isBottom) { if (angle >= maxAngle) { return(true); } else { continue; } } else { if (angle <= maxAngle) { return(true); } else { continue; } } } else { return(true); } } } return(false); }