本文是九宮格拼圖遊戲-小品遊戲
圖片分割程式碼(請點選文字超連結)
腳本對印圖:
圖片分割數量:
----------------
開始遊戲九宮格圖片亂數變化 Script(C#):
---------------
Script(c#) 偵測方位物件
--------------------
偵測物件並且與沒有貼圖物件位置對調
---------------------
遊戲結算(輸贏/其他方式結束遊戲) ※ 本程式只判斷遊戲是否拼圖正確
圖片分割程式碼(請點選文字超連結)
腳本對印圖:
圖片分割數量:
結果圖:
----------------
開始遊戲九宮格圖片亂數變化 Script(C#):
using UnityEngine; using System.Collections; using System.Collections.Generic; [RequireComponent(typeof(DetectionObjcet))] [RequireComponent(typeof(MoveImage))] [RequireComponent(typeof(Gamesettlement))] public class Jiugongge : MonoBehaviour { public Sprite[] sprite = new Sprite[8]; // 預設圖片 private int type = 9; // 建立物件數量 public ListobjcetList = new List (); // list 監管物件建立 private GameObject spriteMaster; // sprite 管理物件 private BoxCollider boxCollider; // Sprite Collider; private bool randomSw = false; // 亂數開關 private int randomNumber; // 亂數 private int limitObjcet = 0; // 限制物件 private List numbers = new List (); // Use this for initialization void Awake() { spriteMaster = new GameObject("SpriteMaster"); // sprite 管理 spriteMaster.transform.position = Vector2.zero; // sprite 管理位置 spriteSwitch(); } /// /// 視窗GUI /// void OnGUI() { randomSw = (GUI.Button(new Rect(Screen.width / Screen.width, Screen.height / Screen.height, 100, 30), "拼圖重製")) ? true : false; if (randomSw.Equals(true)) { // notRepeatingRandom(); Application.LoadLevel("aa"); } } ////// 加入圖片亂數選擇 /// void spriteSwitch() { randomNumberListWithoutDuplicate(type); while (limitObjcet < type) { try { randomNumber = getNumberInList(); createSprite().GetComponent().sprite = sprite[randomNumber]; } catch { Debug.LogError("警告"); } limitObjcet++; } show(); } /// /// 選取範圍 /// int getNumberInList() { int return_num = numbers[0]; numbers.RemoveRange(0, 1); return return_num; } ////// 亂數排序 /// ListrandomNumberListWithoutDuplicate(int max) { for (int i = 0; i < max; i++) numbers.Add(i); for (int i = 0; i < numbers.Count; i++) { int temp = numbers[i]; int randomIndex = Random.Range(i, numbers.Count); numbers[i] = numbers[randomIndex]; numbers[randomIndex] = temp; } return numbers; } /// /// objcet 位置 /// void show() { int objcetNumber = 0; foreach (GameObject objcet in objcetList) { objcetNumber += 1; objcet.transform.SetParent(spriteMaster.transform); objcet.name = "Image" + objcetNumber; switch (objcetNumber) { case 1: objcet.transform.position = new Vector2(-3.4f, 0); break; case 2: objcet.transform.position = new Vector2(-3.4f, 3.4f); break; case 3: objcet.transform.position = new Vector2(-3.4f, 6.8f); break; case 4: objcet.transform.position = new Vector2(0, 0); break; case 5: objcet.transform.position = new Vector2(0, 3.4f); break; case 6: objcet.transform.position = new Vector2(0, 6.8f); break; case 7: objcet.transform.position = new Vector2(3.4f, 0f); break; case 8: objcet.transform.position = new Vector2(3.4f, 3.4f); break; case 9: objcet.transform.position = new Vector2(3.4f, 6.8f); break; } } } ////// 建立物件 /// ///GameObject createSprite() { GameObject objcet = new GameObject("Image"); objcetAddComponentFunction(objcet); ComponentSetting(); objcetList.Add(objcet); return objcet; } /// /// 物件加入組件 /// /// void objcetAddComponentFunction(GameObject objcet) { objcet.AddComponent(); boxCollider = objcet.AddComponent (); } /// /// 組件設定 /// void ComponentSetting() { boxCollider.size = new Vector3(3.4f, 3.4f, 0); } }
---------------
Script(c#) 偵測方位物件
using UnityEngine; using System.Collections; public class DetectionObjcet : MonoBehaviour { private Jiugongge jiugongge; // 九宮格腳本 private Ray ray1, ray2, ray3, ray4; // 射線 private RaycastHit hits1, hits2, hits3, hits4; // 射線碰撞 public GameObject objcetSprtieNull; // 沒貼圖片物件 public GameObject leftMoveObjcet, // 射線偵測左邊物件 rightMoveObjcet, // 射線偵測右邊物件 upMoveObjcet, // 射線偵測上邊物件 downMoveObjcet; // 射線偵測下邊物件 void Awake() { jiugongge = gameObject.GetComponent(); // 取得物件腳本 readOjbcetNoSprite(); } void Update() { RayColliderObjcet(); // 射線方位 ray1 = leftRayPoint(); ray2 = rightRayPoint(); ray3 = upRayPoint(); ray4 = downRayPoint(); } /// /// 射線偵測 /// void RayColliderObjcet() { if (Physics.Raycast(ray1, out hits1)) leftMoveObjcet = hits1.collider.gameObject; if (Physics.Raycast(ray2, out hits2)) rightMoveObjcet = hits2.collider.gameObject; if (Physics.Raycast(ray3, out hits3)) upMoveObjcet = hits3.collider.gameObject; if (Physics.Raycast(ray4, out hits4)) downMoveObjcet = hits4.collider.gameObject; } ////// 左邊射線 /// ///Ray leftRayPoint() { Vector2 vector2 = objcetSprtieNull.transform.position; Ray ray = new Ray(vector2, Vector2.left); return ray; } /// /// 右邊射線 /// ///Ray rightRayPoint() { Vector2 vector2 = objcetSprtieNull.transform.position; Ray ray = new Ray(vector2, Vector2.right); return ray; } /// /// 向上射線 /// ///Ray upRayPoint() { Vector2 vector2 = objcetSprtieNull.transform.position; Ray ray = new Ray(vector2, Vector2.up); return ray; } /// /// 向下射線 /// ///Ray downRayPoint() { Vector2 vector2 = objcetSprtieNull.transform.position; Ray ray = new Ray(vector2, Vector2.down); return ray; } /// /// 尋找沒貼圖物件 /// void readOjbcetNoSprite() { foreach (GameObject objcet in jiugongge.objcetList) { if (objcet.GetComponent().sprite == null) objcetSprtieNull = objcet; } } }
--------------------
偵測物件並且與沒有貼圖物件位置對調
using UnityEngine; using System.Collections; public class MoveImage : MonoBehaviour { private DetectionObjcet detectionObjcet; // 選擇物件類別 private Ray userRay; // 玩家射線 private RaycastHit userRayHits; // 射線碰撞 private Vector2 moveLimitPoint, // 無Sprite 物件位置(交換位置) clickObjcetPoint; // 射線探聽物件位置 void Awake() { detectionObjcet = GetComponent(); } void Update(){ userRayFunction(); } /// /// 玩家發出射線 (可更改控制事件) /// void userRayFunction() { userRay = Camera.main.ScreenPointToRay(Input.mousePosition); moveLimitPoint = detectionObjcet.objcetSprtieNull.transform.position; if (Input.GetMouseButton(0)) { if (Physics.Raycast(userRay, out userRayHits)) { GameObject userOnclickObjcet = userRayHits.collider.gameObject; OnClickView(userOnclickObjcet); } } } ////// 探聽事件 /// /// void OnClickView(GameObject objcet) { if (objcet == detectionObjcet.leftMoveObjcet) { clickObjcetPoint = objcet.transform.position; MoveObjcetFunction_Left(detectionObjcet.leftMoveObjcet, moveLimitPoint); } if (objcet == detectionObjcet.rightMoveObjcet) { clickObjcetPoint = objcet.transform.position; MoveObjcetFunction_Right(detectionObjcet.rightMoveObjcet, moveLimitPoint); } if (objcet == detectionObjcet.upMoveObjcet) { clickObjcetPoint = objcet.transform.position; MoveObjcetFunction_Up(detectionObjcet.upMoveObjcet, moveLimitPoint); } if (objcet == detectionObjcet.downMoveObjcet) { clickObjcetPoint = objcet.transform.position; MoveObjcetFunction_Down(detectionObjcet.downMoveObjcet, moveLimitPoint); } } ////// 偵測左邊物件_向右移動 /// /// /// void MoveObjcetFunction_Left(GameObject objcet, Vector2 point) { if(objcet.transform.position.x <= point.x) { objcet.transform.position = new Vector2(point.x, point.y); } detectionObjcet.objcetSprtieNull.transform.position = clickObjcetPoint; } ////// 偵測右邊物件_向左移動 /// /// /// void MoveObjcetFunction_Right(GameObject objcet, Vector2 point) { if (objcet.transform.position.x >= point.x) { objcet.transform.position = new Vector2(point.x, point.y); } detectionObjcet.objcetSprtieNull.transform.position = clickObjcetPoint; } ////// 偵測上邊物件_向下移動 /// /// /// void MoveObjcetFunction_Up(GameObject objcet, Vector2 point) { if (objcet.transform.position.y >= point.y) { objcet.transform.position = new Vector2(point.x, point.y); } detectionObjcet.objcetSprtieNull.transform.position = clickObjcetPoint; } ////// 偵測下邊物件_向上移動 /// /// /// void MoveObjcetFunction_Down(GameObject objcet, Vector2 point) { if (objcet.transform.position.y <= point.y) { objcet.transform.position = new Vector2(point.x, point.y); } detectionObjcet.objcetSprtieNull.transform.position = clickObjcetPoint; } }
---------------------
遊戲結算(輸贏/其他方式結束遊戲) ※ 本程式只判斷遊戲是否拼圖正確
using UnityEngine; using System.Collections; using System.Collections.Generic; public class Gamesettlement : MonoBehaviour { private DetectionObjcet detctionObjcet; // 選擇物件類別 private Jiugongge jiugongge; // 取得最先設定類別 public Sprite winSprite; // 補區塊 private bool win; // 輸贏數值 void Awake() { detctionObjcet = GetComponent(); jiugongge = GetComponent (); } void Update() { readObjcetSprtie(); if(win) detctionObjcet.objcetSprtieNull.GetComponent ().sprite = winSprite; Debug.Log(win); } void OnGUI() { string str = (win.Equals(true)) ? "完成" : "未完成"; GUI.Label(new Rect(Screen.width / Screen.width, Screen.height / Screen.height * 30f, 300, 30), str); if (Input.GetKey(KeyCode.Escape)) { Application.Quit(); } } /// /// 讀取物件Sprite後及判斷位置 /// void readObjcetSprtie() { bool point1 = false, point2 = false, point3 = false, point4 = false, point5 = false, point6 = false, point7 = false, point8 = false; foreach (GameObject objcet in jiugongge.objcetList) { try { // sprite1 位置 x:-3.4f, y:0f; if (objcet.GetComponent().sprite.Equals(jiugongge.sprite[0])) { if (objcet.transform.position.x.Equals(-3.4f) & objcet.transform.position.y.Equals(0)) point1 = true; } // sprite2 位置 x:-3.4f, y:3.4f; if (objcet.GetComponent ().sprite.Equals(jiugongge.sprite[1])) { if (objcet.transform.position.x.Equals(-3.4f) & objcet.transform.position.y.Equals(3.4f)) point2 = true; } // sprite3 位置 x:-3.4f, y:6.8f; if (objcet.GetComponent ().sprite.Equals(jiugongge.sprite[2])) { if (objcet.transform.position.x.Equals(-3.4f) & objcet.transform.position.y.Equals(6.8f)) point3 = true; } // sprite4 位置 x:0f, y:0f; if (objcet.GetComponent ().sprite.Equals(jiugongge.sprite[3])) { if (objcet.transform.position.x.Equals(0) & objcet.transform.position.y.Equals(0)) point4 = true; } // sprite5 位置 x:0f, y:3.4f; if (objcet.GetComponent ().sprite.Equals(jiugongge.sprite[4])) { if (objcet.transform.position.x.Equals(0) & objcet.transform.position.y.Equals(3.4f)) point5 = true; } // sprite6 位置 x:0f, y:6.8f; if (objcet.GetComponent ().sprite.Equals(jiugongge.sprite[5])) { if (objcet.transform.position.x.Equals(0) & objcet.transform.position.y.Equals(6.8f)) point6 = true; } // sprite7 位置 x:3.4f, y:0f; if (objcet.GetComponent ().sprite.Equals(jiugongge.sprite[6])) { if (objcet.transform.position.x.Equals(3.4f) & objcet.transform.position.y.Equals(0)) point7 = true; } // sprite8 位置 x:3.4f, y:3.4f; if (objcet.GetComponent ().sprite.Equals(jiugongge.sprite[7])) { if (objcet.transform.position.x.Equals(3.4f) & objcet.transform.position.y.Equals(3.4f)) point8 = true; } } catch { Debug.LogError("警告2: 強迫語法"); } } // point 1-8 正確就可以過關 if (point1 & point2.Equals(true) & point3.Equals(true) & point4.Equals(true) & point5.Equals(true) & point6.Equals(true) & point7.Equals(true) & point8.Equals(true)) win = true; else win = false; } }