Talking about Concentration game, 3D, Game development and Unity3D.
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); cube.AddComponent("CubeScript"); // a quad GameObject quad = GameObject.CreatePrimitive(PrimitiveType.Quad); quad.transform.localScale=new Vector2 (2,2); quad.transform.Rotate(0,180,0); quad.transform.position=new Vector3(3*j,3*i,0.251f); // attaching the quad to the cube quad.transform.parent=cube.transform; } } // 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.
Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.