bool Set_Closest_SwingBall(Static_Track_Piece_CS pieceScript, float radius) { Transform bodyTransform = thisTransform.parent; Create_SwingBall_CS [] ballScripts = bodyTransform.GetComponentsInChildren <Create_SwingBall_CS> (); float minDist = radius; Transform closestBall = null; for (int i = 0; i < ballScripts.Length; i++) { ConfigurableJoint[] joints = ballScripts [i].GetComponentsInChildren <ConfigurableJoint> (); for (int j = 0; j < joints.Length; j++) { float tempDist = Vector3.Distance(pieceScript.transform.position, joints [j].transform.position); // Distance to the piece. if (tempDist < minDist) { closestBall = joints [j].transform; minDist = tempDist; } } } if (closestBall) { pieceScript.Type = 1; // Anchor pieceScript.Anchor_Transform = closestBall; pieceScript.Anchor_Parent_Name = closestBall.parent.name; pieceScript.Anchor_Name = closestBall.name; Switch_Both_Sides_Types(pieceScript); return(true); } else { return(false); } }
bool Set_Closest_DrivingWheel(Static_Track_Piece_CS pieceScript, float radius) { Transform bodyTransform = thisTransform.parent; Drive_Wheel_CS[] driveScripts = bodyTransform.GetComponentsInChildren <Drive_Wheel_CS>(); float minDist = radius; Transform closestWheel = null; for (int i = 0; i < driveScripts.Length; i++) { Transform connectedTransform = driveScripts [i].GetComponent <HingeJoint> ().connectedBody.transform; if (connectedTransform != bodyTransform) // The wheel is not directly connected with the MainBody. >> The wheel should be a roadwheel. { float tempDist = Vector3.Distance(pieceScript.transform.position, driveScripts [i].transform.position); // Distance to the piece. if (tempDist < minDist) { closestWheel = driveScripts [i].transform; minDist = tempDist; } } } if (closestWheel) { pieceScript.Type = 1; // Anchor. pieceScript.Anchor_Transform = closestWheel; pieceScript.Anchor_Parent_Name = closestWheel.parent.name; pieceScript.Anchor_Name = closestWheel.name; Switch_Both_Sides_Types(pieceScript); return(true); } else { return(false); } }
void Copy_To_Opposite(Static_Track_Piece_CS pieceScript) { serializedObject.ApplyModifiedProperties(); Transform parentTransform = thisTransform.parent; // Find the opposite piece. Transform oppositeTransform; if (pieceScript.Is_Left) //Left { oppositeTransform = parentTransform.Find(pieceScript.name.Replace("_L", "_R")); } else //Right { oppositeTransform = parentTransform.Find(pieceScript.name.Replace("_R", "_L")); } if (oppositeTransform == null) { return; } // Copy the values. Static_Track_Piece_CS oppositeScript = oppositeTransform.GetComponent <Static_Track_Piece_CS> (); oppositeScript.Type = pieceScript.Type; if (oppositeScript.Type == 1) // Anchor { if (pieceScript.Anchor_Transform) { string oppositeAnchorParentName = pieceScript.Anchor_Parent_Name; string oppositeAnchorName = pieceScript.Anchor_Name; if (pieceScript.Is_Left) //Left { oppositeAnchorName = oppositeAnchorName.Replace("_L", "_R"); } else //Right { oppositeAnchorName = oppositeAnchorName.Replace("_R", "_L"); } Transform oppositeAnchorTransform = parentTransform.parent.Find(oppositeAnchorParentName + "/" + oppositeAnchorName); if (oppositeAnchorTransform) { oppositeScript.Anchor_Transform = oppositeAnchorTransform; oppositeScript.Anchor_Parent_Name = oppositeAnchorParentName; oppositeScript.Anchor_Name = oppositeAnchorName; } else { Debug.LogWarning("The opposite anchor cannot be found. "); } } } }
void Switch_Both_Sides_Types(Static_Track_Piece_CS pieceScript) { // If the front and rear pieces are 'Static' type, change them to 'Dynamic' type. if (pieceScript.Front_Script.Type == 0) // Static >> { pieceScript.Front_Script.Type = 2; // Dynamic Copy_To_Opposite(pieceScript.Front_Script); } if (pieceScript.Rear_Script.Type == 0) // Static >> { pieceScript.Rear_Script.Type = 2; // Dynamic Copy_To_Opposite(pieceScript.Rear_Script); } }
void Switch_Both_Sides_Types(Static_Track_Piece_CS pieceScript) { // If the front and rear pieces are 'Static' type, change them to 'Dynamic' type. serializedObject.ApplyModifiedProperties(); if (pieceScript.Front_Script.Type == 0) // Static >> { pieceScript.Front_Script.Type = 2; // Dynamic Copy_To_Opposite(pieceScript.Front_Script); } if (pieceScript.Rear_Script.Type == 0) // Static >> { pieceScript.Rear_Script.Type = 2; // Dynamic Copy_To_Opposite(pieceScript.Rear_Script); } }
void Find_Closest_Piece() { Transform thisTransform = Selection.activeGameObject.transform; // Find the closest piece. Static_Track_Piece_CS[] pieceScripts = thisTransform.parent.parent.GetComponentsInChildren <Static_Track_Piece_CS> (); if (pieceScripts.Length == 0) // This track might be a "Scroll_Track". { Debug.Log("The 'Linked Piece' is not necessary for 'Scroll_Track'. The script has set only the direction."); // Set the direction. Set_Direction(false); return; } float minDist = Mathf.Infinity; Static_Track_Piece_CS closestPieceScript = null; foreach (Static_Track_Piece_CS pieceScript in pieceScripts) { float tempDist = Vector3.Distance(thisTransform.position, pieceScript.transform.position); if (tempDist < minDist) { minDist = tempDist; closestPieceScript = pieceScript; } } if (closestPieceScript == null) { Debug.LogWarning("The closest piece cannot be found."); return; } Linked_Piece_ScriptProp.objectReferenceValue = closestPieceScript as Static_Track_Piece_CS; // Set the position Transform closestPieceTransform = closestPieceScript.transform; Vector3 pos = thisTransform.position; pos.x = closestPieceTransform.position.x; pos.z = (closestPieceTransform.position - (closestPieceTransform.transform.up * 0.1f)).z; thisTransform.position = pos; // Set the rotation Vector3 rot = thisTransform.localEulerAngles; rot.z = 0.0f; thisTransform.localEulerAngles = rot; // Set the scale. Vector3 tempScale = thisTransform.localScale; CapsuleCollider[] capsuleColliders = closestPieceTransform.GetComponents <CapsuleCollider> (); for (int i = 0; i < capsuleColliders.Length; i++) { if (capsuleColliders [i].direction == 0) // X-Axis. { if (thisTransform.parent.localEulerAngles.z == 90.0f) // in Static_Track { tempScale.y = capsuleColliders [i].height; } else // in Scroll_Track { tempScale.x = capsuleColliders [i].height; } } else // Z-Axis. { if (thisTransform.parent.localEulerAngles.z == 90.0f) // in Static_Track { tempScale.x = capsuleColliders [i].height * 2.0f; } else // in Scroll_Track { tempScale.y = capsuleColliders [i].height * 2.0f; } } } thisTransform.localScale = tempScale; // Set the direction. Set_Direction(true); }