Unity3D消消乐制作感想及部分代码:
1:首先记录下该项目用到的部分知识——》dwteen插件,队列(Queue)的使用,对象池的使用,二维数组的使用。

消消乐的核心是算法,(寻找相邻相同物体算法,下落算法)

寻找相邻相同算法,自我理解,该算法是泛洪算法(四邻域)利用递归将所有相邻相同物体存到一个list中,泛洪算法经常用于改变图片的颜色,但是不能用递归(用递归会造成内存溢出,后期会写出来,改变图片上的相邻相同颜色的值)

 /// <summary>/// 执行完成后,找到了所有和点击对象相邻,且具有相同sprite的对象/// </summary>public void FillSameItemsList(Item current){//如果已存在,跳过if (sameItemsList.Contains(current))return;//添加到列表sameItemsList.Add(current);//上下左右的ItemItem[] tempItemList = new Item[]{_GetUpItem(current),_GetDownItem(current),_GetLeftItem(current),_GetRightItem(current)};for (int i = 0; i < tempItemList.Length; i++){//如果Item不合法,跳过if (tempItemList[i] == null)continue;if (current.indexTag == tempItemList[i].indexTag){FillSameItemsList(tempItemList[i]);}}}
   /// <summary>/// 获取上方Item/// </summary>/// <returns>The up item.</returns>/// <param name="current">Current.</param>private Item _GetUpItem(Item current){int row = current.itemRow + 1;int column = current.itemColumn;if (!_CheckRCLegal(row, column))return null;return allItems[row, column];}/// <summary>/// 获取下方Item/// </summary>/// <returns>The down item.</returns>/// <param name="current">Current.</param>private Item _GetDownItem(Item current){int row = current.itemRow - 1;int column = current.itemColumn;if (!_CheckRCLegal(row, column))return null;return allItems[row, column];}/// <summary>/// 获取左方Item/// </summary>/// <returns>The left item.</returns>/// <param name="current">Current.</param>private Item _GetLeftItem(Item current){int row = current.itemRow;int column = current.itemColumn - 1;if (!_CheckRCLegal(row, column))return null;return allItems[row, column];}/// <summary>/// 获取右方Item/// </summary>/// <returns>The right item.</returns>/// <param name="current">Current.</param>private Item _GetRightItem(Item current){int row = current.itemRow;int column = current.itemColumn + 1;if (!_CheckRCLegal(row, column))return null;return allItems[row, column];}/// <summary>/// 检测行列是否合法/// </summary>/// <returns><c>true</c>, if RC legal was checked, <c>false</c> otherwise.</returns>/// <param name="itemRow">Item row.</param>/// <param name="itemColumn">Item column.</param>public bool _CheckRCLegal(int itemRow, int itemColumn){if (itemRow >= 0 && itemRow < rowNum && itemColumn >= 0 && itemColumn < columnNum)return true;return false;}

