/// <summary>
 /// Initialise this instance.
 /// </summary>
 override public Movement Init(Character character)
 {
     AssignReferences(character);
     initialVelocity      = Mathf.Sqrt(-2.0f * character.DefaultGravity * jumpHeight);
     highestRightCollider = character.Colliders.Where(c => c.RaycastType == RaycastType.SIDE_RIGHT).OrderByDescending(c => c.WorldPosition.y).FirstOrDefault();
     highestLeftCollider  = character.Colliders.Where(c => c.RaycastType == RaycastType.SIDE_LEFT).OrderByDescending(c => c.WorldPosition.y).FirstOrDefault();
     return(this);
 }
Пример #2
0
 /// <summary>
 /// Called to determine if collision should be ignored. Use for one way platforms or z-ordered platforms
 /// like those found in loops.
 /// </summary>
 /// <returns><c>true</c>, if Collision should be ignored, <c>false</c> otherwise.</returns>
 /// <param name="character">Character.</param>
 /// <param name="collider">Collider.</param>
 override public bool IgnoreCollision(Character character, BasicRaycast collider)
 {
     if (character.ZLayer != zLayer)
     {
         return(true);
     }
     return(false);
 }
Пример #3
0
 /// <summary>
 /// Called to determine if collision should be ignored.
 /// </summary>
 /// <returns>true when active</returns>
 /// <c>false</c>
 /// <param name="character">Character.</param>
 /// <param name="collider">Collider.</param>
 override public bool IgnoreCollision(Character character, BasicRaycast collider)
 {
     // Ignore all collissions when active
     if (Activated)
     {
         return(true);
     }
     if (base.IgnoreCollision(character, collider))
     {
         return(true);
     }
     return(false);
 }
Пример #4
0
 /// <summary>
 /// Called to determine if collision should be ignored.
 /// </summary>
 /// <returns>true</returns>
 /// <c>false</c>
 /// <param name="character">Character.</param>
 /// <param name="collider">Collider.</param>
 override public bool IgnoreCollision(Character character, BasicRaycast collider)
 {
     if (base.IgnoreCollision(character, collider))
     {
         return(true);
     }
     if (collider.RaycastType == RaycastType.FOOT &&
         Mathf.Abs(collider.WorldExtent.x - character.transform.position.x) < ignoreColliderDistance &&
         ShouldStartClimb(character, collider) && ShouldStartDescent(character, collider))
     {
         return(false);
     }
     return(true);
 }
Пример #5
0
 /// <summary>
 /// Called to determine if collision should be ignored. Use for one way platforms or z-ordered platforms
 /// like those found in loops.
 /// </summary>
 /// <returns><c>true</c>, if Collision should be ignored, <c>false</c> otherwise.</returns>
 /// <param name="character">Character.</param>
 /// <param name="collider">Collider.</param>
 virtual public bool IgnoreCollision(Character character, BasicRaycast collider)
 {
     if (conditions != null)
     {
         foreach (AdditionalCondition condition in conditions)
         {
             if (!condition.CheckCondition(character, collider))
             {
                 return(true);
             }
         }
     }
     return(false);
 }
 /// <summary>
 /// Called to determine if collision should be ignored. Use for one way platforms or z-ordered platforms
 /// like those found in loops.
 /// </summary>
 /// <returns><c>true</c>, if Collision should be ignored, <c>false</c> otherwise.</returns>
 /// <param name="character">Character.</param>
 /// <param name="collider">Collider.</param>
 override public bool IgnoreCollision(Character character, BasicRaycast collider)
 {
     if (collider.RaycastType == RaycastType.FOOT && ignoreFeet)
     {
         return(true);
     }
     if (collider.RaycastType == RaycastType.HEAD && ignoreHead)
     {
         return(true);
     }
     if (collider.RaycastType == RaycastType.SIDE_LEFT && ignoreLeft)
     {
         return(true);
     }
     if (collider.RaycastType == RaycastType.SIDE_RIGHT && ignoreRight)
     {
         return(true);
     }
     return(false);
 }
        /// <summary>
        /// Initialise the movement with the given movement data.
        /// </summary>
        /// <param name="character">Character.</param>
        /// <param name="movementData">Movement data.</param>
        override public Movement Init(Character character, MovementVariable[] movementData)
        {
            AssignReferences(character);

            if (movementData != null && movementData.Length == MovementVariableCount)
            {
                RequiredColliders      = movementData[RequiredCollidersIndex].IntValue;
                controlType            = (WallJumpControlType)movementData[ControlTypeIndex].IntValue;
                jumpHeight             = movementData[JumpHeightIndex].FloatValue;
                controlLeeway          = movementData[ControlLeewayIndex].FloatValue;
                minSpeedForWallJump    = movementData[MinSpeedForWallJumpIndex].FloatValue;;
                clingGravity           = movementData[ClingGravityIndex].FloatValue;
                speedWhereWallJumpEnds = movementData[SpeedWhereWallJumpEndsIndex].FloatValue;
                initialVelocity        = Mathf.Sqrt(-2.0f * character.DefaultGravity * jumpHeight);
                clingTargetSpeed       = movementData[ClingTargetSpeedIndex].FloatValue;
            }
            else
            {
                Debug.LogError("Invalid movement data, not enough values.");
            }
            highestRightCollider = character.Colliders.Where(c => c.RaycastType == RaycastType.SIDE_RIGHT).OrderByDescending(c => c.WorldPosition.y).FirstOrDefault();
            highestLeftCollider  = character.Colliders.Where(c => c.RaycastType == RaycastType.SIDE_LEFT).OrderByDescending(c => c.WorldPosition.y).FirstOrDefault();
            return(this);
        }
        /// <summary>
        /// Initialise the movement with the given movement data.
        /// </summary>
        /// <param name="character">Character.</param>
        /// <param name="movementData">Movement data.</param>
        override public Movement Init(Character character, MovementVariable[] movementData)
        {
            this.character = character;

            if (movementData != null && movementData.Length == MovementVariableCount)
            {
                RequiredColliders        = movementData[RequiredCollidersIndex].IntValue;
                clingGravity             = movementData[ClingGravityIndex].FloatValue;
                gravityDelay             = movementData[GravityDelayIndex].FloatValue;
                jumpHeight               = movementData[JumpHeightIndex].FloatValue;
                ignoreClingAfterJumpTime = movementData[IgnoreClingAfterJumpTimeIndex].FloatValue;
                mustHoldToMaintainCling  = movementData[MustHoldToMaintainClingIndex].BoolValue;
                ignoreJumpTime           = movementData[IgnoreJumpTimeIndex].FloatValue;
            }
            else
            {
                Debug.LogError("Invalid movement data, not enough values.");
            }

            highestRightCollider = character.Colliders.Where(c => c.RaycastType == RaycastType.SIDE_RIGHT).OrderByDescending(c => c.WorldPosition.y).FirstOrDefault();
            highestLeftCollider  = character.Colliders.Where(c => c.RaycastType == RaycastType.SIDE_LEFT).OrderByDescending(c => c.WorldPosition.y).FirstOrDefault();

            return(this);
        }
