public void AddHeight(HeightState transition, double start, double end) { HeightTransition = transition; StartHeight = start; EndHeight = end; HeightStep = (EndHeight - StartHeight) / _segmentCount; }
/// <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); }
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)); }
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); }
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; }
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); } }