Unity3D игра «Пятнашки» на javascript

от автора

Создание сцены


Для начала настроим камеру: так как данная игра — 2D, для этого в ‘Main Camera’ нам необходимо изменить параметр ‘Projection’ на ‘Orthographic’. И выставим остальные параметры как на рисунке ниже.

Теперь создадим игровое поле 4 х 4: для этого создадим 16 кубов (GameObject> Create other> Cube) с координатами в Rotation = (0, 0, 0), Scale = (1, 1, 1) и в Position: a1(-4.6, 0.3, 11), a2(-3.4, 0.3, 11), a3(-2.2, 0.3, 11), a4(-1, 0.3, 11), b1(-4.6, -0.9, 11), b2(-4.6, -0.9, 11), b3(-4.6, -0.9, 11), b4(-4.6, -0.9, 11), c1(-4.6, -2.1, 11), c2(-4.6, -2.1, 11), c3(-4.6, -2.1, 11), c4(-4.6, -2.1, 11), d1(-4.6, -3.3, 11), d2(-4.6, -3.3, 11), d3(-4.6, -3.3, 11), d4(-4.6, -3.3, 11).

Создадим ‘GameObject’ (GameObject> Create Empty) и назовём ‘isBoard’. Перетащим все объекты на него.

Теперь создадим 15 фишек: для этого создадим 15 кубов (GameObject> Create other> Cube) с координатами в Rotation = (0, 0, 180), Scale = (0.8, 0.8, 0.8). Назовём из от 01 до 15. Создадим ‘GameObject’ (GameObject> Create Empty) и назовём ‘isDibs’. Перетащим эти объекты на него. Назначим каждой фишке текстуру со своей цифрой (по названию объекта «01 – 1, 05 – 5 и т.д.»). И выделив все фишки вернем им начальную позицию ‘Reset Position’:

Создадим еще один ‘GameObject’ (GameObject> Create Empty) и назовём ‘Menu’, он понадобится нам в дальнейшем. И создадим источник света (GameObject> Create other> Spotlight) и настроим как на рисунке нижу:

Создаем ‘GUIText’ (GameObject> Create other> GUIText) и назовем его ‘You win’. Настроем его как на рисунке ниже:

На этом подготовка цены к работе закончена.

Создаем необходимые скрипты


Создаем 4 скрипта (GameObject> Create other> Cube):
1. MyJSFifteenSettingFull – скрипт для стартовых видео/аудио настроек игры. Добавляем скрипт в ‘Main Camera’.
2. MyJSFifteenPositionFull – скрипт для указания начальной позиции фишек, свободной клетки и определения выигрыша в игре. Добавляем скрипт в ‘isDibs’. Снимаем с него галочку и назначаем переменным их фишки, соответственно.

3. MyJSFifteenBreakUpFull – скрипт для определения правил перемещения фишек на игровом поле. Добавляем скрипт ко всем фишкам.
4. MyJSFifteenMenuFull – скрипт для создания меню. Добавляем скрипт в ‘Menu’.

MyJSFifteenSettingFull

