void OnTriggerExit(Collider other) { if (!MTools.CollidersLayer(other, GroundLayer)) { return; //Ignore layers that are not Ground } HasTrack = false; // if the feet is on the air then can put a track }
void OnTriggerEnter(Collider other) { if (!MTools.CollidersLayer(other, GroundLayer)) { return; //Ignore layers that are not Ground } if (!waitrack) { StartCoroutine(WaitForStep()); //Wait Half a Second before making another Step m_StepsManager.EnterStep(this); HasTrack = true; } }
private void LateUpdate() { float targetDist = m_OriginalDist; // initially set the target distance m_Ray.origin = m_Pivot.position + m_Pivot.forward * sphereCastRadius; m_Ray.direction = -m_Pivot.forward; var cols = Physics.OverlapSphere(m_Ray.origin, sphereCastRadius); // initial check to see if start of spherecast intersects anything bool initialIntersect = false; bool hitSomething = false; for (int i = 0; i < cols.Length; i++) // loop through all the collisions to check if something we care about { if ((!cols[i].isTrigger) && !(MTools.CollidersLayer(cols[i], dontClip))) //is on a layer we don't want to clip { initialIntersect = true; break; } } if (initialIntersect) // if there is a collision { m_Ray.origin += m_Pivot.forward * sphereCastRadius; hits = Physics.RaycastAll(m_Ray, m_OriginalDist - sphereCastRadius); // do a raycast and gather all the intersections } else // if there was no collision do a sphere cast to see if there were any other collisions { hits = Physics.SphereCastAll(m_Ray, sphereCastRadius, m_OriginalDist + sphereCastRadius); } Array.Sort(hits, m_RayHitComparer); // sort the collisions by distance float nearest = Mathf.Infinity; // set the variable used for storing the closest to be as far as possible for (int i = 0; i < hits.Length; i++) // loop through all the collisions { // only deal with the collision if it was closer than the previous one, not a trigger, not in the Layer Mask if (hits[i].distance < nearest && (!hits[i].collider.isTrigger) && !MTools.CollidersLayer(hits[i].collider, dontClip)) { nearest = hits[i].distance; // change the nearest collision to latest targetDist = -m_Pivot.InverseTransformPoint(hits[i].point).z; hitSomething = true; } } if (hitSomething) // visualise the cam clip effect in the editor { Debug.DrawRay(m_Ray.origin, -m_Pivot.forward * (targetDist + sphereCastRadius), Color.red); } // hit something so move the camera to a better position protecting = hitSomething; m_CurrentDist = Mathf.SmoothDamp(m_CurrentDist, targetDist, ref m_MoveVelocity, m_CurrentDist > targetDist ? clipMoveTime : returnTime); m_CurrentDist = Mathf.Clamp(m_CurrentDist, closestDistance, m_OriginalDist); m_Cam.localPosition = -Vector3.forward * m_CurrentDist; }