public void Move(float distance) { if (distance == 0) { return; } RailSection rails = GetRailSectionUnder(transform); List <Vector3> backbone = rails.GetBackbonePoints(rails); foreach (var section in rails.GetAdjacentSections()) { backbone.AddRange(section.GetBackbonePoints(rails)); } Vector3 fwd = transform.TransformVector(Vector3.forward * distance); backbone.Sort(delegate(Vector3 v1, Vector3 v2) { return(Vector3.Dot(v1, fwd).CompareTo(Vector3.Dot(v2, fwd))); }); if (GetComponent <LineRenderer>() != null) { GetComponent <LineRenderer>().SetVertexCount(backbone.Count); GetComponent <LineRenderer>().SetPositions(backbone.ToArray()); } Vector3 bogieFwdMoved, bogieBwdMoved; Quaternion bogieFwdRotated, bogieBwdRotated; MoveBogie(backbone, bogieFwd.transform, distance, out bogieFwdMoved, out bogieFwdRotated); MoveBogie(backbone, bogieBwd.transform, distance, out bogieBwdMoved, out bogieBwdRotated); transform.position = (bogieFwdMoved + bogieBwdMoved) / 2 + new Vector3(0, -0.072f, 0); transform.rotation = Quaternion.LookRotation(bogieFwdMoved - bogieBwdMoved, Vector3.up); bogieBwd.transform.rotation = Quaternion.Slerp(bogieBwd.transform.rotation, bogieBwdRotated, Time.deltaTime); bogieFwd.transform.rotation = Quaternion.Slerp(bogieFwd.transform.rotation, bogieFwdRotated, Time.deltaTime); }