Esempio n. 1
0
        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);
        }