Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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();
            }
        }