# From zero to a complete Unity3D game: 3D Concentration using C# – step 3: multiple instances of the same object and camera movement

In this third step of the 3D concentration game we’ll see how to create multiple instances of an object, how to move the camera and how to add a background plane.

If you have missed them, check from zero to a complete Unity3D game: 3D Concentration using C# – step 1 for the bare bones and step 2: skinning and timing to know how to join game objects and handling timers.

Basically, at this point we have a tile which can be flipped but now we want an arbitrary number of tiles placed in rows and columns, moreover we want to place the camera in order to see all tiles no matter of their number, and a plane where to lie tiles.

It may seem a lot of things but actually it’s very easy, although I had to modify `Mainscript.cs` a bit:

```using UnityEngine;
using System.Collections;

public class MainScript : MonoBehaviour {

void Start () {
int rows=4;	// number of rows
int cols=5; // number of columns
int tileSpacing=1; // space between two tiles
int tileSize=2; // tile size
for(int i=0; i<rows; i++){
for(int j=0; j<cols; j++){
// a cube
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.localScale=new Vector3 (2,2,0.5f);
cube.renderer.material.color= new Color(255,0,0);
cube.transform.localPosition = new Vector3(3*j,3*i,0);
// attaching the quad to the cube
}
}
// the camera, we want to point on the middle of the board
float cameraX = ((cols-1)*tileSize+(cols-1)*tileSpacing)/2f;
float cameraY = ((rows-1)*tileSize+(rows-1)*tileSpacing)/2f;
// setting camera height, this should work with every number of tiles
float cameraZ = Mathf.Max(cols,rows)*-3f;
Camera.main.transform.localPosition = new Vector3(cameraX,cameraY,cameraZ);
// the ground
GameObject plane = GameObject.CreatePrimitive(PrimitiveType.Plane);
plane.transform.Rotate(-90,0,0);
plane.transform.localPosition = new Vector3(cameraX,cameraY,1);
plane.renderer.material.color = new Color(128,128,128);
plane.transform.localScale = new Vector3 (cameraX/2.5f,0,cameraY/2.5f);
}
}
```

While I only added one line to `CubeScript.cs`

```using UnityEngine;
using System.Collections;

public class CubeScript : MonoBehaviour {

private bool flip = false;											// I want to manually flip the tile
private int speed = 5;												// rotation speed, must divide 180
private int steps;													// the number of steps required to complete a rotation
private int direction;												// rotation direction. 1 = show tile; -1 = hide tile

void Update () {
if(flip && steps<180/speed){									// we want to rotate it and the rotation is not completed
transform.Rotate(Vector3.up*speed*direction, Space.World);	// rotate it around world coordinates according to speed
steps++;													// we did one more step
if(steps==180/speed){										// if the rotation is completed...
if(direction==1){										// if we were showing the tile...
Invoke("Cover",2);									// call "Cover" function (to cover the tile) after 2 seconds
}
else{
flip=false;											// else set flip to false to enable the player click and show the tile again
renderer.material.color = new Color(255,0,0); 		// set the color to red again
}
}
}
}

void OnMouseDown() {
if(!flip){
renderer.material.color = new Color(0,255,0);				// set the color to green
steps=0;													// resetting steps
direction=1;												// remember, direction = 1 => show tile
flip = true;												// we want to flip the tile
}
}

void Cover(){
steps=0;														// resetting steps
direction=-1;													// remember, direction = -1 => hide tile
}

}
```

And this is the result:

Click on tiles to flip them.

Now, we are ready to use real graphics, which will be explained next week.

Download the source code of the entire project.

215 GAME PROTOTYPES EXPLAINED WITH SOURCE CODE
// 1+2=3
// 10000000
// 2 Cars
// 2048
// Avoider
// Ballz
// Block it
// Blockage
// Bloons
// Boids
// Bombuzal
// Breakout
// Bricks
// Columns
// CubesOut
// Dots
// DROP'd
// Dudeski
// Eskiv
// Filler
// Fling
// Globe
// HookPod
// Hundreds
// InkTd
// Iromeku
// Lumines
// Magick
// MagOrMin
// Maze
// Memdot
// Nano War
// Nodes
// o:anquan
// Ononmin
// Pacco
// Phyballs
// Platform
// Poker
// Pool
// Poux
// Pudi
// qomp
// Racing
// Renju
// SameGame
// Security
// Sling
// Slingy
// Sokoban
// Splitter
// Sproing
// Stack
// Stairs
// Stringy
// Sudoku
// Tetris
// Threes
// Toony
// Turn
// TwinSpin
// vvvvvv
// Wordle
// Worms
// Yanga
// Zhed
// zNumbers