甜品消消乐知识点总结
本片博客介绍生活中常见的三消游戏的一些做法和知识点O(∩_∩)O哈哈~
Unity 开发单位是以米为单位的,所以当不知道物体大小时 可以新建一个cube 方块做对比
格子在甜品下面,所以同等layer 层 我们依旧可以把order in layer 设置为-1
在设置背景时,基本上可以把背景放的稍微大点 防止某些情况下曝光
可以选中私有静态类实例那一行 按快捷键Ctrl + R + E 来实现属性的快速编写

根据双层for循环生成的格子设置XY轴一般都会这样

因为中心点在中间
由于甜品是从上往下掉的 ,所以Y 一直在减小 所以可以调整为

 GameObject chocolate = Instantiate(gridPrefab, CorrectPositon(x, y), Quaternion.identity);chocolate.transform.SetParent(transform);
    public Vector3 CorrectPositon(int x, int y){//实际需要实例化巧克力块的X位置=GameManager位置的X坐标-大网格长度的一半+行列对应的X坐标//实际需要实例化巧克力块的Y位置=GameManager位置的Y坐标+大网格高度的一半-行列对应的Y坐标return new Vector3(transform.position.x - xColumn / 2f + x, transform.position.y + yRow / 2f - y);}

当使用到字典时 我们希望在面板上能看到相关数据
则我们可以先创建字典
然后创建相应结构体 最后定义一个list
然后在Start里面给字典把list 上的值赋给字典

[System.Serializable]
这行保证我们的结构体可以序列化

赋值阶段
void Start(){//字典的实例化sweetPrefabDict = new Dictionary<SweetsType, GameObject>();for (int i = 0; i < sweetPrefabs.Length; i++){if (!sweetPrefabDict.ContainsKey(sweetPrefabs[i].type)){sweetPrefabDict.Add(sweetPrefabs[i].type, sweetPrefabs[i].prefab);}}}

二维数组的定义方式

如果枚举是定义在类内部 则需要使用类名点枚举名才能获取到
private GameManager.SweetsType type;
糖果的初始化

隐藏该变量在面板上的显示

设置可以调的数字 长度和宽度

    //分步填充public bool Fill(){bool filledNotFinished = false;//判断本次填充是否完成(一次遍历是指当前格子里的所有可移动的甜品都判断一次)//因为我们甜品是由上往下生成的,我们的甜品是由上往下掉落的。所以我们需要从下往上遍历,但是我们不需要遍历最后一行 ,//因为最后一行的下一行没有甜品 所以从yRow-2  并且是倒着for 循环遍历for (int y = yRow-2; y >=0; y--)  //每行{for (int x = 0; x < xColumn; x++) //每列{GameSweet sweet = sweets[x, y];//得到当前元素位置的甜品对象if (sweet.CanMove())//如果无法移动,则无法往下填充(比如饼干这些){GameSweet sweetBelow = sweets[x, y + 1]; //获取当前遍历到的糖果的下一行if (sweetBelow.Type==SweetsType.EMPTY)//垂直填充  (如果是空 则说明可以被上面一行的糖果填充){Destroy(sweetBelow.gameObject);   //删除当前下面那行的空糖果sweet.MovedComponent.Move(x, y + 1,fillTime); //将糖果移动到下一行sweets[x, y + 1] = sweet;    //把下一行的坐标 设为当前糖果CreateNewSweet(x, y, SweetsType.EMPTY); //把原先坐标的引用设置为空filledNotFinished = true;  //单个填充完成}else         //斜向填充   如果下面的不为空 则判断左下 和 右下 是否为空{for (int down = -1; down <= 1; down++)    //(当前X  -1  0  1  分别得到左下 正下 右下){if (down != 0)  //(正下不考虑){int downX = x + down;   //拿到左下和右下的X值if (downX >= 0 && downX < xColumn)   //如果左下右下不超过边界{GameSweet downSweet = sweets[downX, y + 1];  //拿到左下或右下的甜品if (downSweet.Type == SweetsType.EMPTY)   //如果是空则可以填充{bool canfill = true;//用来判断垂直填充是否可以满足填充要求 也就是左下和右下有没有可以掉落的甜品for (int aboveY = y; aboveY >= 0; aboveY--)  //遍历填充的甜品上方有没可以掉的甜品{GameSweet sweetAbove = sweets[downX, aboveY];  //获取这些上方的甜品if (sweetAbove.CanMove())    //如果这些甜品可以掉落,不是饼干{break;   //就不去填了}else if (!sweetAbove.CanMove() && sweetAbove.Type != SweetsType.EMPTY)  //否则如果是饼干或者空{canfill = false;         //左下右下上方不能自己填充break;}}if (!canfill)  {Destroy(downSweet.gameObject);           //删除掉需要填充的地方的空格子sweet.MovedComponent.Move(downX, y + 1, fillTime); //将甜品移到目标位置sweets[downX, y + 1] = sweet;    //设置引用CreateNewSweet(x, y, SweetsType.EMPTY);//原位置新生成一个空甜品filledNotFinished = true;  //没有完成填充break;}}}}}}}}}//最上排的特殊情况for (int x = 0; x < xColumn; x++){GameSweet sweet = sweets[x, 0];if (sweet.Type==SweetsType.EMPTY){//在最上排的上一排再生成甜品GameObject newSweet= Instantiate(sweetPrefabDict[SweetsType.NORMAL], CorrectPositon(x, -1), Quaternion.identity);newSweet.transform.parent = transform;sweets[x, 0] = newSweet.GetComponent<GameSweet>();sweets[x, 0].Init(x, -1, this, SweetsType.NORMAL);sweets[x, 0].MovedComponent.Move(x, 0,fillTime);sweets[x, 0].ColoredComponent.SetColor((ColorSweet.ColorType)Random.Range(0, sweets[x, 0].ColoredComponent.NumColors));filledNotFinished = true;}}return filledNotFinished;}
    //全部填充的方法public IEnumerator AllFill(){bool needRefill = true;while (needRefill){yield return new WaitForSeconds(fillTime);while (Fill()) //判断时会执行Fill 方法 如Fill 填充了则返回true while 执行完又会判断Fill 方法{yield return new WaitForSeconds(fillTime);}//清除所有我们已经匹配好的甜品needRefill= ClearAllMatchedSweet();}}


每个甜品都会检测
当点击时 代表自己是先选中的 对象1
当Enter 时代表自己是从其他地方移过来的 也就是要交换的对象2
松开时就12交换

做销毁动画时
我们创建了一个帧动画 如果只希望在甜品销毁时播放这个动画 那么这个动画就不能为默认动画,必须新建一个默认动画来作为默认动画

行匹配和列匹配 以及 L 和 T 型匹配逻辑

算法

 //匹配方法public List<GameSweet> MatchSweets(GameSweet sweet,int newX,int newY){if (sweet.CanColor()){ColorSweet.ColorType color = sweet.ColoredComponent.Color;List<GameSweet> matchRowSweets = new List<GameSweet>();List<GameSweet> matchLineSweets = new List<GameSweet>();List<GameSweet> finishedMatchingSweets = new List<GameSweet>();//行匹配matchRowSweets.Add(sweet);//i=0代表往左,i=1代表往右for (int i = 0; i <=1; i++){for (int xDistance = 1; xDistance < xColumn; xDistance++){int x;if (i==0){x = newX - xDistance;}else{x = newX + xDistance;}if (x<0||x>=xColumn){break;}if (sweets[x,newY].CanColor()&&sweets[x,newY].ColoredComponent.Color==color){matchRowSweets.Add(sweets[x, newY]);}else{break;}}}if (matchRowSweets.Count>=3){for (int i = 0; i < matchRowSweets.Count; i++){finishedMatchingSweets.Add(matchRowSweets[i]);}}//L T型匹配//检查一下当前行遍历列表中的元素数量是否大于3if (matchRowSweets.Count>=3){for (int i = 0; i < matchRowSweets.Count; i++){//行匹配列表中满足匹配条件的每个元素上下依次进行列遍历// 0代表上方 1代表下方for (int j = 0; j <=1; j++){for (int yDistance = 1; yDistance < yRow; yDistance++){int y;if (j==0){y = newY - yDistance;}else{y = newY + yDistance;}if (y<0||y>=yRow){break;}if (sweets[matchRowSweets[i].X,y].CanColor()&&sweets[matchRowSweets[i].X,y].ColoredComponent.Color==color){matchLineSweets.Add(sweets[matchRowSweets[i].X, y]);}else{break;}}}if (matchLineSweets.Count<2){matchLineSweets.Clear();}else{for (int j = 0; j < matchLineSweets.Count; j++){finishedMatchingSweets.Add(matchLineSweets[j]);}break;}}}if (finishedMatchingSweets.Count>=3){return finishedMatchingSweets;}matchRowSweets.Clear();matchLineSweets.Clear();matchLineSweets.Add(sweet);//列匹配//i=0代表往左,i=1代表往右for (int i = 0; i <= 1; i++){for (int yDistance = 1; yDistance < yRow; yDistance++){int y;if (i == 0){y = newY - yDistance;}else{y = newY + yDistance;}if (y < 0 || y >= yRow){break;}if (sweets[newX, y].CanColor() && sweets[newX, y].ColoredComponent.Color == color){matchLineSweets.Add(sweets[newX, y]);}else{break;}}}if (matchLineSweets.Count >= 3){for (int i = 0; i < matchLineSweets.Count; i++){finishedMatchingSweets.Add(matchLineSweets[i]);}}//L T型匹配//检查一下当前行遍历列表中的元素数量是否大于3if (matchLineSweets.Count >= 3){for (int i = 0; i < matchLineSweets.Count; i++){//行匹配列表中满足匹配条件的每个元素上下依次进行列遍历// 0代表上方 1代表下方for (int j = 0; j <= 1; j++){for (int xDistance= 1; xDistance < xColumn; xDistance++){int x;if (j == 0){x = newY - xDistance;}else{x = newY + xDistance;}if (x < 0 || x >= xColumn){break;}if (sweets[x, matchLineSweets[i].Y].CanColor() && sweets[x, matchLineSweets[i].Y].ColoredComponent.Color == color){matchRowSweets.Add(sweets[x, matchLineSweets[i].Y]);}else{break;}}}if (matchRowSweets.Count < 2){matchRowSweets.Clear();}else{for (int j = 0; j < matchRowSweets.Count; j++){finishedMatchingSweets.Add(matchRowSweets[j]);}break;}}}if (finishedMatchingSweets.Count >= 3){return finishedMatchingSweets;}}return null;}

计时器

快捷格式化方法
Tostring(“0”) 取整数
Tostring(“0.0”) 保留一位小数

如果想让数字加的明显 可以设置每0.05秒分数加1

    if (addScoreTime<=0.05f){addScoreTime += Time.deltaTime;}else{if (currentScore<playerScore){currentScore++;playerScoreText.text = currentScore.ToString();addScoreTime = 0;}}

甜品消消乐知识点总结相关推荐

  1. Unity3D_(游戏)甜品消消乐01_游戏基础界面

    甜品消消乐游戏 (脚本源码在游戏UI设计最下方) 三消游戏,存在L型消除有一点小Bug,当甜品在饼干附近消除时会清除饼干 饼干作为游戏障碍物时不可移动的,多块饼干并排时会挡住甜品掉落 发现消除类游戏的 ...

  2. Unity甜品消消乐--核心原理

    此游戏为甜品消消乐游戏,会大概说一些核心的算法,如有错误请指出. 思路: 消消乐游戏是一种休闲类的游戏,大家都应该玩过,如上述图片中饼干是障碍物,其他的甜品我们可以来使其数量为三,来使它们消除.最常见 ...

  3. Unity 3D游戏-消消乐(三消类)教程和源码

    Unity 消消乐教程和源码 本文提供全流程,中文翻译. Chinar坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Start Game ...

  4. python端午dragboat消消乐 美轮美奂的界面效果

    python端午,dragboat消消乐 美轮美奂的界面效果 1. 效果图 2. 源码 2.1 素材准备源码(消消乐图.bg音乐) 2.2 消消乐源码 参考 跟着大佬的步伐,消消乐俩步走~~ 找素材, ...

  5. java开心消消乐代码_今晚请屏住呼吸,开心消消乐拍电影了!

    一眨眼 村长已经和大家在一起六年啦 在这些日子里 我们在一起慢慢长大 有些人褪去稚嫩,步入社会 有些人在外打拼,为梦想奋斗 有些人功成名就,却遗失幸福 ...... 但无论你是哪一种 还记得让你最开心 ...

  6. 猜猜乐游戏php源码,C/C++百行代码实现热门游戏消消乐功能的示例代码

    游戏设计 首先我们需要使用第三方框架,这里我使用的是sfml,不会使用sfml在我的上几篇文章当中-扫雷(上)有详细的开发环境搭建介绍 首先准备图片资源 一张背景图片,一张宝石图片 窗口初始化加载图片 ...

  7. python编程游戏手机版_利用Python开发手机同款游戏:开心消消乐

    手机上面的开心消消乐,我想大部分人都是玩过的吧,今天小编就教大家如何用python开发这款游戏 不过只有十个关卡,不像手机里面那么多的关卡!不过游戏的画面和bgm都是同款的哦~ 效果图 基本配置 wi ...

  8. 网页版消消乐快速实现,无代码吗iVX 真那么简单?

    最近没事想做个消消乐,然后听说 iVX 免费了,所以又跑去看看 iVX 了,就用一个无代码来看看消消乐怎么玩吧. 首先咱们打开 iVX 的在线编辑器:https://editor.ivx.cn/ 随后 ...

  9. android飞翔的小鸟游戏素材包_开心消消乐×愤怒的小鸟:为开心而战

    手机里总有那么一些游戏,是你一旦不小心打开,就完全停不下来的.在这份"一直玩一直爽游戏清单"里,绝对少不了开心消消乐和愤怒的小鸟的身影. 神奇的是,在2020的夏天,它们合体了!在 ...

最新文章

  1. inline函数返回值_C++知识补充-指针,const,函数指针,指针数组,运算符重载
  2. 2021-03-10 Python多线程爬虫快速批量下载图片
  3. Java21-day12【网络编程(网络编程入门(ip地址、端口、协议、InetAddress)、UDP通信程序、TCP通信程序)】
  4. Free Code Camp现在有本地组
  5. after you've written your business model
  6. 关于抽象类与接口的理解
  7. Spring Boot 核心原理与源码解析-大纲
  8. 2018-2019-1 20165323《信息安全系统设计基础》第一周学习总结
  9. 服装CAD计算机按钮在哪里,富仪服装CAD快捷键大全
  10. python写梦幻西游脚本精灵_奔三新人学习按键精灵脚本做冷门项目
  11. 数值计算之第四期:追赶法和范数
  12. win10 修改gitlab账号_win10--git安装以及gitlab配置
  13. 测试小故事61:真的明白了吗?
  14. tomcat、APR模式
  15. 图片太大如何压缩?学会这个方法轻松压缩
  16. C语言>>8 0xFF; 0xFF;作用
  17. idea提交本地项目到oschina
  18. 工业和信息化部办公厅关于深入推进移动物联网全面发展的通知
  19. 录取为2021年同济大学秋季博士研究生(电子与信息工程学院计算机科学与技术)
  20. 让预训练语言模型读懂数字:超对称技术联合复旦知识工场等发布10亿参数BigBang Transformer[乾元]金融大规模预训练语言模型

热门文章

  1. 计算机IT专业排行,选专业9:计算机类各专业大学排名最新出炉
  2. 韦东山:驱动和APP,根本不应该上升到互相鄙视的地步
  3. 古城罗马、佛洛伦萨、庞贝、比萨一览
  4. 一个爬虫练习游戏:黑板课爬虫闯关
  5. type struct 和struct的区别
  6. 擦窗机器人不用时怎么收纳_擦窗机器人如何保证不会高空掉落,这些措施必不可少...
  7. python3爬虫系列之使用requests爬取LOL英雄图片
  8. 《WEB安全漏洞100讲》(第4讲)CSRF漏洞
  9. 【分享】WebForm中DataGrid的20篇经典文章
  10. 数组-leetcode#15-找出三个数之和等于0的所有不重复序列