public RailPathGenerator(TerrainGenerator terrain) { Terrain = terrain; CurrentAngle = 0f; CurrentPoint = new RailPathPoint(new Vector3(0f, Terrain.GetElevation(new Vector2(0f, 0f)), 0f), null); PathPoints.Add(CurrentPoint); RailSettings = new RailSettings(plankWidth: 3f, plankHeight: 0.2f, trackWidth: 0.1f, trackGap: 1.5f, trackHeight: 0.2f); }
private static void GenerateTrack(GameObject segmentObject, RailPathPoint p1, RailPathPoint p2, RailSettings settings, Vector3 fromVectorPpc, Vector3 toVectorPpc, float offset) { GameObject trackObject = new GameObject("Track"); trackObject.layer = LayerMask.NameToLayer("Ground"); trackObject.transform.SetParent(segmentObject.transform); MeshFilter meshFilter = trackObject.AddComponent <MeshFilter>(); MeshRenderer meshRenderer = trackObject.AddComponent <MeshRenderer>(); Vector3[] vertices = new Vector3[0]; int[] triangles = new int[0]; Vector3 heightOffsetUpper = new Vector3(0f, settings.TrackHeight + settings.PlankHeight, 0f); Vector3 heightOffsetLower = new Vector3(0f, settings.PlankHeight, 0f); // Left Side List <Vector3> leftSide = new List <Vector3>() { p2.Position + (toVectorPpc * offset) + heightOffsetUpper, p1.Position + (fromVectorPpc * offset) + heightOffsetUpper, p1.Position + (fromVectorPpc * offset) + heightOffsetLower, p2.Position + (toVectorPpc * offset) + heightOffsetLower, }; MeshGenerator.AddPlane(ref vertices, ref triangles, leftSide); // Right Side List <Vector3> rightSide = new List <Vector3>() { p1.Position + (fromVectorPpc * (offset + settings.TrackWidth)) + heightOffsetUpper, p2.Position + (toVectorPpc * (offset + settings.TrackWidth)) + heightOffsetUpper, p2.Position + (toVectorPpc * (offset + settings.TrackWidth)) + heightOffsetLower, p1.Position + (fromVectorPpc * (offset + settings.TrackWidth)) + heightOffsetLower, }; MeshGenerator.AddPlane(ref vertices, ref triangles, rightSide); // Top Side List <Vector3> topSide = new List <Vector3>() { p1.Position + (fromVectorPpc * offset) + heightOffsetUpper, p2.Position + (toVectorPpc * offset) + heightOffsetUpper, p2.Position + (toVectorPpc * (offset + settings.TrackWidth)) + heightOffsetUpper, p1.Position + (fromVectorPpc * (offset + settings.TrackWidth)) + heightOffsetUpper, }; MeshGenerator.AddPlane(ref vertices, ref triangles, topSide); meshFilter.mesh.vertices = vertices; meshFilter.mesh.triangles = triangles; meshFilter.mesh.RecalculateNormals(); meshRenderer.material = MaterialHandler.Instance.DefaultMaterial; meshRenderer.material.color = MaterialHandler.Instance.RailTrackColor; trackObject.AddComponent <MeshCollider>(); }
public void Init(RailPathPoint from, RailPathPoint to, RailSettings settings) { FromPoint = from; ToPoint = to; Settings = settings; SegmentVector = ToPoint.Position - FromPoint.Position; Angle = Vector2.SignedAngle(new Vector2(SegmentVector.x, SegmentVector.z), Vector2.up); Angle = (Angle > 180) ? Angle + 360 : Angle; FromPoint.Segments.Add(this); ToPoint.Segments.Add(this); ConnectedSegments = new List <RailSegment>(); }
public static RailSegment GenerateRailSegment(GameObject railPathObject, RailPathPoint p1, RailPathPoint p2, RailSettings settings) { GameObject railSegmentObject = new GameObject("RailSegment"); railSegmentObject.transform.SetParent(railPathObject.transform); RailSegment railSegment = railSegmentObject.AddComponent <RailSegment>(); Vector3 toVector = p2.Position - p1.Position; Vector3 toVectorPpc = (Quaternion.Euler(0, 90, 0) * new Vector3(toVector.x, 0f, toVector.z)).normalized; // PPC = perpendicular (90°) Vector3 fromVector = p1.PreviousPoint != null ? p1.Position - p1.PreviousPoint.Position : toVector; Vector3 fromVectorPpc = (Quaternion.Euler(0, 90, 0) * new Vector3(fromVector.x, 0f, fromVector.z)).normalized; float offsetLeft = -(settings.TrackGap / 2 + settings.TrackWidth); float offsetRight = settings.TrackGap / 2; GenerateTrack(railSegmentObject, p1, p2, settings, fromVectorPpc, toVectorPpc, offsetLeft); GenerateTrack(railSegmentObject, p1, p2, settings, fromVectorPpc, toVectorPpc, offsetRight); GeneratePlank(railSegmentObject, p1, p2, settings, toVector, toVectorPpc); return(railSegment); }
private static void GeneratePlank(GameObject segmentObject, RailPathPoint p1, RailPathPoint p2, RailSettings settings, Vector3 toVector, Vector3 toVectorPpc) { GameObject plankObject = MeshGenerator.CreateEmptyObject("Plank", "Ground", segmentObject.transform); Vector3[] vertices = new Vector3[0]; int[] triangles = new int[0]; Vector3 frontOrigin = p1.Position + toVector / 3f; Vector3 backOrigin = p1.Position + toVector / 3f * 2f; Vector3 heightOffset = new Vector3(0f, settings.PlankHeight, 0f); Vector3 leftBackTop = backOrigin - (toVectorPpc * settings.PlankWidth / 2f) + heightOffset; Vector3 rightBackTop = backOrigin + (toVectorPpc * settings.PlankWidth / 2f) + heightOffset; Vector3 rightFrontTop = frontOrigin + (toVectorPpc * settings.PlankWidth / 2f) + heightOffset; Vector3 leftFrontTop = frontOrigin - (toVectorPpc * settings.PlankWidth / 2f) + heightOffset; Vector3 leftBackBot = backOrigin - (toVectorPpc * settings.PlankWidth / 2f); Vector3 rightBackBot = backOrigin + (toVectorPpc * settings.PlankWidth / 2f); Vector3 rightFrontBot = frontOrigin + (toVectorPpc * settings.PlankWidth / 2f); Vector3 leftFrontBot = frontOrigin - (toVectorPpc * settings.PlankWidth / 2f); MeshGenerator.AddCuboid(ref vertices, ref triangles, leftBackTop, rightBackTop, rightFrontTop, leftFrontTop, leftBackBot, rightBackBot, rightFrontBot, leftFrontBot); MeshGenerator.ApplyMesh(plankObject, vertices, triangles, MaterialHandler.Instance.RailPlankColor); }
private void GeneratePathSegment() { float nextX = CurrentPoint.Position.x + (Mathf.Sin(Mathf.Deg2Rad * CurrentAngle) * RailSegmentLength); float nextZ = CurrentPoint.Position.z + (Mathf.Cos(Mathf.Deg2Rad * CurrentAngle) * RailSegmentLength); float elevation = Terrain.GetElevation(new Vector2(nextX, nextZ)); Vector3 newPosition = new Vector3(nextX, elevation, nextZ); RailPathPoint nextPoint = new RailPathPoint(newPosition, CurrentPoint); AddConnection(CurrentPoint, nextPoint); PathPoints.Add(nextPoint); CurrentPoint = nextPoint; float angleChange = Random.Range(0f, MaxCurveChange * 2f) - MaxCurveChange; CurrentCurve += angleChange; CurrentAngle += CurrentCurve; float elevationChange = Random.Range(0f, MaxSlopeChange * 2f) - MaxSlopeChange; CurrentSlope += elevationChange; CurrentElevation += CurrentSlope; }
private void AddConnection(RailPathPoint p1, RailPathPoint p2) { p1.AddConnection(p2); p2.AddConnection(p1); }
public void AddConnection(RailPathPoint point) { ConnectedPoints.Add(point); }
public RailPathPoint PreviousPoint; // point on main track leading here public RailPathPoint(Vector3 pos, RailPathPoint prevPoint) { Position = pos; PreviousPoint = prevPoint; }