using System.Collections.Generic; using UnityEngine; [ExecuteInEditMode] public class MegaTrainFollow : MonoBehaviour { public MegaShape path; public int curve; public List carriages = new List(); public float distance; public float speed; public bool showrays; private void Update() { distance += speed * Time.deltaTime; if (!path) { return; } float num = distance; MegaSpline megaSpline = path.splines[curve]; for (int i = 0; i < carriages.Count; i++) { float num2 = num / megaSpline.length; MegaCarriage megaCarriage = carriages[i]; float twist = 0f; float twist2 = 0f; megaCarriage.b1 = path.transform.TransformPoint(path.InterpCurve3D(curve, num2, true, ref twist)); float num3 = num - megaCarriage.length; float num4 = num3 / megaSpline.length; megaCarriage.b2 = path.transform.TransformPoint(path.InterpCurve3D(curve, num4, true, ref twist2)); megaCarriage.cp = (megaCarriage.b1 + megaCarriage.b2) * 0.5f; if ((bool)megaCarriage.carriage) { megaCarriage.carriage.transform.position = megaCarriage.cp + megaCarriage.carriageOffset; Quaternion quaternion = Quaternion.Euler(megaCarriage.rot); Quaternion quaternion2 = Quaternion.LookRotation(megaCarriage.b1 - megaCarriage.b2); megaCarriage.carriage.transform.rotation = quaternion2 * quaternion; } if ((bool)megaCarriage.bogey1 && (bool)megaCarriage.carriage) { megaCarriage.bogey1.transform.position = megaCarriage.carriage.transform.localToWorldMatrix.MultiplyPoint(megaCarriage.bogey1Offset); Quaternion quaternion3 = Quaternion.Euler(megaCarriage.bogey1Rot); float num5 = num2 - megaCarriage.bogeyoff / megaSpline.length; megaCarriage.bp1 = path.transform.TransformPoint(path.InterpCurve3D(curve, num5, true)); Vector3 vector = path.transform.TransformPoint(path.InterpCurve3D(curve, num5 + 0.0001f, true)); Quaternion quaternion4 = Quaternion.LookRotation(vector - megaCarriage.bp1); megaCarriage.bogey1.transform.rotation = quaternion4 * quaternion3; } if ((bool)megaCarriage.bogey2 && (bool)megaCarriage.carriage) { megaCarriage.bogey2.transform.position = megaCarriage.carriage.transform.localToWorldMatrix.MultiplyPoint(megaCarriage.bogey2Offset); Quaternion quaternion5 = Quaternion.Euler(megaCarriage.bogey2Rot); float num6 = num4 + megaCarriage.bogeyoff / megaSpline.length; megaCarriage.bp2 = path.transform.TransformPoint(path.InterpCurve3D(curve, num6, true, ref twist)); Vector3 vector2 = path.transform.TransformPoint(path.InterpCurve3D(curve, num6 + 0.0001f, true)); Quaternion quaternion6 = Quaternion.LookRotation(vector2 - megaCarriage.bp2); megaCarriage.bogey2.transform.rotation = quaternion6 * quaternion5; } num -= megaCarriage.length; } } }