经典消除游戏——Unity 祖玛游戏
布局
祖玛游戏就不介绍了,此类游戏是关卡游戏。所以必须的先布关卡:
如图所示,必须先填充路径的点,游戏中的珠子就根据这个路径不断的向洞口靠近。
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);}}}
珠子的插入
珠子的消除
消除后,如果两边的珠子的类型一样的还需要后面的段回缩拼接
工程分享: http://download.csdn.net/detail/wuzhi3078/9553990
经典消除游戏——Unity 祖玛游戏相关推荐
- android+祖玛游戏源码,unity祖玛游戏Zuma Ball Blast源码
压缩包内容概览: unity祖玛游戏Zuma Ball src ; 汇编C锐器编辑器 ; 汇编-C夏普编辑器 ; 组件-C夏普vs ; C夏普组件 ; 汇编统一脚本vs ; 汇编统一体脚本 ; 资产 ...
- java祖玛7723,Unity - 祖玛游戏
{getUnitName} {getLessonName} 敬请期待 免费 {getTaskName} 剩余观看时长:{watchLimitRemaining} 回放 {activityStartTi ...
- 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 ...
- unity第三人称射击游戏_在游戏上第3部分完美的信息游戏
unity第三人称射击游戏 Previous article 上一篇文章 The economics literature distinguishes the quality of a game's ...
- 《大话设计模式(C#实现)》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+设计模式+GoF+UML+单例模式+观察者模式+抽象工厂+代理模式+框架编程+立钻哥哥++OK+)
<大话设计模式(C#实现)> 版本 作者 参与者 完成日期 备注 YanlzFramework_GoF_V01_1.0 严立钻 2020.02.10 ##<大话设计模式(C#实现)& ...
- 面试官:祖玛游戏玩过么?我来拷拷你~
题目地址(488. 祖玛游戏) https://leetcode-cn.com/problems/zuma-game/ 题目描述 回忆一下祖玛游戏.现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色 ...
- [Unity ECS] 游戏对象转换和子场景 [1]
游戏只是关于玩家输入改变数据,然后看到不同呈现的事物,因此玩得开心.这些数据是使用 Unity 的 WYSIWYG 工具在scene设计的.但是那些基于 GameObject 的数据与 ECS 不 ...
- 细数那些年我们一起玩过的Unity3D游戏(unity开发的游戏有哪些)
经典重现<新仙剑OL> <新仙剑OL>采用跨平台Unity3D引擎,耗资数千万,历时三年多,由台湾大宇正版授权,"仙剑之父"姚壮宪监制的全球首款Unity3 ...
- LeetCode刷题实战488:祖玛游戏
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...
最新文章
- mysql主主复制+keepalived 打造高可用mysql集群
- 小型电商服务器平台搭建(一)
- python关联分析代码_1行代码实现关联分析(Apriori)算法
- 关于字符集报错显示“255”Unknown initial character set index '255' received from server.
- 运维与自动化运维发展概括
- 区分Activity的四种加载模式(转)
- 不同编程语言的取模运算%
- 数据库-日期计算-获取年月日
- c++远征之模板篇——运算符重载
- Linux下性能测量和调试诊断工具Systemtap
- php 文章修改怎么写,PHP开发文章发布系统之后台文章修改页面
- 机器人(我在哪,我要往哪走)
- HDU2553 N皇后问题【DFS+回溯法】
- Java基础练习之流程控制(四)
- CMDB数据库设计-四种方案任你选
- Form 表单提交参数
- 地理探测器 GD包下载及应用(R语言,基于Rstudio)
- 【剑指offer】19. 二叉树的镜像
- linux docker容器MySQL自动备份发送到邮箱
- OS + Unix FreeBSD / MacOSX Snow Leopard 10.6.3-8 / MacBook Pro / apple / MC373
热门文章
- tampermonkey脚本:自动登录北理工移动宽带
- java 椭圆_用Java绘制椭圆
- matlab拉普拉斯算子边缘提取_(二十四)用二阶微分(拉普拉斯算子)实现图像锐化...
- [附源码]SSM计算机毕业设计医学季节性疾病筛查系统JAVA
- 企业网站建设要多少钱_用更少的钱建设优质网站的9个想法
- npm包前的@ 是什么意思
- PHP最全的正则表达式大全
- 用sed、awk和grep处理文本数据:实际需求的有效解决方案
- python中xlrd模块的使用
- Flutter SocketException: OS Error: No route to host, errno = 113, address = XXX