Unity初步 基本拼圖實現


 1 using System.Collections;  2 using System.Collections.Generic;  3 using UnityEngine;  4 using UnityEngine.UI;  5 
 6 public class GameControl : MonoBehaviour {  7 
 8     //資源加載路徑
 9     public string spritePath = "Sprites/Teriri";  10 
 11     //拼圖碎片
 12     public Sprite[] sprites = null;  13 
 14     //拼圖控制(以按鈕的形式)
 15     public Button[] buttons = null;  16 
 17     //攜帶網格方塊自動布局組件的背景
 18     public Transform bgTransform = null;  19 
 20     //碎片預制體
 21     public GameObject puzzlePrefab = null;  22 
 23     //用於記錄空圖片的位置
 24     public RectTransform nullImage = null;  25 
 26     //用於獲取布局方塊的大小,便於調節碎片
 27     private GridLayoutGroup bgLayout = null;  28 
 29     //用於記錄正確的圖片名字相加順序
 30     private string correctSpritesNameOrder = null;  31 
 32     //用於確認按鈕化的圖片碎片是否正確
 33     private string spritesNameOrder = null;  34 
 35     private Sprite remainSprite = null;//用於保存被置空的圖片,最后游戲結束時現實出來  36 
 37 
 38 
 39     //此函數用於初始化
 40     private void Start() {  41 
 42         string theLastSpriteName = null;  43 
 44         //資源加載
 45         this.sprites = Resources.LoadAll<Sprite>(this.spritePath);  46         this.bgLayout = bgTransform.GetComponent<GridLayoutGroup>();  47 
 48         List<Sprite> tempSprites = new List<Sprite>();  49 
 50         //記錄正確的精靈名字順序
 51         for (int i = 0; i < this.sprites.Length; i++) {  52             tempSprites.Add(this.sprites[i]);  53             this.correctSpritesNameOrder += this.sprites[i].name;  54             //記錄下最后一張碎片的名字
 55             if (i == this.sprites.Length - 1) {  56                 theLastSpriteName = this.sprites[i].name;  57  }  58  }  59 
 60         print("正確的圖片名字構成順序:" + this.correctSpritesNameOrder.ToString());  61 
 62         int spritesLength = this.sprites.Length;  63         //Debug.Log(spritesLength);
 64         for (int i = spritesLength - 1; i >= 0; i--) {  65             //實例化預制體
 66             GameObject btnInstance = Instantiate(this.puzzlePrefab) as GameObject;  67             //獲取按鈕組件
 68             Button btn = btnInstance.GetComponent<Button>();  69 
 70             GameControl self = this;//要保存一下當前的this對象,以免出現this指向錯誤
 71             btn.onClick.AddListener(delegate () {  72                 self.BtnOnclick(btnInstance.GetComponent<RectTransform>());  73  });  74 
 75             //隨機取圖片出來放置,達到打亂的效果
 76             int randomNumber = Random.Range(0, tempSprites.Count);  77             btnInstance.name = tempSprites[randomNumber].name;  78 
 79             Image btnInstanceImage = btnInstance.GetComponent<Image>();  80             if (btnInstance.name == theLastSpriteName) {  81                 //置空,否則打亂
 82                 this.remainSprite = tempSprites[randomNumber];  83                 btnInstanceImage.sprite = null;  84                 this.nullImage = btnInstance.GetComponent<RectTransform>();  85             } else {  86                 //btnInstance.GetComponent<Image>().sprite = tempSprites[randomNumber];
 87                 btnInstanceImage.sprite = tempSprites[randomNumber];  88  }  89 
 90             //Debug.Log(btnInstanceImage);
 91 
 92  tempSprites.Remove(tempSprites[randomNumber]);  93  btnInstance.transform.SetParent(bgTransform);  94             btnInstance.GetComponent<RectTransform>().localScale = Vector3.one;  95             //Debug.Log(randomNumber + ":" + btnInstance.name);
 96  }  97         this.buttons = this.transform.Find("BackGround").GetComponentsInChildren<Button>();  98 
 99         ////隨機放置一個空圖片位置
100         //int tempNumber = Random.Range(0, this.buttons.Length); 101         //this.remainSprite = buttons[tempNumber].GetComponent<Image>().sprite;//保存被置空的圖片 102         //this.buttons[tempNumber].GetComponent<Image>().sprite = null; 103         //this.nullImage = this.buttons[tempNumber].GetComponent<RectTransform>(); 104 
105         //設置最右下角的圖片為消失的圖片
106  } 107 
108     //拼圖按鈕點擊事件
109     private void BtnOnclick(RectTransform btnRect) { 110         if (Vector2.Distance(btnRect.anchoredPosition, this.nullImage.anchoredPosition) 111                 <= (this.bgLayout.cellSize.x + this.bgLayout.spacing.x)) { 112             //print("產生替換"); 113             //Sprite btnRectSprite = btnRect.GetComponent<Image>().sprite;//獲取需要替換的引用
114             ////這個空位應該是啥也沒有
115             //Sprite nullImageSprite = this.nullImage.GetComponent<Image>().sprite;
116             Sprite cacheSprite = btnRect.GetComponent<Image>().sprite;//交換前緩存一下圖片
117             string cacheString = btnRect.gameObject.name; 118 
119             btnRect.gameObject.name = this.nullImage.gameObject.name; 120             this.nullImage.gameObject.name = cacheString; 121 
122             btnRect.GetComponent<Image>().sprite = this.nullImage.GetComponent<Image>().sprite; 123             this.nullImage.GetComponent<Image>().sprite = cacheSprite; 124             //this.nullImage.GetComponent<Image>().sprite = cacheSprite;
125             this.nullImage = btnRect; 126 
127  CheckAll(); 128  } 129  } 130 
131     //遍歷所有圖片名字順序,判斷是否完成拼圖,結束游戲
132     private void CheckAll() { 133         this.spritesNameOrder = ""; 134         this.buttons = this.bgTransform.GetComponentsInChildren<Button>(); 135         for (int i = 0; i < this.buttons.Length; i++) { 136             this.spritesNameOrder += this.buttons[i].gameObject.name; 137  } 138 
139         if (this.spritesNameOrder == this.correctSpritesNameOrder) { 140             this.nullImage.GetComponent<Image>().sprite = this.remainSprite;//現實被置空的圖片
141             Debug.Log("德麗莎天下第一可愛!"); 142             this.enabled = false;//停止游戲刷新
143  } 144  } 145 }

 

 

 

 

 

結束:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM