布局

祖玛游戏就不介绍了,此类游戏是关卡游戏。所以必须的先布关卡:

如图所示,必须先填充路径的点,游戏中的珠子就根据这个路径不断的向洞口靠近。

Unity 是个很好的工具,我们就使用它的编辑器功能,把球的位置给记录下来。原来是考虑用json或者xml文件记录的,后来发现LitJson对float是不支持的,但是支持double。如果使用Litjson,需要转换Vector3的时候相对麻烦。在Unity中我们考虑直接序列化,使用的是ScriptableObject。ScriptableObject是可以直接序列化成asset供unity使用,可以拖放到Inspector,可视化修改也比较方便。由此,用MenuItem调用的方式,选择场景中的Map开启记录。

[MenuItem ("Tools/Zuma/LevelConfig2Json", false, 1001)]public static void GameLevelLayout () {string assetPath = @"Assets/Resources/map.asset";if (Selection.activeGameObject == null) throw new UnityException ("must select Map");Transform map = Selection.activeGameObject.transform;MapConfig info = AssetDatabase.LoadAssetAtPath (assetPath, typeof (MapConfig)) as MapConfig;bool isExist = (info != null); if (info == null) {Debug.Log ("AssetDatabase not exist MapConfig");info = ScriptableObject.CreateInstance <MapConfig>() as MapConfig;           }info.MapInfo = new Vector3 [map.childCount];for (int i =0, L = map.childCount; i < L; ++i) {Transform t = map.GetChild (i);info.MapInfo [i] = t.localPosition;}if ( !isExist ) {AssetDatabase.CreateAsset (info, assetPath);return;}// 这里很重要,如果没有告诉unity已经被改变。它只写入内存,没有写入磁盘EditorUtility.SetDirty (info);AssetDatabase.SaveAssets();}

经过操作后,map.asset文件已经保存或更新了路径位置的信息。同样我们可以把其他的一些配置信息放到这里来。这个就是游戏的配置文件了。

游戏流程

分析一下游戏的逻辑:首先左上角的洞口不断涌出珠子,点击(触摸过程调整方向,释放)发射珠子,打在队列中就与队列判断碰撞,插入队列并标记为搜索消除。如果符合规则,相连的类型数量大于等于3,消除珠子,分裂队列,播放音效与效果,此时,如果消除发生后在消除位置的后面一个与前面一个珠子的类型相同,后面的珠子需要带领它的队列段回缩,直到与前面珠子相连。游戏结束这里不作设置,如果珠子队列碰到青蛙的口,用一段时间让它整体回缩。

// Update is called once per framevoid Update() {if (mgameState == GameState.runningTime) {// 消除球  CheckEliminate();// 检测球的碰撞插入CheckFireBallCross();// 有回缩趋势的球的检测CheckFallBackBall ();// 第一个球的推进if (mAttackState == 1) {CheckFirstSegmentAttack();// 检测失败点CheckGameFailurePoint();}// 当达到终点时队列回缩if (mAttackState == -1) {CheckLastSegmentAttack();}            // 判断队列的连接  CheckSnakeConnect();            }// 更新球的TickUpdateAllBallTick ();// 更新球的渲染UpdateBallRender();}

游戏分析

推力

这个游戏中,在路径中的珠子我们首先以段为单位,每段由n颗珠子串连组成。如图:

当mAttackState==1时,队列向右移动。洞口第一颗珠子有推力。看图,当它推向右边就会与右边的珠子相交,右边的珠子必须向右推动,直到第一段全部推动。此时需要注意,这种情况下需要处理推到终点的情况。

 // 第一段推进void CheckFirstSegmentAttack() {//游戏中一段珠子都没有,先初始一段if (mSnakeSegment.Count == 0) {Ball b = CreateActiveBall();mSnakeSegment.Add(b);return;}//如果第一段中第一个珠子已经出了出口,补充新的珠子在洞口Ball ptr = mSnakeSegment[0];if (ptr.IsNotHoleExit()) {Ball b = CreateActiveBall();b.processIndex = ptr.processIndex - 1f;b.SetNext(ptr);ptr.SetPre(b);mSnakeSegment[0] = b;ptr = b;}//在出洞口第一颗珠子推动ptr.processIndex += Time.deltaTime * mAttackSpeed;//所有的右边的珠子都要调整while (ptr.Next != null) {if (ptr.Next.processIndex < ptr.processIndex + 1) {ptr.Next.processIndex = ptr.processIndex + 1;}ptr = ptr.Next;}}

当mAttackState == -1这是最后一段的最后一个珠子往左边推,这种情况下需要处理最左边的珠子会缩回出洞口的情况。

队列的连接

 
 前面一段珠子往右推,就会出现两段相交,此时就应该合并。
void CheckSnakeConnect() {//应该先排序下//mSnakeSegment.Sort (SortCompare);int i = mSnakeSegment.Count;while (i-- > 1) {Ball q = mSnakeSegment[i];Ball p = mSnakeSegment[i - 1];Ball t = p.Tail;//前一段的尾巴碰到了后一段的头if (t.processIndex + 1 >= q.processIndex) {q.processIndex = t.processIndex + 1;UpdateBallAndBallDistance(q);t.SetNext(q);q.SetPre(t);mSnakeSegment.RemoveAt(i);}}}

珠子的插入

当发射的珠子碰撞队列时,是先插入队列。约定都是往右边插入

珠子的消除

以珠子为起点,在队列中左右搜索相同类型的珠子,如果相同类型的珠子数量大于等于3,便消除掉这一块珠子。消除后会产生三种情况:这段珠子为null,依旧剩下一段珠子,分裂成两段珠子。

消除后,如果两边的珠子的类型一样的还需要后面的段回缩拼接

工程分享: http://download.csdn.net/detail/wuzhi3078/9553990

经典消除游戏——Unity 祖玛游戏相关推荐

  1. android+祖玛游戏源码,unity祖玛游戏Zuma Ball Blast源码

    压缩包内容概览: unity祖玛游戏Zuma Ball src ; 汇编C锐器编辑器 ; 汇编-C夏普编辑器 ; 组件-C夏普vs ; C夏普组件 ; 汇编统一脚本vs ; 汇编统一体脚本 ; 资产 ...

  2. java祖玛7723,Unity - 祖玛游戏

    {getUnitName} {getLessonName} 敬请期待 免费 {getTaskName} 剩余观看时长:{watchLimitRemaining} 回放 {activityStartTi ...

  3. Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D C#: Learn To Code Making 3D Games

    Unity 3D游戏代码编程学习教程 Full Guide To Unity 3D & C#: Learn To Code Making 3D Games Full Guide To Unit ...

  4. unity第三人称射击游戏_在游戏上第3部分完美的信息游戏

    unity第三人称射击游戏 Previous article 上一篇文章 The economics literature distinguishes the quality of a game's ...

  5. 《大话设计模式(C#实现)》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+设计模式+GoF+UML+单例模式+观察者模式+抽象工厂+代理模式+框架编程+立钻哥哥++OK+)

    <大话设计模式(C#实现)> 版本 作者 参与者 完成日期 备注 YanlzFramework_GoF_V01_1.0 严立钻 2020.02.10 ##<大话设计模式(C#实现)& ...

  6. 面试官:祖玛游戏玩过么?我来拷拷你~

    题目地址(488. 祖玛游戏) https://leetcode-cn.com/problems/zuma-game/ 题目描述 回忆一下祖玛游戏.现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色 ...

  7. [Unity ECS] 游戏对象转换和子场景 [1]

      游戏只是关于玩家输入改变数据,然后看到不同呈现的事物,因此玩得开心.这些数据是使用 Unity 的 WYSIWYG 工具在scene设计的.但是那些基于 GameObject 的数据与 ECS 不 ...

  8. 细数那些年我们一起玩过的Unity3D游戏(unity开发的游戏有哪些)

    经典重现<新仙剑OL> <新仙剑OL>采用跨平台Unity3D引擎,耗资数千万,历时三年多,由台湾大宇正版授权,"仙剑之父"姚壮宪监制的全球首款Unity3 ...

  9. ​LeetCode刷题实战488:祖玛游戏

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

最新文章

  1. mysql主主复制+keepalived 打造高可用mysql集群
  2. 小型电商服务器平台搭建(一)
  3. python关联分析代码_1行代码实现关联分析(Apriori)算法
  4. 关于字符集报错显示“255”Unknown initial character set index '255' received from server.
  5. 运维与自动化运维发展概括
  6. 区分Activity的四种加载模式(转)
  7. 不同编程语言的取模运算%
  8. 数据库-日期计算-获取年月日
  9. c++远征之模板篇——运算符重载
  10. Linux下性能测量和调试诊断工具Systemtap
  11. php 文章修改怎么写,PHP开发文章发布系统之后台文章修改页面
  12. 机器人(我在哪,我要往哪走)
  13. HDU2553 N皇后问题【DFS+回溯法】
  14. Java基础练习之流程控制(四)
  15. CMDB数据库设计-四种方案任你选
  16. Form 表单提交参数
  17. 地理探测器 GD包下载及应用(R语言,基于Rstudio)
  18. 【剑指offer】19. 二叉树的镜像
  19. linux docker容器MySQL自动备份发送到邮箱
  20. OS + Unix FreeBSD / MacOSX Snow Leopard 10.6.3-8 / MacBook Pro / apple / MC373

热门文章

  1. tampermonkey脚本:自动登录北理工移动宽带
  2. java 椭圆_用Java绘制椭圆
  3. matlab拉普拉斯算子边缘提取_(二十四)用二阶微分(拉普拉斯算子)实现图像锐化...
  4. [附源码]SSM计算机毕业设计医学季节性疾病筛查系统JAVA
  5. 企业网站建设要多少钱_用更少的钱建设优质网站的9个想法
  6. npm包前的@ 是什么意思
  7. PHP最全的正则表达式大全
  8. 用sed、awk和grep处理文本数据:实际需求的有效解决方案
  9. python中xlrd模块的使用
  10. Flutter SocketException: OS Error: No route to host, errno = 113, address = XXX