Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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. ");
                    }
                }
            }
        }
Exemplo n.º 4
0
 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);
        }