public Quaternion Rotation(float RailZ) { float localway; IRail segment = Way2Segment(RailZ, out localway); return(segment.Rotation(localway)); }
void Generate() { IRail Rail = railBehaviour as IRail; if (Rail == null) { Rail = RailManager.instance; } Mesh mesh = new Mesh(); Vector3[] originalverts = original.vertices.ToArray(); Vector3[] originalnorms = original.normals.ToArray(); /* * if (InvertYZ) * { * originalverts = originalverts.Select((vec) => { return new Vector3(-vec.x, vec.z, vec.y); }).ToArray(); * originalnorms = originalnorms.Select((vec) => { return new Vector3(-vec.x, vec.z, vec.y); }).ToArray(); * } */ List <Vector3> verts = new List <Vector3>(); List <int> triangles = new List <int>(); List <Vector2> uvs = new List <Vector2>(); List <Vector3> normals = new List <Vector3>(); List <Color> colors = new List <Color>(); for (int i = 0; i < Loop; i++) { verts.AddRange(originalverts.Select((Vector3 vec) => { vec.Scale(Scale); vec += OffSet + Span * i; vec.y += Rail.Height(vec.z); return(Rail.Local2World(vec)); })); triangles.AddRange(original.triangles.Select((int x) => { return(x + originalverts.Length * i); })); uvs.AddRange(original.uv.ToList()); normals.AddRange(originalnorms.Select((norm, index) => { Quaternion qt = Rail.Rotation(originalverts[index].z + OffSet.z + Span.z * i); return(qt * norm); })); colors.AddRange(original.colors.ToList()); } mesh.vertices = verts.ToArray(); mesh.triangles = triangles.ToArray(); mesh.uv = uvs.ToArray(); mesh.normals = normals.ToArray(); mesh.colors = colors.ToArray(); mesh.RecalculateBounds(); MeshFilter filter = GetComponent <MeshFilter>(); filter.sharedMesh = mesh; MeshCollider coll = GetComponent <MeshCollider>(); if (coll != null) { coll.sharedMesh = mesh; } }
void UpdateLocalPosition() { var w2l = rail.World2Local(transform.position); if (w2l == null) { Destroy(gameObject); return; } Position = w2l.Value; rigidbody.velocity = Vector3.zero; var newrot = rail.Rotation(Position.z); if (Quaternion.Angle(transform.rotation, newrot) > 30f) { Velocity = Quaternion.Inverse(newrot) * transform.rotation * Velocity; } transform.rotation = newrot; }