Пример #9
0
        /// <summary>
        /// Should we start climbing stairs.
        /// </summary>
        /// <returns><c>true</c>, if we should start climbing, <c>false</c> otherwise.</returns>
        /// <param name="character">Character.</param>
        /// <param name="collider">Collider.</param>
        protected bool ShouldStartClimb(Character character, BasicRaycast collider)
        {
            // Already on stairs
            if (character.ActiveMovement is GroundMovement_Stairs)
            {
                return(true);
            }

            // Jumping up = don't stand on step
            if (character.ActiveMovement is AirMovement && character.Velocity.y >= 0)
            {
                return(false);
            }

            // Falling down = do stand on step
            if (character.ActiveMovement is AirMovement && character.Velocity.y < 0)
            {
                return(true);
            }

            // Always type
            if (bottomMountType == StairCollisionType.ALWAYS)
            {
                return(true);
            }

            int step = GetStepForPosition(character.transform.position);

            // At top of stairs, always true
            if (step == LastStep && stepDirection > 0)
            {
                return(true);
            }
            if (step == 1 && stepDirection < 0)
            {
                return(true);
            }

            // Hold down means dont climb up steps
            if (character.Input.VerticalAxisDigital == -1)
            {
                return(false);
            }

            if (step == 1 && stepDirection > 0)
            {
                // Facing direction
                if (character.FacingDirection != 1)
                {
                    return(false);
                }
                // Conditions met
                if (bottomMountType == StairCollisionType.WALK_DIRECTION || character.Input.VerticalAxisDigital == 1)
                {
                    return(true);
                }
            }
            else if (step == LastStep && stepDirection < 0)
            {
                // Facing direction
                if (character.FacingDirection != -1)
                {
                    return(false);
                }
                // Conditions met
                if (bottomMountType == StairCollisionType.WALK_DIRECTION || character.Input.VerticalAxisDigital == 1)
                {
                    return(true);
                }
            }
            return(false);
        }
Пример #10
0
 /// <summary>
 /// Called to determine if collision should be ignored. Use for one way platforms or z-ordered platforms
 /// like those found in loops.
 /// </summary>
 /// <returns><c>true</c>, if Collision should be ignored, <c>false</c> otherwise.</returns>
 /// <param name="character">Character.</param>
 /// <param name="collider">Collider.</param>
 override public bool IgnoreCollision(Character character, BasicRaycast collider)
 {
     // Override, don't use additional conditions here, on a door additional conditions apply to openeing the door.
     return(false);
 }
Пример #11
0
 /// <summary>
 /// Called to determine if collision should be ignored. Use for one way platforms or z-ordered platforms
 /// like those found in loops.
 /// </summary>
 /// <returns><c>true</c>, if Collision should be ignored, <c>false</c> otherwise.</returns>
 /// <param name="character">Character.</param>
 /// <param name="collider">Collider.</param>
 virtual public bool IgnoreCollision(Character character, BasicRaycast collider)
 {
     return(false);
 }