예제 #1
0
 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
 }
예제 #2
0
 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;
     }
 }
예제 #3
0
        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;
        }