(第一次写真正的技术博客,想把自己做过的,觉得有用的或有趣的东西记下,并分享给大家)

游戏介绍+分析:

素材:很多零碎的碎片+一个完整的背景。(如下图)

        

(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] 迷你拼图相关推荐

  1. Unity游戏设计与实现 南梦宫一线程序员的开发实例pdf

    下载地址:网盘下载 编辑推荐 10个典型的开发实例,覆盖基本游戏类型  怪物--点击动作游戏  迷你拼图--拼图游戏  地牢吞噬者--吃豆游戏  In the Dark Water--3D声音探索游戏 ...

  2. Unity游戏设计与实现 南梦宫一线程序员的开发实例

    图灵程序设计丛书 Unity游戏设计与实现:南梦宫一线程序员的开发实例(修订版) 加藤政树 (作者) 罗水东 (译者)  c# 游戏 unity <内容提要> 本书的作者是日本知名游戏公司 ...

  3. 【JS迷你书】我的 JavaScript 世界观

    我们都生活在主观的世界里,但真实世界却是个复杂系统. 对于一个非线性系统来说,用任何线性思维去理解都会所偏颇. 用<失控>的观点来说,对于非线性系统,你只有运行起来才知道它具体会是什么. ...

  4. 小程序picker_小程序·云开发实战 - 迷你微博

    0. 前言 本文将手把手教你如何写出迷你版微博的一行行代码,迷你版微博包含以下功能: Feed 流:关注动态.所有动态 发送图文动态 搜索用户 关注系统 点赞动态 个人主页 使用到的云开发能力: 云数 ...

  5. unity课设小游戏_Unity制作20个迷你小游戏实例训练视频教程

    本教程是关于Unity制作20个迷你小游戏实例训练视频教程,时长:20小时,大小:3.8 GB,MP4高清视频格式,教程使用软件:Unity,附源文件,作者:Raja Biswas,共97个章节,语言 ...

  6. u盘迷你linux,U盘上的迷你linux——BabyLinux

    U盘上的迷你linux--BabyLinux 类别:发行版类 上传时间:2006-01-09 版本: 大小:82.30 MB 得分:  63% 好 下载次数:1869 投票:  [好]  [差] 相关 ...

  7. Unity2D游戏开发和C#编程大师班

    本课程采用现代游戏开发的最新内容和最新技术(Unity 2D 2022) 学习任何东西的最好方法是以一种真正有趣的方式去做,这就是这门课程的来源.如果你想了解你看到的这些不可思议的游戏是如何制作的,没 ...

  8. PHP+redis实现超迷你全文检索

    2014年10月31日 11:45:39 情景: 我们平台有好多游戏, 运营的同事在查询某一款游戏的时候, 目前使用的是html的select下拉列表的展现形式, 运营的同事得一个个去找,然后选中,耗 ...

  9. 迷你世界电锯机器人_迷你世界:三分钟制作超简单飞翔石像机器人报道!

    更多游戏资讯,请点击上方蓝字查询! 哈喽,大家好,还记得我之前分享的超简单的石像机器人吗?不记得了吗?我再帮助大家回忆回忆,之前研游酱分享的石像机器人总共是分两篇文章,一个是不会动的入下图,一个是会动 ...

  10. 自带数据线的迷你数显充电宝,旅途必备

    还有20多天就过年了 有件极其考验情商的事情也来临了 就是我们这群90后过年最怕的事情--相亲 但是在尴尬的场合 手机可是一个缓解气氛的好东西 不管是想要选择看电影,还是找附近的游玩 只要有手机,就可 ...

最新文章

  1. 【AJAX】JavaScript的面向对象
  2. 【组队学习】【30期】吃瓜教程——西瓜书+南瓜书
  3. mysql图形化及命令行操作用户权限
  4. 一年只有0.001「薇」!杜克大学陈怡然教授自嘲「科学家不如带货」
  5. ISP_MPLS *** 理论笔记
  6. C++类中的封装-9
  7. spring data jpa是什么?
  8. 粉丝提问:求问大神您会查exif吗?
  9. Linux的cifs(samba)文件服务
  10. 一个简单的BP神经网络matlab程序(附函数详解)
  11. python监测网页变化_Python利用Last-Modified实现监控网页变化
  12. 基于springboot实验室管理系统
  13. Excel——检查单元格是否包含文本(不区分大小写)
  14. 世界上第一套电子表格软件 —— VisiCalc
  15. 按一个按钮会随机死人_有一个按钮,按下你会获得一千万,但会随机死一个人,你不用因此负责,你会按吗?...
  16. sdcc 51 迁移记录
  17. 12306html布局,12306更新验证码
  18. tp5实现短信注册,调用第三方接口,电话通知,和短信通知都可以。
  19. 深度学习评估指标之目标检测——(yolov5 可视化训练结果以及result.txt解析)
  20. 专业工具软件课程学习心得

热门文章

  1. 1.10 新概念 have a cold/headache
  2. Hopscotch(POJ-3050)
  3. 揭秘:带你玩转陪玩圈,潮流玩法轻松赚钱
  4. npm切换到百度镜像源
  5. Java 生成订单号
  6. 关闭防火墙linux出错,linux关闭防火墙【应对办法】
  7. Vue知识点囊括清单
  8. 程序员怎么提高代码编写的速度?
  9. End-to-end 3D Point Cloud Instance Segmentation without Detection
  10. U8根据发货单生成销售订单(反向生单)