I’ll use a 2 x 2 x 2 Array as an example
8 possible locations and 8 unique cubes.
The possible locations are Binary
XYZ is the position of the cube, I is the index
If I perform a Right rotation in the clockwise direction
Every cube with an X value of 1 will be rotated clockwise.
This will shift the cubes with index 1,3,5 and 7.
(1) 100 will go up (+Y) -> 110
(3) 110 will go away (+Z) -> 111
(7) 111 will go down (-Y) -> 101
(5) 101 will go towards (-Z) -> 100
Perform this transformation on your array and you get
You can use the same method for any rotation
Right, Left, Top, Bottom, Right Inverted, Left Inverted, Top Inverted, Bottom Inverted.
If your cube is of a larger size you have the base to add more rotation methods, but I’ll leave that up to you
As for the actual visible rotation, inside the same place you call the Array shifting method you can group the game objects that have an X value of 1.
Parent them together like ArkaneX suggest to an empty game object and rotate that object.
You must then break the heirarchy if a different rotation is required.
This is just how I would do it, there may be easier ways but I hope this gets you moving in the right direction.
//Class to control rubik's cube rotation
public class RubixScript : MonoBehaviour
public GameObject rubix;
private GameObject cubes;
private GameObject face;
private GameObject rightPivot;
private int i;
// Use this for initialisation
void Start ()
//All cubes tagged as Cube
cubes = GameObject.FindGameObjectsWithTag("Cube");
//9 cubes per face
face = new GameObject;
//Call RotateRight function
//Rotate the right face
i = 0;
//Create new pivot point
rightPivot = new GameObject("rightPivot");
//(2,1,1) is the center of my pivot point, this will change depending on rubiks cube size and individual cube size.
//For this example I used 1 unit per cube
//This point is also not world space relative, you would have to add the word space vector of the entire cube first.
rightPivot.transform.position = new Vector3(2,1,1);
//Set the parent of the transform to the entire cube
//This way if you rotate the entire cube the faces and the cubes inside them will follow this rotation
rightPivot.transform.parent = rubix.transform;
//Find right face cubes and set rightPivot as their parent
foreach(GameObject cube in cubes)
if(cube.transform.position.x == 2)
cube.transform.parent = rightPivot.transform;
cube.name = "Right Face Cube";
face *= cube;*
//Perform rotation gradually (To prove concept)*