/// <summary>Promotes the specified object into a physical connector object.</summary> /// <remarks> /// The physics will immediately start on the object. If it doesn't have a rigidbody, the one will /// be created. /// </remarks> /// <param name="ownerModule">The part's module which will control the connector.</param> /// <param name="obj">The object to be promoted.</param> /// <param name = "interactionDistance"></param> public static KASInternalPhysicalConnector Promote( PartModule ownerModule, GameObject obj, float interactionDistance = 0) { var connectorRb = obj.GetComponent <Rigidbody>() ?? obj.AddComponent <Rigidbody>(); connectorRb.useGravity = false; connectorRb.isKinematic = ownerModule.part.packed; connectorRb.velocity = ownerModule.part.rb.velocity; connectorRb.angularVelocity = ownerModule.part.rb.angularVelocity; connectorRb.ResetInertiaTensor(); connectorRb.ResetCenterOfMass(); var connectorModule = obj.AddComponent <KASInternalPhysicalConnector>(); connectorModule.ownerModule = ownerModule; // Create the interaction collider if requested. if (interactionDistance > 0) { // This mesh is placed on a special layer which is not rendered in the game. It's only // used to detect the special zones triggers, so keep it simple. var interactionTriggerObj = Meshes.CreatePrimitive( PrimitiveType.Quad, Vector3.one, null, obj.transform); //interactionTriggerObj.SetActive(true); interactionTriggerObj.name = InteractionAreaCollider; var collider = interactionTriggerObj.AddComponent <SphereCollider>(); collider.isTrigger = true; collider.radius = interactionDistance; interactionTriggerObj.layer = (int)KspLayer.TriggerCollider; interactionTriggerObj.gameObject.GetComponent <Collider>().isTrigger = true; connectorModule.interactionTriggerObj = interactionTriggerObj; } return(connectorModule); }