70 lines
2.8 KiB
C#
70 lines
2.8 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
[ExecuteInEditMode]
|
|
public class MegaTrainFollow : MonoBehaviour
|
|
{
|
|
public MegaShape path;
|
|
|
|
public int curve;
|
|
|
|
public List<MegaCarriage> carriages = new List<MegaCarriage>();
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|