Ejemplo n.º 1
0
 public void AddHeight(HeightState transition, double start, double end)
 {
     HeightTransition = transition;
     StartHeight      = start;
     EndHeight        = end;
     HeightStep       = (EndHeight - StartHeight) / _segmentCount;
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Set height of the controller based on the state of inputs
        /// </summary>
        /// <param name="state">The state to set the controller to</param>
        private void SetHeight(HeightState state)
        {
            float   oldHeight          = controller.Collider.height;
            float   newHeight          = heightStateToValue[state];
            Vector3 positionDifference = new Vector3(0, (newHeight - oldHeight), 0);

            controller.Collider.height  = newHeight;
            controller.Collider.center += positionDifference / 2;
            cameraHeightJoint.position += positionDifference;
            controller.Collider.radius  = radiusNormal - (heightToRadiusFactor * (int)state - 0.1f * (int)state);
        }
Ejemplo n.º 3
0
        bool isHeightObstructed(HeightState desiredState)
        {
            const float WIDTH_OFFSET = .001f;
            float       height       = getHeight(desiredState);

            if (height < m_CharacterController.height + HEIGHT_ERROR)
            {
                return(false);
            }

            Ray   ray      = new Ray(m_SimulatedPosition + Vector3.up * m_CharacterController.radius, Vector3.up);
            float distance = height - m_CharacterController.radius * 2 + m_HeightCheckDist + WIDTH_OFFSET;
            float radius   = m_CharacterController.radius - WIDTH_OFFSET;

            return(Physics.SphereCast(ray, radius, distance, Physics.AllLayers, QueryTriggerInteraction.Ignore));
        }
Ejemplo n.º 4
0
        float getHeight(HeightState state)
        {
            float height;

            switch (state)
            {
            case HeightState.standing:
                height = m_StandingHeight;
                break;

            case HeightState.crouched:
                height = m_CrouchedHeight;
                break;

            default:
                throw new System.NotImplementedException(state.ToString());
            }
            return(height);
        }
Ejemplo n.º 5
0
        IEnumerator lerpCharacterHeight(HeightState state)
        {
            float targetHeight = getHeight(heightState);

            // If target height is lower, it is guaranteed to be a valid height
            if (targetHeight < m_CharacterController.height + HEIGHT_ERROR)
            {
                m_PrevValidHeightState = state;
            }

            float duration = Mathf.Abs(targetHeight - m_CharacterController.height) / m_HeightDeltaRate;
            float t        = 0;

            while (t < 1)
            {
                t += Time.deltaTime / duration;
                setCharacterHeight(Mathf.Lerp(m_CharacterController.height, targetHeight, t));
                yield return(new WaitForEndOfFrame());
            }

            setCharacterHeight(targetHeight);
            m_HeightRoutine        = null;
            m_PrevValidHeightState = state;
        }
Ejemplo n.º 6
0
        private void GenerateRoad()
        {
            _roadParams = new RoadParameters
            {
                MaxHeight                = 900,
                MaxCurve                 = 400,
                Length                   = 12,
                NumberOfZones            = 12,
                Curvy                    = 0.8,
                Mountiany                = 0.8,
                NumberOfSegmentsPerZone  = 250,
                RoadSegmentSize          = 5,
                NumberOfSegmentsPerColor = 4,
                OffRoadOffset            = 130,
            };
            _roadParams.Length = _roadParams.NumberOfZones * _roadParams.NumberOfSegmentsPerZone;

            _road      = new List <RoadSegment>();
            _roadZones = new List <RoadZone>();

            HeightState currentStateHeight = HeightState.Flat;
            CurveState  currentStateCurve  = CurveState.Straight;

            var currentHeight = 0.0;
            var currentCurve  = 0.0;
            var zones         = _roadParams.NumberOfZones;

            while (zones-- > 0)
            {
                var zone = new RoadZone(_roadParams.NumberOfSegmentsPerZone);

                // Generate current zone
                var finalHeight = 0.0;
                switch (currentStateHeight)
                {
                case HeightState.Flat:
                {
                    finalHeight = 0.0;
                    break;
                }

                case HeightState.Up:
                {
                    finalHeight = _roadParams.MaxHeight * _random.NextDouble();
                    break;
                }

                case HeightState.Down:
                {
                    finalHeight = -_roadParams.MaxHeight * _random.NextDouble();
                    break;
                }
                }

                var finalCurve = 0.0;
                switch (currentStateCurve)
                {
                case CurveState.Straight:
                {
                    finalCurve = 0.0;
                    break;
                }

                case CurveState.Left:
                {
                    finalCurve = -_roadParams.MaxCurve * _random.NextDouble();
                    break;
                }

                case CurveState.Right:
                {
                    finalCurve = _roadParams.MaxCurve * _random.NextDouble();
                    break;
                }
                }

                zone.AddCurve(currentStateCurve, currentCurve, finalCurve);
                zone.AddHeight(currentStateHeight, currentHeight, finalHeight);

                for (int i = 0; i < _roadParams.NumberOfSegmentsPerZone; i++)
                {
                    var segment = new RoadSegment
                    {
                        Height        = zone.StartHeight + (zone.HeightStep * i),
                        Curve         = zone.StartCurve + (zone.CurveStep * i),
                        SegmentSprite = SelectSegmentSprite(i)
                    };

                    _road.Add(segment);
                    zone.AddSegment(segment);
                }

                currentHeight = finalHeight;
                currentCurve  = finalCurve;

                currentStateHeight = SelectNextZoneHeightTransition();
                currentStateCurve  = SelectNextZoneCurveTransition();

                _roadZones.Add(zone);
            }
        }