Unity初步 基本拼图实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; public class GameControl : MonoBehaviour { //资源加载路径
public string spritePath = "Sprites/Teriri"; //拼图碎片
public Sprite[] sprites = null; //拼图控制(以按钮的形式)
public Button[] buttons = null; //携带网格方块自动布局组件的背景
public Transform bgTransform = null; //碎片预制体
public GameObject puzzlePrefab = null; //用于记录空图片的位置
public RectTransform nullImage = null; //用于获取布局方块的大小,便于调节碎片
private GridLayoutGroup bgLayout = null; //用于记录正确的图片名字相加顺序
private string correctSpritesNameOrder = null; //用于确认按钮化的图片碎片是否正确
private string spritesNameOrder = null; private Sprite remainSprite = null;//用于保存被置空的图片,最后游戏结束时现实出来 //此函数用于初始化
private void Start() { string theLastSpriteName = null; //资源加载
this.sprites = Resources.LoadAll<Sprite>(this.spritePath);
this.bgLayout = bgTransform.GetComponent<GridLayoutGroup>(); List<Sprite> tempSprites = new List<Sprite>(); //记录正确的精灵名字顺序
for (int i = ; i < this.sprites.Length; i++) {
tempSprites.Add(this.sprites[i]);
this.correctSpritesNameOrder += this.sprites[i].name;
//记录下最后一张碎片的名字
if (i == this.sprites.Length - ) {
theLastSpriteName = this.sprites[i].name;
}
} print("正确的图片名字构成顺序:" + this.correctSpritesNameOrder.ToString()); int spritesLength = this.sprites.Length;
//Debug.Log(spritesLength);
for (int i = spritesLength - ; i >= ; i--) {
//实例化预制体
GameObject btnInstance = Instantiate(this.puzzlePrefab) as GameObject;
//获取按钮组件
Button btn = btnInstance.GetComponent<Button>(); GameControl self = this;//要保存一下当前的this对象,以免出现this指向错误
btn.onClick.AddListener(delegate () {
self.BtnOnclick(btnInstance.GetComponent<RectTransform>());
}); //随机取图片出来放置,达到打乱的效果
int randomNumber = Random.Range(, tempSprites.Count);
btnInstance.name = tempSprites[randomNumber].name; Image btnInstanceImage = btnInstance.GetComponent<Image>();
if (btnInstance.name == theLastSpriteName) {
//置空,否则打乱
this.remainSprite = tempSprites[randomNumber];
btnInstanceImage.sprite = null;
this.nullImage = btnInstance.GetComponent<RectTransform>();
} else {
//btnInstance.GetComponent<Image>().sprite = tempSprites[randomNumber];
btnInstanceImage.sprite = tempSprites[randomNumber];
} //Debug.Log(btnInstanceImage); tempSprites.Remove(tempSprites[randomNumber]);
btnInstance.transform.SetParent(bgTransform);
btnInstance.GetComponent<RectTransform>().localScale = Vector3.one;
//Debug.Log(randomNumber + ":" + btnInstance.name);
}
this.buttons = this.transform.Find("BackGround").GetComponentsInChildren<Button>(); ////随机放置一个空图片位置
//int tempNumber = Random.Range(0, this.buttons.Length);
//this.remainSprite = buttons[tempNumber].GetComponent<Image>().sprite;//保存被置空的图片
//this.buttons[tempNumber].GetComponent<Image>().sprite = null;
//this.nullImage = this.buttons[tempNumber].GetComponent<RectTransform>(); //设置最右下角的图片为消失的图片
} //拼图按钮点击事件
private void BtnOnclick(RectTransform btnRect) {
if (Vector2.Distance(btnRect.anchoredPosition, this.nullImage.anchoredPosition)
<= (this.bgLayout.cellSize.x + this.bgLayout.spacing.x)) {
//print("产生替换");
//Sprite btnRectSprite = btnRect.GetComponent<Image>().sprite;//获取需要替换的引用
////这个空位应该是啥也没有
//Sprite nullImageSprite = this.nullImage.GetComponent<Image>().sprite;
Sprite cacheSprite = btnRect.GetComponent<Image>().sprite;//交换前缓存一下图片
string cacheString = btnRect.gameObject.name; btnRect.gameObject.name = this.nullImage.gameObject.name;
this.nullImage.gameObject.name = cacheString; btnRect.GetComponent<Image>().sprite = this.nullImage.GetComponent<Image>().sprite;
this.nullImage.GetComponent<Image>().sprite = cacheSprite;
//this.nullImage.GetComponent<Image>().sprite = cacheSprite;
this.nullImage = btnRect; CheckAll();
}
} //遍历所有图片名字顺序,判断是否完成拼图,结束游戏
private void CheckAll() {
this.spritesNameOrder = "";
this.buttons = this.bgTransform.GetComponentsInChildren<Button>();
for (int i = ; i < this.buttons.Length; i++) {
this.spritesNameOrder += this.buttons[i].gameObject.name;
} if (this.spritesNameOrder == this.correctSpritesNameOrder) {
this.nullImage.GetComponent<Image>().sprite = this.remainSprite;//现实被置空的图片
Debug.Log("德丽莎天下第一可爱!");
this.enabled = false;//停止游戏刷新
}
}
}

