/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }