using UnityEngine; public class Spring : BasePart { public GameObject m_endPointPrefab; private Rigidbody m_connectedBody; private GameObject m_visualization; private Vector3 m_localConnectionPoint; private Vector3 m_remoteConnectionPoint; public override void Awake() { base.Awake(); m_visualization = base.transform.FindChild("SpringVisualization").gameObject; } private void Update() { if ((bool)base.rigidbody && (bool)m_connectedBody) { Vector3 vector = base.transform.TransformPoint(m_localConnectionPoint); Vector3 vector2 = m_connectedBody.transform.TransformPoint(m_remoteConnectionPoint); Debug.DrawRay(vector, vector2 - vector); Vector3 localScale = m_visualization.transform.localScale; localScale.y = Vector3.Distance(vector, vector2); m_visualization.transform.localScale = localScale; m_visualization.transform.position = 0.5f * (vector + vector2); } } public override Joint CustomConnectToPart(BasePart part) { ConfigurableJoint configurableJoint = base.gameObject.AddComponent(); configurableJoint.connectedBody = part.rigidbody; configurableJoint.angularXMotion = ConfigurableJointMotion.Locked; configurableJoint.angularYMotion = ConfigurableJointMotion.Locked; configurableJoint.angularZMotion = ConfigurableJointMotion.Locked; configurableJoint.xMotion = ConfigurableJointMotion.Locked; configurableJoint.yMotion = ConfigurableJointMotion.Limited; configurableJoint.zMotion = ConfigurableJointMotion.Locked; SoftJointLimit linearLimit = configurableJoint.linearLimit; linearLimit.limit = 0f; linearLimit.spring = 30f; linearLimit.bounciness = 0f; configurableJoint.linearLimit = linearLimit; m_connectedBody = part.rigidbody; m_localConnectionPoint = new Vector3(0f, 0.5f, 0f); m_remoteConnectionPoint = part.transform.InverseTransformPoint(base.transform.position - 0.5f * base.transform.up); return configurableJoint; } public void CreateSpringBody(Direction direction) { GameObject gameObject = (GameObject)Object.Instantiate(m_endPointPrefab, base.transform.position, base.transform.rotation); ConfigurableJoint configurableJoint = base.gameObject.AddComponent(); configurableJoint.connectedBody = gameObject.rigidbody; configurableJoint.angularXMotion = ConfigurableJointMotion.Locked; configurableJoint.angularYMotion = ConfigurableJointMotion.Locked; configurableJoint.angularZMotion = ConfigurableJointMotion.Locked; configurableJoint.xMotion = ConfigurableJointMotion.Locked; configurableJoint.yMotion = ConfigurableJointMotion.Limited; configurableJoint.zMotion = ConfigurableJointMotion.Locked; SoftJointLimit linearLimit = configurableJoint.linearLimit; linearLimit.limit = 0f; linearLimit.spring = 30f; linearLimit.bounciness = 0f; configurableJoint.linearLimit = linearLimit; gameObject.transform.parent = base.transform; m_connectedBody = gameObject.rigidbody; m_localConnectionPoint = new Vector3(0f, 0.5f, 0f); m_remoteConnectionPoint = gameObject.transform.InverseTransformPoint(base.transform.position - 0.5f * base.transform.up); } }