结束:

Unity初步 基本拼图实现的更多相关文章
- ARToolKit for Unity环境搭建(初步搭建成功)
最近一段时间才开始学习使用Unity3d,AR的学习使用中,先后使用了metaio SDK.vuforia SDK,但由于这两个都属于收费的,今天开始尝试使用ARToolKit.先将ARToolKit ...
- Unity 芯片拼图算法
很多游戏的养成系统中会有利用芯片或者碎片来合成特定道具的功能,或者来给玩家以额外的属性提升等,先截个图以便更好说明: 如上图,我们有各种各样形状迥异的碎片,上面只不过列举了其中一部分,现在,我们需要利 ...
- Unity3D学习笔记3——Unity Shader的初步使用
目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染 ...
- Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备
[声明]由于本人表达能力有限,为避免不必要的误人子弟,本文将不会涉及IOC与DI,仅仅描述新版本Unity 3的使用(非Unity 3D,如果您想看的是Unity 3D请立即离开,否则莫怪此处“谋财害 ...
- Egret3D初步笔记二 (Unity导出场景使用)
一 Scene 根据上一节的继续.在导入unity4.7.1_Egret3D_Dll.unitypackage后. 在Unity中双击打开Assets/Egret3D/Example下的Example ...
- Unity中数据的存储与交互的初步分析(PlayerPrefs,Dictionary,JsonUnility)
1.PlayerPrefs PlayerPrefs.SetString(key,Value); PlayerPrefs.GetString(key,Value);字符串类型 PlayerPref ...
- Unity3D游戏开发初探—2.初步了解3D模型基础
一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...
- [Unity3D]Unity+Android交互教程——让手机"动"起来
想要用Unity实现一个二维码扫描的功能,然后网上找插件,找到一个貌似叫EasyCodeScanner,但下载下来用用,真不好使,一导入运行就报错,调好错了再运行发现点按钮没反应,反复试了几遍发现还是 ...
- Unity学习疑问记录之触屏
当将Unity游戏运行到ios或android设备上时,桌面系统中的鼠标左键操作可以自动变为手机屏幕上的触屏操作,但鼠标操作无法实现一些特有的触屏操作,比如多点触屏. 触控对于Android移动设备来 ...
随机推荐
- 红帽RHCE培训-课程2笔记目录
目录 1 kickstart自动安装 DHCP+TFTP(syslinux) +FTP +KICKSTART ~/anaconda-ks.cfg system-config-kickstart 2 g ...
- 去除移动端苹果手机(ios)的input默认样式与input禁止键盘出现的方式
样式: input{-webkit-appearance: none;} 在iPhone plus点击input框出生日期时会出现如下图: 为了去掉下面那条苹果自带的,可以这样处理:在HTML中的in ...
- STM32CUBEMX使用操作记录
1.New Project 2.选择芯片型号 3.配置相关外设 4.例如选择了GPIO_Output 5.配置时钟树 灰色框点不了,这和你上一步相关外设配置有关,鼠标靠近灰色框,系统会给出提示 6.工 ...
- [C/C++] 只允许程序运行一个实例
原理是创建一个内核对象之后 如果再创建一个同名的对象 就会给代码中的GetLastError函数对应的变量修改为 ERROR_ALREADY_EXISTS (但是不影响"创建"对象 ...
- 消息队列(五)--- RocketMQ-消息存储2
概述 RocketMQ存储中主要用到以下知识点: mmap 文件映射 内存池 异步刷盘 consumeQueue 同时本节将介绍各个重要的类,本篇文章将介绍 mmap 文件映射的相关方法和内存池相关知 ...
- Node.js 服务端处理图片
Node 服务端处理图片 服务端进行图片处理是很常见的需求,但是Node在这一块相对来说比较薄弱.找了几个比较常见的模块来解决问题. gm GraphicsMagick for node 使用Open ...
- laravel qq邮件配置
- 201771010135杨蓉庆《面向对象程序设计(java)》第二周学习总结
第一部分:理论知识学习部分 3.1 标识符:由字母.下划线.美元符号和数字组成, 且第一个符号不能为数字,可用作:类名.变量名.方法名.数组名.文件名等.有Hello.$1234.程序名.www_12 ...
- event.clientX和event.clientY
event.clientX.event.clientY 鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条.IE事件和标准事件都定义了这2个属性 event.pageX ...
- 转专业后对于C语言补修的一些体会(1)
在转入软件工程后,原来的C语言程序设计只有三学分,而信息学院的C语言程序设计有四学分.迫于无奈的我只能再补修一遍C语言,自我认为大一对于C语言的学习已经基本足够,但我发现信息学院用的是不一样的书后,对 ...