Пример #1
0
 /// <summary>
 /// Start climbing trigger.
 /// </summary>
 private void StartClimbing()
 {
     a.SetBool(AnimatorConditions.CanWalk, false);
     a.SetTrigger(AnimatorConditions.Hang, true);
     state = climb_state.Hang;
     StartCoroutine(SetClimbPosition());
 }
Пример #2
0
 /// <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);
 }
Пример #3
0
 /// <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);
     }
 }
Пример #4
0
 /// <summary>
 /// Drop controls
 /// </summary>
 private void Dropping()
 {
     if (pm.IsGrounded)
     {
         state = climb_state.None;
         a.SetBool(AnimatorConditions.CanWalk, true);
     }
 }
Пример #5
0
 /// <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();
             }
         }
     }        
 }