Exemple #1
0
    private void OnTransit(Transit transit, Transit.TransitState state, float progress)
    {
        if (state == Transit.TransitState.Finished)
        {
            // trigger at next update
            nextTime = Time.time;
            waiting  = false;
            Destroy(tunnel);
            tunnel = null;
            if (currentReef != null)
            {
                Destroy(currentReef);
            }
            currentReef = nextReef;
            nextReef    = null;
        }
        else
        {
            // TODO: When should the next reef be instantiated and old one destroyed? Immediately? Part way through the tunnel?
            if (nextReef == null)
            {
                // put reef in wrapper object positioned relative to transit destination
                nextReef = new GameObject("Reef Wrapper");
                nextReef.transform.parent = reefs.transform;
                GameObject reef = Instantiate(ReefPrefabs[ReefVisitIndex]);
                ReefVisitIndex = (ReefVisitIndex + 1) % ReefPrefabs.Length;
                ReefVisitCount++;
                reef.transform.parent = nextReef.transform;

                /*MeshRenderer renderer = reef.GetComponent<MeshRenderer>();
                 * if (renderer != null) {
                 *      renderer.material.color = new Color(Random.value, Random.value, Random.value, 1.0f);
                 * }*/

                activeStages.Clear();
                IReefVisitor[] visitors = reef.GetComponentsInChildren <IReefVisitor>();
                for (int i = 0, n = visitors.Length; i < n; i++)
                {
                    ReefStage stage = new ReefStage(this, activeStages);
                    activeStages.Add(stage);
                    visitors[i].visitingReef(stage);
                }

                // Place reef a bit past where transit will end
                Vector3 dir = transit.FinalPosition - transit.ExitPosition;
                dir.Normalize();
                Vector3 pos = transit.FinalPosition + 4 * dir;
                nextReef.transform.position = pos;
                // TODO: Rotate reef so it's facing the player
            }
        }
    }
Exemple #2
0
    private void OnTransit(Transit transit, Transit.TransitState state, float progress)
    {
        if (state == Transit.TransitState.Entering && !tubeAdded)
        {
            tubeAdded = true;

            GameObject tube   = new GameObject("tube");
            MeshFilter filter = tube.AddComponent <MeshFilter>();
            TubeMesh.generateTube(filter.mesh);

            MeshRenderer renderer = tube.AddComponent <MeshRenderer>();
            renderer.receiveShadows    = false;
            renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;

            if (TubeMaterial == null)
            {
                renderer.material.color = Color.red;
            }
            else
            {
                renderer.material = TubeMaterial;
            }

            /*
             * tube = GameObject.CreatePrimitive(PrimitiveType.Mes);
             * tube.GetComponent<MeshRenderer>().material.color = Color.red;
             * scale.x = DefaultDiameter;
             * scale.z = DefaultDiameter;*/

            // position tube between transit's enter and exit positions
            // Assumes tube is oriented along y dimension with ends at y=0 and y=1.
            Vector3   offset = transit.ExitPosition - transit.EnterPosition;
            Vector3   scale  = new Vector3(1f, offset.magnitude, 1f);
            Transform t      = tube.transform;
            t.position   = transit.EnterPosition;
            t.up         = offset;
            t.localScale = scale;
            t.parent     = gameObject.transform;
        }
        else if (state == Transit.TransitState.Finished)
        {
            // will be destroyed automatically at end
        }
    }
Exemple #3
0
    private void OnTransit(Transit transit, Transit.TransitState state, float progress)
    {
        if (state == Transit.TransitState.Entering && !tubeAdded)
        {
            tubeAdded = true;

            GameObject tube   = new GameObject("tube");
            MeshFilter filter = tube.AddComponent <MeshFilter>();

            List <TubePoint> points = new List <TubePoint>();
            CubicBezier      curve  = transit.Curve;

            for (float t = 0f; t < 1f; t += 0.2f)
            {
                points.Add(new TubePoint(curve.position(t), curve.derivative(t), calcRadius(t)));
            }
            points.Add(new TubePoint(curve.position(1), curve.derivative(1), calcRadius(1)));

            /*foreach (TubePoint p in points) {
             *      Debug.Log(p.position + " " + p.derivative + " " + p.radius);
             * }*/

            TubeMesh.generateTubes(filter.mesh, points, 8);

            MeshRenderer renderer = tube.AddComponent <MeshRenderer>();
            renderer.receiveShadows    = false;
            renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;

            if (TubeMaterial == null)
            {
                renderer.material.color = Color.red;
            }
            else
            {
                renderer.material = TubeMaterial;
            }
            tube.transform.parent = gameObject.transform;
        }
        else if (state == Transit.TransitState.Finished)
        {
            // will be destroyed automatically at end
        }
    }
    // Simply LERP the position through the transit. This won't be smooth.
    private void OnTransit(Transit transit, Transit.TransitState state, float progress)
    {
        if (bodyTransform == null)
        {
            bodyTransform = transit.Body.transform;
        }

        switch (state)
        {
        case Transit.TransitState.Entering:
            bodyTransform.position = Vector3.Lerp(transit.StartPosition, transit.EnterPosition, transit.EnterProgress);
            break;

        case Transit.TransitState.InProgress:
            bodyTransform.position = transit.Curve.position(progress);
            break;

        case Transit.TransitState.Exiting:
            bodyTransform.position = Vector3.Lerp(transit.ExitPosition, transit.FinalPosition, transit.ExitProgress);
            break;
        }
    }