[unity2D] 迷你拼图
(第一次写真正的技术博客,想把自己做过的,觉得有用的或有趣的东西记下,并分享给大家)
游戏介绍+分析:
素材:很多零碎的碎片+一个完整的背景。(如下图)
(ps: 其中图片来自《unity设计与实现》第二章的拼图游戏的图片,原书是在unity3D中进行制作,运用了透视变换法,有一定的难度。而我在这里,用unity建立一个2D的工程,使迷你拼图游戏更好实现,也更好理解。我借用书中的教材,把它的.tga图片稍微修改下,转成 .PNG的图片格式,做学习用。)
玩法:点击一个碎片,然后把其拖到相应的位置而“放下”。(拖到准确位置附近时,松手自己识别到准确位置)
难点:
- 碎片的初始位置应该随机,不然每次打开一样,完全没有趣味;
- 点击拖动
- 在准确位置的附近松开就可以”拼“到相应的位置
游戏实现步骤:
1、建立工程:
新建立一个新工程,放到自己想放的地方(地址必须全为英文,不然有时运行会出错),选择为2D。
2、保存场景+导入资源
打开一个 ”scene“,点击 File -> Save Scene,保存场景。
在 Project 中的 Assets ,创建两个文件夹 ”Script“ 和 ”Sprite“ ,分别用来存放编写的脚本程序和图片(也就是2 D 中所说的精灵)。并把前面准备的两张图片 ”owl_back“ 和 ”owel_puzzle“ ,拖到 ”Sprite“ 中,为使用做准备。
3、分割图片+放置
图片 “owl_puzzle” 是多个碎片拼合在一起的,要选择其 “Sprite Mode” 为 “Multiple” ,然后点击 “Sprite Editor” ,在出来的新窗口中,点击左上角的 “Slice”, 对图片进行分割,也可以自己手动分割。窗口的右下角是对分割子图的设定,可以设定名字,具体大中,其图片的中心等,如左下图。
分割好后,点击“Apply”,在“Project” 里,点击图片右边的小箭头,已有资源变成如下图:
先把图片“owl_back”拖到"Hierarchy"面板中,在“Transform”面板中的值为原始值(position: 0,0,0; rotation: 0,0,0; Scale: 1,1,1),作为整个游戏的背景。点击GameObject->Create Empty建立一个空物体,命名为puzzle,再把分割好的owl_puzzle_0到owl_puzzle_7拖到puzzle里,作为其子游戏对象,其位置随意调整。结果如下:
4、初始化位置
每个碎片的位置要求在开始游戏时是随机生成的,所以需要建立一个C#脚本“puzzle.cs”,进行脚本控制,在 Start( ){ }函数里,进行每个位置的初始化。声明一个公共GameObject[ ],来放置碎片。有两种简单的可用的方法:
- 给每个碎片一个在合理范围内的一个初始位置
for (i=0; i<size; i++) {xx=Random.Range(-55,20)/75;yy=Random.Range(-35,35)/70;}
- 先给每个碎片一个初始位置,也就是我们拖得物体所在的位置,然后让每个碎片和随机的一个碎片交换位置,因为随机性,每次生成的结果都看起来是不一样的:
Vector3 temp = Vector3.zero;for (i=0; i<size; i++) {t=Random.Range(0,size-1);temp=fragment[i].transform.position;fragment[i].transform.position=fragment[t].transform.position;fragment[t].transform.position=temp;}
5、设置结束位置
为了确定拖到一个碎片,把其拖到了正确的位置上,我们要提前确定每个位置在哪,并记录下来。建立一个空物体,命名为“position”,建立其8个子物体,命名分别为“position_0”到“position_7”,其中每一个"Transform"里的“Position”就是对应编号碎片的正确位置。(这个需要先自己在编译器中把碎片放到指定位置,把图片拼好,并把每个的正确的位置坐标记录下来)。
eg,在我的图中,“position_0” 的位置应该为:
6、点击图片响应
有一个很简单的方法,创建一个空物体,命名为 “mouse”,把它和拼图碎片 “puzzle”,结束的位置 “position” ,这些游戏对象变成刚体组件,用碰撞来触发两者之间接触,而达到我们想要的效果。具体如下:
- 拼图碎片 “puzzle” ,给每一个加上"Rigidbody 2D" 刚体组件和 “PolygonCollider 2D” 平面碰撞组件,把 “Is Kinematic” 和 “Is Trigger” 的勾勾上,表示"是否运动"和“是否被触发”,并加一个 “puzzle” 的标签,以便后面识别发生碰撞的是拼图碎片。
- 位置 “position” ,同样给每个位置的空物体加上 "Rigidbody 2D" 刚体组件和 “PolygonCollider 2D” 平面碰撞组件,把 “Is Kinematic” 和 “Is Trigger” 的勾勾上,表示"是否运动"和“是否被触发”,设置标签为 “position” ,以便后面识别是否能把碎片放到正确的位置上。
- “mouse” 空物体,同样加上刚体组件和碰撞组件,它随着鼠标的移动而不断移动,为点击事件做准备。把 “puzzle.cs” 脚本绑定于此,控制 “mouse” 每帧位置的更新,并为了以下的操作。
每当鼠标点击。且满足 “mouse” 与标签为 “puzzle” 的刚体发生碰撞,表示点击上物体,让物体也跟随鼠标移动,然后有以下几种情况:
鼠标是否松开 | 物体是否被拖到正确位置 | 结果 |
---|---|---|
否 | - | 持续被拖动 |
是 | 否 | 回到原始位置 |
是 | 是 | 拼图碎片放到正确的位置且设置标签为 “position” |
为了实现这个目的,我们设定了一个公共的 “bool” 变量 "IsChongHe" ,并新建了一个脚本 “Item.cs” 来判定 “IsChongHe” 的具体值,主要是判断碎片 “puzzle” 和 “position” 空刚体,重合前,重合时,重合后的各个转态。 并把 “Item.cs” 绑定在每一个 “puzzle”上。
剩下的具体的代码如下:
(“puzzle.cs”)
public string puzzlename="position";public GameObject[] fragment;private bool isMouseDown=false;public bool isClicked=false;private bool overlap=false;private Vector3 oldposition;private GameObject target=null;void Start () {……//初始化碎片的位置;}void Update () {//使mouse始终跟着鼠标走transform.position = Camera.main.ScreenToWorldPoint (new Vector3(Input.mousePosition.x,Input.mousePosition.y,1));isMouseDown=Input.GetMouseButton(0); //鼠标左键按下时,isMouseDown为trueif(!isMouseDown&&isClicked){ //item被拖动过程中鼠标左键放开isClicked=false;if(!overlap)target.transform.position=oldposition;}//在item被拖动过程中保证其始终跟着mouse走,并时刻判定其是否与对应node重合if(isClicked){target.transform.position=transform.position;overlap=target.GetComponent<item>().isChongHe;}}void OnTriggerStay2D(Collider2D other) {if(isMouseDown && !isClicked && other.gameObject.tag=="puzzle"){isClicked=true;target=GameObject.Find(other.gameObject.name);oldposition=other.transform.position;puzzlename="position_"+other.gameObject.name[7];}}
(“Item.cs”)
public bool isChongHe=false; //是否与其对应的node重合private GameObject mouseObject;// Use this for initializationvoid Start () {mouseObject = GameObject.Find ("mouse");}//进入对应的position时,将isChongHe置为truevoid OnTriggerEnter2D(Collider2D other){if (other.gameObject.tag == "position") {if(other.gameObject.name==mouseObject.GetComponent<puzzle>().puzzlename)isChongHe = true;}}//离开对应的positioin时,将isChongHe置为falsevoid OnTriggerExit2D(Collider2D other){if (other.gameObject.tag == "position") {if(other.gameObject.name==mouseObject.GetComponent<puzzle>().puzzlename)isChongHe = false;}}//当自身被拖动到对应的position处并放开后void OnTriggerStay2D(Collider2D other){if (other.gameObject.tag == "position") {if(other.gameObject.name==mouseObject.GetComponent<puzzle>().puzzlename && !mouseObject.GetComponent<puzzle>().isClicked){this.transform.tag="position";this.transform.position=other.transform.position;}}}
Ps:相关联的资源图片和工程,也已经上传,点击:unity2d_拼图小游戏
[unity2D] 迷你拼图相关推荐
- Unity游戏设计与实现 南梦宫一线程序员的开发实例pdf
下载地址:网盘下载 编辑推荐 10个典型的开发实例,覆盖基本游戏类型 怪物--点击动作游戏 迷你拼图--拼图游戏 地牢吞噬者--吃豆游戏 In the Dark Water--3D声音探索游戏 ...
- Unity游戏设计与实现 南梦宫一线程序员的开发实例
图灵程序设计丛书 Unity游戏设计与实现:南梦宫一线程序员的开发实例(修订版) 加藤政树 (作者) 罗水东 (译者) c# 游戏 unity <内容提要> 本书的作者是日本知名游戏公司 ...
- 【JS迷你书】我的 JavaScript 世界观
我们都生活在主观的世界里,但真实世界却是个复杂系统. 对于一个非线性系统来说,用任何线性思维去理解都会所偏颇. 用<失控>的观点来说,对于非线性系统,你只有运行起来才知道它具体会是什么. ...
- 小程序picker_小程序·云开发实战 - 迷你微博
0. 前言 本文将手把手教你如何写出迷你版微博的一行行代码,迷你版微博包含以下功能: Feed 流:关注动态.所有动态 发送图文动态 搜索用户 关注系统 点赞动态 个人主页 使用到的云开发能力: 云数 ...
- unity课设小游戏_Unity制作20个迷你小游戏实例训练视频教程
本教程是关于Unity制作20个迷你小游戏实例训练视频教程,时长:20小时,大小:3.8 GB,MP4高清视频格式,教程使用软件:Unity,附源文件,作者:Raja Biswas,共97个章节,语言 ...
- u盘迷你linux,U盘上的迷你linux——BabyLinux
U盘上的迷你linux--BabyLinux 类别:发行版类 上传时间:2006-01-09 版本: 大小:82.30 MB 得分: 63% 好 下载次数:1869 投票: [好] [差] 相关 ...
- Unity2D游戏开发和C#编程大师班
本课程采用现代游戏开发的最新内容和最新技术(Unity 2D 2022) 学习任何东西的最好方法是以一种真正有趣的方式去做,这就是这门课程的来源.如果你想了解你看到的这些不可思议的游戏是如何制作的,没 ...
- PHP+redis实现超迷你全文检索
2014年10月31日 11:45:39 情景: 我们平台有好多游戏, 运营的同事在查询某一款游戏的时候, 目前使用的是html的select下拉列表的展现形式, 运营的同事得一个个去找,然后选中,耗 ...
- 迷你世界电锯机器人_迷你世界:三分钟制作超简单飞翔石像机器人报道!
更多游戏资讯,请点击上方蓝字查询! 哈喽,大家好,还记得我之前分享的超简单的石像机器人吗?不记得了吗?我再帮助大家回忆回忆,之前研游酱分享的石像机器人总共是分两篇文章,一个是不会动的入下图,一个是会动 ...
- 自带数据线的迷你数显充电宝,旅途必备
还有20多天就过年了 有件极其考验情商的事情也来临了 就是我们这群90后过年最怕的事情--相亲 但是在尴尬的场合 手机可是一个缓解气氛的好东西 不管是想要选择看电影,还是找附近的游玩 只要有手机,就可 ...
最新文章
- 【AJAX】JavaScript的面向对象
- 【组队学习】【30期】吃瓜教程——西瓜书+南瓜书
- mysql图形化及命令行操作用户权限
- 一年只有0.001「薇」!杜克大学陈怡然教授自嘲「科学家不如带货」
- ISP_MPLS *** 理论笔记
- C++类中的封装-9
- spring data jpa是什么?
- 粉丝提问:求问大神您会查exif吗?
- Linux的cifs(samba)文件服务
- 一个简单的BP神经网络matlab程序(附函数详解)
- python监测网页变化_Python利用Last-Modified实现监控网页变化
- 基于springboot实验室管理系统
- Excel——检查单元格是否包含文本(不区分大小写)
- 世界上第一套电子表格软件 —— VisiCalc
- 按一个按钮会随机死人_有一个按钮,按下你会获得一千万,但会随机死一个人,你不用因此负责,你会按吗?...
- sdcc 51 迁移记录
- 12306html布局,12306更新验证码
- tp5实现短信注册,调用第三方接口,电话通知,和短信通知都可以。
- 深度学习评估指标之目标检测——(yolov5 可视化训练结果以及result.txt解析)
- 专业工具软件课程学习心得