下落算法,逐列,逐个下落,利用队列存储需要下落的物体(使用队列的优点,先进先出—方便按照顺序逐个下落)

 /// <summary>/// 执行点击对象后的效果/// </summary>public void FillBoomList(Item current){if (sameItemsList.Count < 3)return;boomList.AddRange(sameItemsList);List<Item> tempBoomList = new List<Item>();tempBoomList.AddRange(boomList);StartCoroutine(ManipulateBoomList(tempBoomList, current));}IEnumerator ManipulateBoomList(List<Item> tempBoomList, Item current){//将所有的物体都拿出来,进行效果展示click_thenParent.transform.position = current.transform.position;for (int i = 0; i < tempBoomList.Count; i++){tempBoomList[i].transform.parent = click_thenParent.transform;}click_thenParent.transform.DOScale(1.1f, 0.3f).onComplete = delegate{click_thenParent.transform.DOScale(0f, 0.1f).onComplete = delegate{current.transform.parent = ItemParent;current.transform.localScale = Vector3.one;};};yield return new WaitForSeconds(0.4f);//后期修改换成for循环foreach (var item in tempBoomList){//将被消除的Item在全局列表中移除allItems[item.itemRow, item.itemColumn] = null;//回收Item:可以先不回收,这样可以进行一系列的动画操作SinglePool.instance.SetGameObject(item.gameObject);item.transform.localScale = Vector3.one;}click_thenParent.transform.localScale = Vector3.one;//开启下落yield return StartCoroutine(ItemsDrop());}/// <summary>/// 下落/// </summary>/// <returns>The drop.</returns>public IEnumerator ItemsDrop(){//逐列检测for (int i = 0; i < columnNum; i++){//计数器int count = 0;//下落队列Queue<Item> dropQueue = new Queue<Item>();//逐行检测for (int j = 0; j < rowNum; j++){if (allItems[j, i] != null){//计数count++;//放入队列dropQueue.Enqueue(allItems[j, i]);}}//当一列检查完毕后可以生成物体在上面for (int m = 0; m < 7 - count; m++){GameObject currentItem = SinglePool.instance.GetGameObject("Item", ItemParent);currentItem.transform.localScale = Vector3.one;Item currBtnItem = currentItem.GetComponent<Item>();currBtnItem.itemRow = m;currBtnItem.itemColumn = i;int index = Random.Range(0, 2);currBtnItem.indexTag = index;currBtnItem.imgBg.sprite = bgSps[index];currBtnItem.transform.position = InitPos[currBtnItem.itemRow, currBtnItem.itemColumn].position;dropQueue.Enqueue(currBtnItem);}//下落for (int k = 0; k < count; k++){//获取要下落的ItemItem current = dropQueue.Dequeue();//修改全局数组(原位置情况)allItems[current.itemRow, current.itemColumn] = null;//修改Item的行数int tempRow = current.itemRow;current.itemRow = k;//修改全局数组(填充新位置)allItems[current.itemRow, current.itemColumn] = current;//下落current._CurrentItemDrop(trueInitPos[current.itemRow, current.itemColumn].position);}for (int l = 0;  dropQueue.Count>0; l++){//   print("Count: "+dropQueue.Count+"  l:"+l);//获取要下落的ItemItem current = dropQueue.Dequeue();//修改Item的行数current.itemRow = 6-l;//修改全局数组(填充新位置)allItems[current.itemRow, current.itemColumn] = current;//下落// print("row:"+current.itemRow+"column:"+current.itemColumn);current._CurrentItemDrop(trueInitPos[current.itemRow, current.itemColumn].position);}}yield break;//  print("创建新的对象");// StartCoroutine(CreateNewItem());}

下落之前需要在每列上方生成需要的物体,这里使用的是对象池管理对象,减少了生成销毁对象的步骤(这也算是优化了游戏)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;public class SinglePool : MonoBehaviour
{//单例public static SinglePool instance;//对象池private Dictionary<string, List<GameObject>> pool;void Awake(){instance = this;pool = new Dictionary<string, List<GameObject>>();}/// <summary>/// 对象池回收物体/// </summary>/// <param name="current">被回收的不需要的对象.</param>public void SetGameObject(GameObject current){//设置成非激活状态current.SetActive(false);//清空父对象//      current.transform.parent = null;//是否有该类型的对象池if (pool.ContainsKey(current.name)){//添加到对象池pool[current.name].Add(current);}else{pool[current.name] = new List<GameObject>() { current };}}/// <summary>/// 对象池获取物体/// </summary>/// <returns>The game object.</returns>/// <param name="objName">物体名字.</param>/// <param name="parent">父对象名字.</param>public GameObject GetGameObject(string objName, Transform parent = null){GameObject current;//包含此对象池,且有对象string objName2 = objName + "(Clone)";if (pool.ContainsKey(objName2) && pool[objName2].Count > 0){//获取对象//  print("获取对象次中的对象");current = pool[objName2][0];current.transform.localScale = new Vector3(1, 1, 1);pool[objName2].Remove(pool[objName2][0]);}else{//加载预设体GameObject prefab = Resources.Load<GameObject>("Prefabs/" + objName);//生成current = Instantiate(prefab) as GameObject;}//设置激活状态current.SetActive(true);//设置父物体current.transform.parent = parent;//返回return current;}
}

至于加分过关等代码都是简单的添加就可以了。最主要的是上面的一些代码。
对我来说,容易忘记的是下落算法的实现(这里利用的是逐个下落的方式,这也算是个很好的方法)

原工程版本2018.2.7,需要的小伙伴可以到我的资源里下载。
链接: https://pan.baidu.com/s/1EbkNjfU5V2QzntmKk8d1fA 提取码: vd3s 复制这段内容后打开百度网盘手机App,操作更方便哦
实现效果:

这里有一个qq群:群号:319506028,名字:Unity、AR、VR俱乐部,里面有很多技术大神,可以在群里问问题(关于unity的任何问题,不限VR AR,群名不重要),欢迎你的加入。

