/// <summary> /// Start climbing trigger. /// </summary> private void StartClimbing() { a.SetBool(AnimatorConditions.CanWalk, false); a.SetTrigger(AnimatorConditions.Hang, true); state = climb_state.Hang; StartCoroutine(SetClimbPosition()); }
/// <summary> /// Climbing mechanic. /// Input is needed to switch from hang to to climb state. /// </summary> private void Hanging() { float diff = Vector3.Angle(pm.InputDirection, climb_vector); if (diff < 30f) { if (climb_will >= ClimbAtWill) { state = climb_state.Climb; a.SetTrigger(AnimatorConditions.Climb, true); climb_will = 0f; } else { if (IsHangPlaying && !a.IsInTransition(a.GetDominantLayer())) climb_will += Time.deltaTime; } } else if (diff > 135f) { if (climb_will >= LowerAtWill) { state = climb_state.Drop; transform.position = transform.position + (-transform.forward * 0.5f) + (-transform.up * 0.735f); a.SetTrigger(AnimatorConditions.Drop, true); climb_will = 0f; } else { if (IsHangPlaying && !a.IsInTransition(a.GetDominantLayer())) climb_will += Time.deltaTime; } } else { climb_will -= Time.deltaTime; } climb_will = Mathf.Clamp(climb_will, 0f, LowerAtWill); }
/// <summary> /// Climb controls /// </summary> private void Climb() { if (IsClimbPlaying) climb_was_playing = true; if (climb_was_playing && !IsClimbPlaying) { climb_was_playing = false; state = climb_state.None; a.SetBool(AnimatorConditions.CanWalk, true); } }
/// <summary> /// Drop controls /// </summary> private void Dropping() { if (pm.IsGrounded) { state = climb_state.None; a.SetBool(AnimatorConditions.CanWalk, true); } }
/// <summary> /// Start process to climb /// </summary> void ExecuteClimb(Collision col) { if (col.contacts.Length > 0) { Vector3 rotation = -col.contacts[0].normal; rotation.y = 0f; //Make a reaycast to get a position to climb up to Vector3 start_down = col.contacts[0].point + (Vector3.up * max_climb_height) + (rotation * step_from_edge); Vector3 dir_down = -Vector3.up; Ray ray_down = new Ray(start_down, dir_down); RaycastHit hit_down = new RaycastHit(); if (Physics.Raycast(ray_down, out hit_down, max_climb_height * 2f, LayerMask.GetMask(Layers.Geometry))) { float diff = hit_down.point.y - transform.position.y; if (diff < MaximumStepSize && diff > MinimumStepSize && state == climb_state.None && !j.IsJumping) { jam = new jump_match(hit_down.point - (Vector3.up * 0.735f), Quaternion.LookRotation(rotation), 0f, 0.8f); jtm = new jump_match(hit_down.point, transform.rotation, 0.8f, 1f); PrepareClimbing(hit_down.point, rotation); state = climb_state.Jump; a.SetTrigger(AnimatorConditions.JumpEdge, true); } else if (diff < MinimumStepSize || (j.IsJumping && diff < MaximumStepSize)) { transform.SetParent(col.collider.transform, true); PrepareClimbing(hit_down.point, rotation); StartClimbing(); } } } }