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 } } }
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 } }
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; } }