unity3D制作消消乐游戏/三消算法相关推荐

  1. Unity3D制作巡逻兵小游戏

    一.主体代码架构说明 二.发布与订阅模式 相关类图 C#中的实现:delegate委托类型和event事件机制 意义 在本次游戏中的具体应用 三.游戏主要行为分析 1. 巡逻兵的行为 与其他物体/角色 ...

  2. unity3d制作自己简单游戏场景

    下面演示一下如何用unity3d制作一个自己的游戏场景 1. 导入环境资源 Assets -> import packet -> environments 2. 新建terrain 3.在 ...

  3. java开心消消乐代码_Vue实现开心消消乐游戏算法

    摘要:这篇Vue栏目下的"Vue实现开心消消乐游戏算法",介绍的技术点是"开心消消乐.Vue.开心.游戏.算法.实现",希望对大家开发技术学习和问题解决有帮助. ...

  4. 基于Unity3D经典消消乐游戏源码,代码详细注释,c#版方块消消乐源代码

    使用Unity2017开发,实现功能有: 基本消除功能 UI动画以及代码控制动画 消除动画以及手势识别 消除判定.连续消除判定 UI是自己独立完成比较简单,打包平台我设置的是webGL平台,有需要改成 ...

  5. 手把手教你,三分钟学会制作「消消乐」游戏

    消消乐,大概是陪伴我们长大的游戏,从以前的消方块,到现在的开心消消乐.宾果消消乐! 今天,我们要教给大家编程制作消除游戏!消除游戏孩子们都喜欢玩,今天,咱们就与孩子们一起用最新的Scratch 3.0 ...

  6. 【游戏开发实战】使用Unity制作水果消消乐游戏教程(二):随机生成水果

    文章目录 一.前言 二.导入水果图片素材 三.制作水果预设 四.水果生成器 五.挂FruitSpawner脚本 六.运行测试 一.前言 嗨,大家好,我是新发.下班坐地铁的时候,好几次看到其他人在玩消消 ...

  7. Appgamekit制作消消乐小游戏(附代码)# 1

    Appgamekit制作消消乐小游戏(附代码)# 1 其实作者我也是刚刚才接触的Appgamekit,而且以前我是学C/C++的,所以我学的东西拿来这里就只有代码的结构思路会清晰一点了.(但是思路其实 ...

  8. 消消乐 游戏算法html,小游戏版消消乐

    概述:最近看了点算法,为了对其有深刻的体会,利用周末时间撸了一个简易版的三消游戏,采用JS+Canvas实现,没有使用额外的游戏引擎,对于初学者来说,也比较容易入门的.下面是小游戏效果展示: 效果展示 ...

  9. 基于Python制作的消消乐小游戏

    导语 哈喽,好久不见.消失人口上线更新一波每月必出的 python 制作小游戏系列文章.本期我们将制作一个消消乐小游戏,让我们愉快地开始吧 开发工具 Python 版本:3.6.4 相关模块: pyg ...

  10. 【游戏开发实战】使用Unity制作水果消消乐游戏教程(八):游戏得分加分效果

    文章目录 一.前言 二.使用TextMeshPro显示得分 1.导入TTF字体到工程中 2.创建字源txt文件 3.生成字体asset 4.制作得分预设 三.得分数字动画 四.得分代码 五.运行测试 ...

最新文章

  1. mysql从另一张获取数据的方法
  2. 07-09-Exchange Server 2019-配置-Outlook 2019
  3. RookeyFrame 删除 线下添加的model
  4. 各类编程语言视频教程(300G)
  5. canal mysql5.6_超详细的Canal入门,看这篇就够了!
  6. 2017-2018-1 20155320 嵌入式C语言——时钟
  7. DB2创建数据库示例
  8. 安卓手机root流程
  9. 手机当台式电脑摄像头
  10. 服务器都是sas硬盘吗,SAS硬盘一般用于服务器
  11. 小米路由红包显示无法找到服务器,小米路由器找不到硬盘怎么办 小米路由器访问不到硬盘的解决办法...
  12. 豆瓣读书数据分析实战
  13. 微软新的邮件帐户域名 @live.com和@windowslive.com
  14. 『每周译Go』并发安全的集中式指针管理设施
  15. JavaScript 事件和事件类型
  16. 【入门】算法初步1 排序
  17. 2.2 Collections类 (Collections源码解析)
  18. 记录:php上传图片至服务器 并返回显示图片地址
  19. BILSTM原理介绍
  20. 自适应漫画APP下载单页二次元

热门文章

  1. 1980-2018年中国及世界各国实际利率数据
  2. 神经网络与误差反向传播算法
  3. 以教育行业为例,教产品经理如何做行业分析
  4. 【ROS】ubuntu20.04+ROS安装上遇到的坑(主要是time out)
  5. 如何申请Gmail邮箱?_manok_新浪博客
  6. 计算机主板维修试卷,计算机主板维修试卷.doc
  7. 「区块链系列」搭建区块链底层技术
  8. 通俗理解电磁干扰及共模电感的原理
  9. after meet KeyNi liu
  10. 查看本地硬盘raid级别linux,linux 下查看硬盘型号、大小等信息(含Raid)