function Start () {  	Screen.SetResolution (854, 480, true); //Устанавливает расширение игры. 	 	QualitySettings.currentLevel = QualityLevel.Fantastic; //Устанавливает качество отображения в данном случае ‘Fantastic’ – очень высокое.  } 
MyJSFifteenPositionFull

//Прописываем координаты фишек в правильном раскладе //Указываем статическую переменную для использования ее из другого скрипта (в описании скрипта ‘MyJSFifteenBreakUpFull’) static var a1 = Vector3 (-4.6, 1.3, 0.8); static var a2 = Vector3 (-3.4, 1.3, 0.8); static var a3 = Vector3 (-2.2, 1.3, 0.8); static var a4 = Vector3 (-1, 1.3, 0.8); static var b1 = Vector3 (-4.6, 0.1, 0.8); static var b2 = Vector3 (-3.4, 0.1, 0.8); static var b3 = Vector3 (-2.2, 0.1, 0.8); static var b4 = Vector3 (-1, 0.1, 0.8); static var c1 = Vector3 (-4.6, -1.1, 0.8); static var c2 = Vector3 (-3.4, -1.1, 0.8); static var c3 = Vector3 (-2.2, -1.1, 0.8); static var c4 = Vector3 (-1, -1.1, 0.8); static var d1 = Vector3 (-4.6, -2.3, 0.8); static var d2 = Vector3 (-3.4, -2.3, 0.8); static var d3 = Vector3 (-2.2, -2.3, 0.8); static var d4 = Vector3 (-1, -2.3, 0.8); //Прописываем переменную для указания свободной клетке на игровом поле static var n:float; //Создаем ссылки на фишки var _01:GameObject; var _02:GameObject; var _03:GameObject; var _04:GameObject; var _05:GameObject; var _06:GameObject; var _07:GameObject; var _08:GameObject; var _09:GameObject; var _10:GameObject; var _11:GameObject; var _12:GameObject; var _13:GameObject; var _14:GameObject; var _15:GameObject;  function Start () { //Указываем начальную позицию фишек 	_01.transform.position = b3; 	_02.transform.position = c1; 	_03.transform.position = d3; 	_04.transform.position = b4; 	_05.transform.position = c2; 	_06.transform.position = a3; 	_07.transform.position = b1; 	_08.transform.position = c3; 	_09.transform.position = a4; 	_10.transform.position = b2;	 	_11.transform.position = d2; 	_12.transform.position = d1; 	_13.transform.position = a2; 	_14.transform.position = a1; 	_15.transform.position = c4; //Указываем № свободной клетке на игровом поле 	n = 16;			 } //Сейчас необходимо написать действие при правильном расположении всех фишек (‘Вы выиграли’) function Update () {  	if(_01.transform.position == a1 && _02.transform.position == a2 && _03.transform.position == a3 && _04.transform.position == a4 && _05.transform.position == b1 && _06.transform.position == b2 && _07.transform.position == b3 && _08.transform.position == b4 && _09.transform.position == c1 && _10.transform.position == c2 && _11.transform.position == c3 && _12.transform.position == c4 && _13.transform.position == d1 && _14.transform.position == d2 && _15.transform.position == d3) { 	 		Time.timeScale = 0; 		 		var _GUITextYesMode = GameObject.Find('You win').GetComponent('GUIText'); 		 		_GUITextYesMode.enabled = true; 		 	} else { 		 		Time.timeScale = 1; 		 		var _GUITextNoMode = GameObject.Find('You win').GetComponent('GUIText'); 		 		_GUITextNoMode.enabled = false; 	 		 	 	} 	 } 
MyJSFifteenBreakUpFull

Теперь необходимо создать правило перемещения фишек по игровому полю. Например:

1. если клетке 16 будет пустой (переменная n = 16) то на нее смогут переместиться только фишки находящиеся на клетках 12 и 15 и значению переменной ‘n’ присвоится номер той клетки с которой переместилась фишка на клетку 16 (например 12);
2. если клетке 12 будет пустой (переменная n = 12) то на нее смогут переместиться только фишки находящиеся на клетках 8, 11 и 16 и значению переменной ‘n’ присвоится номер той клетки с которой переместилась фишка на клетку 12 (например 11);
3. если клетке 11 будет пустой (переменная n = 11) то на нее смогут переместиться только фишки находящиеся на клетках 7, 12, 15 и 10 и значению переменной ‘n’ присвоится номер той клетки с которой переместилась фишка на клетку 12 (например 15);
И поэтому же принципу для каждой клетки.
Приступаем к написанию скрипта. Действия будут проходить при нажатии на левую кнопку мыши ‘function OnMouseUp () {}’. При нажатии на фишку, если рядом с ней есть свободная клетка, ее координаты будут меняться на координаты свободной клетки, а переменной ‘n’ присвоится значение освободившейся клетки, если же нет то никакого действия не произойдёт.
Здесь мы будим обращаться к переменной ‘n’ находящейся в другом скрипте, нам необходимо будет считать переменную и изменить ее для этого переменная ‘n’ будет указываться как ‘название скрипта.сама переменная’ в нашем случае это выглядит следующим образом ‘MyJSFifteenPositionFull.n’. Чтобы данное обращение работало убедитесь, что в скрипте ‘MyJSFifteenPositionFull.n’ вы указали статическую переменную ‘static var n:float;’.
И так сам скрипт:

function OnMouseUp () {  	if(gameObject.name == "01" || gameObject.name == "02" || gameObject.name == "03" || gameObject.name == "04"  || gameObject.name == "05" || gameObject.name == "06" || gameObject.name == "07" || gameObject.name == "08" || gameObject.name == "09" || gameObject.name == "10" || gameObject.name == "11" || gameObject.name == "12" || gameObject.name == "13" || gameObject.name == "14" || gameObject.name == "15") {  		if(transform.position == MyJSFifteenPositionFull.a1) { //2,5  			if(MyJSFifteenPositionFull.n == 2) {  				transform.position = MyJSFifteenPositionFull.a2;  				MyJSFifteenPositionFull.n = 1;  				Debug.Log('Ход c a1 на a2 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 5) {  				transform.position = MyJSFifteenPositionFull.b1;  				MyJSFifteenPositionFull.n = 1;  				Debug.Log('Ход c a1 на b1 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.a2) { //1,3,6  			if(MyJSFifteenPositionFull.n == 1) {  				transform.position = MyJSFifteenPositionFull.a1;  				MyJSFifteenPositionFull.n = 2;  				Debug.Log('Ход c a2 на a1 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 3) {  				transform.position = MyJSFifteenPositionFull.a3;  				MyJSFifteenPositionFull.n = 2;  				Debug.Log('Ход c a2 на a3 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 6) {  				transform.position = MyJSFifteenPositionFull.b2;  				MyJSFifteenPositionFull.n = 2;  				Debug.Log('Ход c a1 на b2 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.a3) { //2,4,7  			if(MyJSFifteenPositionFull.n == 2) {  				transform.position = MyJSFifteenPositionFull.a2;  				MyJSFifteenPositionFull.n = 3;  				Debug.Log('Ход c a3 на a2 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 4) {  				transform.position = MyJSFifteenPositionFull.a4;  				MyJSFifteenPositionFull.n = 3;  				Debug.Log('Ход c a3 на a4 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 7) {  				transform.position = MyJSFifteenPositionFull.b3;  				MyJSFifteenPositionFull.n = 3;  				Debug.Log('Ход c a3 на b3 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.a4) { //3,8  			if(MyJSFifteenPositionFull.n == 3) {  				transform.position = MyJSFifteenPositionFull.a3;  				MyJSFifteenPositionFull.n = 4;  				Debug.Log('Ход c a4 на a3 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 8) {  				transform.position = MyJSFifteenPositionFull.b4;  				MyJSFifteenPositionFull.n = 4;  				Debug.Log('Ход c a4 на b4 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.b1) { //1,6,9  			if(MyJSFifteenPositionFull.n == 1) {  				transform.position = MyJSFifteenPositionFull.a1;  				MyJSFifteenPositionFull.n = 5;  				Debug.Log('Ход c b1 на a1 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 6) {  				transform.position = MyJSFifteenPositionFull.b2;  				MyJSFifteenPositionFull.n = 5;  				Debug.Log('Ход c b1 на b2 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 9) {  				transform.position = MyJSFifteenPositionFull.c1;  				MyJSFifteenPositionFull.n = 5;  				Debug.Log('Ход c b1 на c1 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.b2) { //2,7,10,5  			if(MyJSFifteenPositionFull.n == 2) {  				transform.position = MyJSFifteenPositionFull.a2;  				MyJSFifteenPositionFull.n = 6;  				Debug.Log('Ход c b2 на a2 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 7) {  				transform.position = MyJSFifteenPositionFull.b3;  				MyJSFifteenPositionFull.n = 6;  				Debug.Log('Ход c b2 на b3 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 10) {  				transform.position = MyJSFifteenPositionFull.c2;  				MyJSFifteenPositionFull.n = 6;  				Debug.Log('Ход c b2 на c2 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 5) {  				transform.position = MyJSFifteenPositionFull.b1;  				MyJSFifteenPositionFull.n = 6;  				Debug.Log('Ход c b2 на b1 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.b3) { //3,8,11,6  			if(MyJSFifteenPositionFull.n == 3) {  				transform.position = MyJSFifteenPositionFull.a3;  				MyJSFifteenPositionFull.n = 7;  				Debug.Log('Ход c b3 на a3 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 8) {  				transform.position = MyJSFifteenPositionFull.b4;  				MyJSFifteenPositionFull.n = 7;  				Debug.Log('Ход c b3 на b4 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 11) {  				transform.position = MyJSFifteenPositionFull.c3;  				MyJSFifteenPositionFull.n = 7;  				Debug.Log('Ход c b3 на c3 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 6) {  				transform.position = MyJSFifteenPositionFull.b2;  				MyJSFifteenPositionFull.n = 7;  				Debug.Log('Ход c b3 на b2 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.b4) { //4,7,12  			if(MyJSFifteenPositionFull.n == 4) {  				transform.position = MyJSFifteenPositionFull.a4;  				MyJSFifteenPositionFull.n = 8;  				Debug.Log('Ход c b4 на a4 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 7) {  				transform.position = MyJSFifteenPositionFull.b3;  				MyJSFifteenPositionFull.n = 8;  				Debug.Log('Ход c b4 на b3 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 12) {  				transform.position = MyJSFifteenPositionFull.c4;  				MyJSFifteenPositionFull.n = 8;  				Debug.Log('Ход c b4 на c4 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.c1) { //5,10,13  			if(MyJSFifteenPositionFull.n == 5) {  				transform.position = MyJSFifteenPositionFull.b1;  				MyJSFifteenPositionFull.n = 9;  				Debug.Log('Ход c c1 на b1 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 10) {  				transform.position = MyJSFifteenPositionFull.c2;  				MyJSFifteenPositionFull.n = 9;  				Debug.Log('Ход c c1 на c2 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 13) {  				transform.position = MyJSFifteenPositionFull.d1;  				MyJSFifteenPositionFull.n = 9;  				Debug.Log('Ход c c1 на d1 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.c2) { //6,11,14,9  			if(MyJSFifteenPositionFull.n == 6) {  				transform.position = MyJSFifteenPositionFull.b2;  				MyJSFifteenPositionFull.n = 10;  				Debug.Log('Ход c c2 на b2 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 11) {  				transform.position = MyJSFifteenPositionFull.c3;  				MyJSFifteenPositionFull.n = 10;  				Debug.Log('Ход c c2 на c3 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 14) {  				transform.position = MyJSFifteenPositionFull.d2;  				MyJSFifteenPositionFull.n = 10;  				Debug.Log('Ход c c2 на d2 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 9) {  				transform.position = MyJSFifteenPositionFull.c1;  				MyJSFifteenPositionFull.n = 10;  				Debug.Log('Ход c c2 на c1 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.c3) { //7,12,15,10  			if(MyJSFifteenPositionFull.n == 7) {  				transform.position = MyJSFifteenPositionFull.b3;  				MyJSFifteenPositionFull.n = 11;  				Debug.Log('Ход c c3 на b3 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 12) {  				transform.position = MyJSFifteenPositionFull.c4;  				MyJSFifteenPositionFull.n = 11;  				Debug.Log('Ход c c3 на c4 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 15) {  				transform.position = MyJSFifteenPositionFull.d3;  				MyJSFifteenPositionFull.n = 11;  				Debug.Log('Ход c c3 на d3 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 10) {  				transform.position = MyJSFifteenPositionFull.c2;  				MyJSFifteenPositionFull.n = 11;  				Debug.Log('Ход c c3 на c4 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.c4) { //8,11,16  			if(MyJSFifteenPositionFull.n == 8) {  				transform.position = MyJSFifteenPositionFull.b4;  				MyJSFifteenPositionFull.n = 12;  				Debug.Log('Ход c c4 на b4 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 11) {  				transform.position = MyJSFifteenPositionFull.c3;  				MyJSFifteenPositionFull.n = 12;  				Debug.Log('Ход c c4 на c3 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 16) {  				transform.position = MyJSFifteenPositionFull.d4;  				MyJSFifteenPositionFull.n = 12;  				Debug.Log('Ход c c4 на d4 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.d1) { //9,14  			if(MyJSFifteenPositionFull.n == 9) {  				transform.position = MyJSFifteenPositionFull.c1;  				MyJSFifteenPositionFull.n = 13;  				Debug.Log('Ход c d1 на c1 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 14) {  				transform.position = MyJSFifteenPositionFull.d2;  				MyJSFifteenPositionFull.n = 13;  				Debug.Log('Ход c d1 на d2 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.d2) { //13,10,15  			if(MyJSFifteenPositionFull.n == 13) {  				transform.position = MyJSFifteenPositionFull.d1;  				MyJSFifteenPositionFull.n = 14;  				Debug.Log('Ход c d3 на d1 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 10) {  				transform.position = MyJSFifteenPositionFull.c2;  				MyJSFifteenPositionFull.n = 14;  				Debug.Log('Ход c d3 на c2 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 15) {  				transform.position = MyJSFifteenPositionFull.d3;  				MyJSFifteenPositionFull.n = 14;  				Debug.Log('Ход c d3 на d3 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.d3) { //14,11,16  			if(MyJSFifteenPositionFull.n == 14) {  				transform.position = MyJSFifteenPositionFull.d2;  				MyJSFifteenPositionFull.n = 15;  				Debug.Log('Ход c d3 на d2 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 11) {  				transform.position = MyJSFifteenPositionFull.c3;  				MyJSFifteenPositionFull.n = 15;  				Debug.Log('Ход c d3 на c3 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 16) {  				transform.position = MyJSFifteenPositionFull.d4;  				MyJSFifteenPositionFull.n = 15;  				Debug.Log('Ход c d3 на d4 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  		if(transform.position == MyJSFifteenPositionFull.d4) { //15,12  			if(MyJSFifteenPositionFull.n == 15) {  				transform.position = MyJSFifteenPositionFull.d3;  				MyJSFifteenPositionFull.n = 16;  				Debug.Log('Ход c d4 на d3 успешно выполнен');  				return;  			} else if(MyJSFifteenPositionFull.n == 12) {  				transform.position = MyJSFifteenPositionFull.c4;  				MyJSFifteenPositionFull.n = 16;  				Debug.Log('Ход c d4 на c4 успешно выполнен');  				return;  			} else {  				Debug.Log('Недопустимый ход');  				return;  			}  		}  	}  } 
MyJSFifteenMenuFull

Приступим к написанию меню.

var _menuMode:boolean = true; //главное меню игры (включено при старте игры) var _gameMode:boolean = false; //режим игры  var game:Rect; var quit:Rect;  function Update () {  	if(_menuMode && !_gameMode){ 	 		Time.timeScale = 0;	 			 	} 	 	if(!_menuMode && _gameMode){ 	 		Time.timeScale = 1; //При начале игры загружается скрипт 'MyJSFifteenPositionFull'		 		var _gMode = GameObject.Find('isDibs').GetComponent('MyJSFifteenPositionFull'); 		 		_gMode.enabled = true; 			 	}  } //Прописываем кнопки и действия при нажатии на них: function OnGUI () {  	if(_menuMode){  		if(GUI.Button(game, 'Новая игра')){ 	 			_menuMode = false; 			_gameMode = true; 			 		}  		if(GUI.Button(quit, 'Выход')){ 	 			Application.Quit(); 			 		} 	 	} 	 	if(_gameMode){  		if(GUI.Button(quit, 'Выход')){ 	 			Application.Quit(); 			 		} 	 	} 	 } 

При создании использовались:


google.ru
Документация Unity3D
UnifyWiki
Хабрахабр

ссылка на оригинал статьи http://habrahabr.ru/post/172415/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *