• 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 }

    结束:

  • 相关阅读:
    Nginx 部署多个 web 项目(虚拟主机)
    Nginx 配置文件
    Linux 安装 nginx
    Linux 安装 tomcat
    Linux 安装 Mysql 5.7.23
    Linux 安装 jdk8
    Linux 安装 lrzsz,使用 rz、sz 上传下载文件
    springMVC 拦截器
    spring 事务
    基于Aspectj 注解实现 spring AOP
  • 原文地址:https://www.cnblogs.com/steamedbun/p/10833102.html
Copyright © 2020-2023  润新知