public float GetPointDistance() { switch (segment.axis) { case LevelSegment.Axis.X: return(segment.GetBounds().size.x / (controlPointsPerSegment - 1)); case LevelSegment.Axis.Y: return(segment.GetBounds().size.y / (controlPointsPerSegment - 1)); case LevelSegment.Axis.Z: return(segment.GetBounds().size.z / (controlPointsPerSegment - 1)); } return(0f); }
public static void DrawBounds(LevelSegment segment) { if (segment.alwaysDraw) { return; } TS_Bounds bound = segment.GetBounds(); Transform trs = segment.transform; Vector3 a = trs.TransformPoint(bound.min); Vector3 b = trs.TransformPoint(new Vector3(bound.max.x, bound.min.y, bound.min.z)); Vector3 c = trs.TransformPoint(new Vector3(bound.max.x, bound.min.y, bound.max.z)); Vector3 d = trs.TransformPoint(new Vector3(bound.min.x, bound.min.y, bound.max.z)); Vector3 e = trs.TransformPoint(new Vector3(bound.min.x, bound.max.y, bound.min.z)); Vector3 f = trs.TransformPoint(new Vector3(bound.max.x, bound.max.y, bound.min.z)); Vector3 g = trs.TransformPoint(new Vector3(bound.max.x, bound.max.y, bound.max.z)); Vector3 h = trs.TransformPoint(new Vector3(bound.min.x, bound.max.y, bound.max.z)); Handles.color = Color.green; Handles.DrawLine(a, b); Handles.DrawLine(b, c); Handles.DrawLine(c, d); Handles.DrawLine(d, a); Handles.DrawLine(e, f); Handles.DrawLine(f, g); Handles.DrawLine(g, h); Handles.DrawLine(h, e); Handles.DrawLine(a, e); Handles.DrawLine(b, f); Handles.DrawLine(c, g); Handles.DrawLine(d, h); }
IEnumerator CreateSegment() { while (!levels[levelIndex].isReady && !testMode) { yield return(null); } HandleLevelChange(); while (LevelSegment.generationState != LevelSegment.GenerationState.Idle) { yield return(null); } if (levels[levelIndex].IsDone() && !testMode) { yield break; } LevelSegment segment = null; if (testMode) { GameObject go = Instantiate(debugSegments[Random.Range(0, debugSegments.Length)]); segment = go.GetComponent <LevelSegment>(); } else { segment = levels[levelIndex].InstantiateSegment(); } Transform segmentTrs = segment.transform; Vector3 spawnPos = segmentTrs.position; Quaternion spawnRot = segmentTrs.rotation; if (segments.Count > 0) { SplineSample lastSegmentEndResult = new SplineSample(); _segments[_segments.Count - 1].Evaluate(1.0, lastSegmentEndResult); spawnPos = lastSegmentEndResult.position; spawnRot = lastSegmentEndResult.rotation; switch (segment.axis) { case LevelSegment.Axis.X: spawnRot = Quaternion.AngleAxis(90f, Vector3.up) * spawnRot; break; case LevelSegment.Axis.Y: spawnRot = Quaternion.AngleAxis(90f, Vector3.right) * spawnRot; break; } } segmentTrs.position = spawnPos; if (segment.objectProperties[0].extrusionSettings.applyRotation) { segmentTrs.rotation = spawnRot; } if (segment.type == LevelSegment.Type.Extruded) { switch (segment.axis) { case LevelSegment.Axis.X: segment.transform.position += segment.transform.right * segment.GetBounds().size.x; break; case LevelSegment.Axis.Y: segment.transform.position += segment.transform.up * segment.GetBounds().size.y; break; case LevelSegment.Axis.Z: segment.transform.position += segment.transform.forward * segment.GetBounds().size.z; break; } } if (_segments.Count > 0) { segment.previous = _segments[_segments.Count - 1]; } segment.level = levels[levelIndex]; if (segment.type == LevelSegment.Type.Custom) { Quaternion entranceRotationDelta = segment.customEntrance.rotation * Quaternion.Inverse(spawnRot); segment.transform.rotation = segment.transform.rotation * Quaternion.Inverse(entranceRotationDelta); if (segment.customKeepUpright) { segment.transform.rotation = Quaternion.FromToRotation(segment.customEntrance.up, Vector3.up) * segment.transform.rotation; } Vector3 entranceOffset = segment.transform.position - segment.customEntrance.position; segment.transform.position = spawnPos + entranceOffset; } if (segmentIndex == int.MaxValue) { segmentIndex = 2; } segment.Initialize(segmentIndex++); segment.transform.parent = transform; currentPathGenerator.GeneratePath(segment); _segments.Add(segment); //Remove old segments if (type == Type.Infinite && _segments.Count > maxSegments) { StartCoroutine(CleanupRoutine()); } if (levels[levelIndex].IsDone() && !testMode) { if (levelIteration == LevelIteration.Ordered && levelIndex >= levels.Length - 1) { if (onLevelsDepleted != null) { onLevelsDepleted(); } yield break; } if (levelIteration == LevelIteration.None) { if (onLevelsDepleted != null) { onLevelsDepleted(); } yield break; } NextLevel(); } }