u3d商业级开心消消乐源码开发总结

B站视频演讲稿:点击观看

unity3d商业级消消乐,开发心得总结

这期的内容讲的是消消乐项目 开发心得总结
消消乐是一种经典玩法的游戏,有许多用户受众
这是我游戏开发生涯第三次遇到消消乐开发的需求

特此在项目收尾之际,做个总结

想要获取源码的可以进Q群

我们先看一下成品效果

消消乐的核心算法是对棋盘进行计算

首先通过编辑器创建一个棋盘
u3d商业级开心消消乐源码开发总结_第1张图片

棋盘创建伪代码
读取关卡编辑数据
迭代每行每列
根据节点的属性创建网格和物件

最终得到棋盘

因为策划是借鉴了开心消消乐的原型,所以要在基础的消消乐功能中加入

斜边掉落

u3d商业级开心消消乐源码开发总结_第2张图片

伪代码

 void 掉落过程()
        {
            垂直掉落直到铺满();

            var 掉落顺序 = 0;
            while (有空白格子())
            {
                if (掉落顺序 %2==0)
                    递归掉落("下左右");
                else
                    递归掉落("下右左");

				掉落顺序+=1;
            }
        }

实现细节详见
void ApplyGravityInternal_XieBianForce()

策划需要增加一个种类型:红包
只能被点击消除,消除后得到金币

消除条件检测

private bool HandleMatches(bool isPlayerMatch, bool autoFall = true)
    {
     
      
        var matches = new List<Match>();
        返回满足 形状和颜色一致 十字型排列的物体
        var tShapedMatches = tShapedMatchDetector.DetectMatches(this);
        返回满足 形状和颜色一致 L型排列的物体
        var lShapedMatches = lShapedMatchDetector.DetectMatches(this);


        返回满足 形状和颜色一致 一横排列的物体
        var horizontalMatches = horizontalMatchDetector.DetectMatches(this);
        返回满足 形状和颜色一致 一列型排列的物体
        var verticalMatches = verticalMatchDetector.DetectMatches(this);

	    先消除满足条件的物件...............
	
	    再根据消除消除规则合并成特殊物体
	
		横向和竖向满个数>=5 的合并 万能糖果			    代码表示为 ColorBomb        
	    横向和竖向满个数>=4 的合并 横消,竖消糖果       代码表示为 StripedCandy
		十字型>合并 炸弹糖果                            代码表示为 WrappedCandy
	
}

形状匹配的算法

横向匹配算法展开,其余算法不再一一举例

遍历整个表的node 返回满足颜色和类型一致 一行的物体
实现思路
以node为对象

node不在边角
retrun   全部颜色一致?(node(列,行)),(node(列+1,行)),node(列-1,行))

node在左边角
retrun   全部颜色一致?(node(列,行)),(node(列+1,行)),node(列+2,行))

node在左右角
retrun   全部颜色一致?(node(列,行)),(node(列-1,行)),node(列-2,行))

具体实现详见

public class HorizontalMatchDetector : MatchDetector

对于消除个数小于4个的情况,消除糖果后得到分数即可

但超过4个以上就要进行 特殊糖果合成

	万能糖果    代码表示为 ColorBomb        
	       出现条件是 横向或竖向消除个数大>=5     			  

            功能 1    和任何普通糖果交互后都      会消除 相同颜色的糖果
            功能 2     和任特殊通糖果交互后  把屏幕所有同颜色的糖果  变成高级糖果 后再消除 

u3d商业级开心消消乐源码开发总结_第3张图片

    **横,竖消糖果**        代码表示为 StripedCandy
            出现条件  横向和竖向满个数>=4 的合并      
             功能  自己被消除时 会消除 一横或一列的内容

u3d商业级开心消消乐源码开发总结_第4张图片

	炸弹糖果         代码表示为 WrappedCandy
		  出现条件  满足十字型消除       
          功能     自己被消除时 会消除 周围8格的内容

u3d商业级开心消消乐源码开发总结_第5张图片

特殊糖果被消除时会造成一系列的连锁反应

程序在这里使用的是递归处理

就以爆炸糖果举个例子

GameBoard.爆炸(坐标集合)
{
	炸弹糖果爆炸的集合= 炸弹糖果爆炸();
	if (集合!=null)
			GameBoard.爆炸(炸弹糖果爆炸的集合)
}

递归爆炸的具体实现详见

private void ExplodeTileRecursiveByXy

特殊糖果的派生交互

比如万能糖果与各种特殊糖果的交互派生,2个万能炸弹 交互后会全屏炸 屏幕所有的内容都会被炸掉
其余更多高级糖果交互效果不再一一阐述

u3d商业级开心消消乐源码开发总结_第6张图片

场景交互物体

-收集要素 代码表示为Collectable
在这里插入图片描述
该种类的消除方式 到达最底一行才能消除
实现伪代码

CheckCollectables()
{
		   遍历整个表格最底一的行
 			if (bottom != null && bottom.GetComponent<Collectable>() != null)
                    collectablesToDestroy.Add(bottom);
}

冰块方格

被冻结的物体不产生下落效果,冰块可以被炸掉
u3d商业级开心消消乐源码开发总结_第7张图片
冻结移动效果 的实现

 bool DoFallAll(int type, int col )
{
	    
		移动表格中所有的物体
		遍历移动表格中的所有物件时,假如物体的类型 特殊种类 则不进行操作
		 if (tiles[moveTragetIdx] != null && tiles[moveTragetIdx].GetComponent<SpecialBlock>() != null)  continue;
                            
 }

巧克力
在玩家步数结束后,会把周围8格的糖果 变成 巧克力,具有分裂效果
假如不消除,会不断分裂,游戏也会失败
他的作用是加大游戏难度
u3d商业级开心消消乐源码开发总结_第8张图片

实现思路
步数之后->

private void ExpandChocolate()
	随机选中一课巧克力,覆盖周围8格的其中一格内容
}

遮罩效果,其目的是为了避免物件创建时,出现在顶部
背景用了sprite Mask组件,前景则用了
visible inside Mak属性
u3d商业级开心消消乐源码开发总结_第9张图片

前景属性
u3d商业级开心消消乐源码开发总结_第10张图片

游戏新手指引系统
u3d商业级开心消消乐源码开发总结_第11张图片
前期是采用读表,但后来发现灵活度和效率都太低,后来改用prefab方式编辑内容
u3d商业级开心消消乐源码开发总结_第12张图片
在prefab的 GuiData中,策划只需要 填入 滑动的开始坐标和结束坐标,以及UI的出现坐标和对应的文字提示即可

实现的思想就是每完成一个动作播放下一条数据,直到完成
u3d商业级开心消消乐源码开发总结_第13张图片

游戏开发测试相关

为了能够快速测试场景,在编辑器中启用z_EdtiorObj下的GameManger组件,勾选Last Selectd level 即可测试对应的关卡
而无需从 从游戏主页面进场开始游戏,节省测试时间

u3d商业级开心消消乐源码开发总结_第14张图片

中途出现 了难以重现的bug以及解决思路

因为本来这套系统是使用u3d的商城插件做的二次开发,代码熟悉程度不高,加上项目时间紧迫,导致
到了后期,物体的数量和需求增加时,出现了一些难以重新的bug,具有不确定性,
比如(A组合和B组)再和(C组合) 进行组合,游戏会出现空指针报错

此种BUG具有不确定性.和不可重现的问题

为了解决这种不确定性,把游戏中本来的随机算法改成伪随机算法,这样就能得到一个可重现的方案

把本来的随机对象替换为自定义的RandomExt

伪随机算法

这样每次合成和掉落的算法都结果一致的,只要记录下 操作步骤,就能还原bug
从轻易的找出并解决游戏基础源码中一些藏得很深的bug

步数记录器记得下了每一盘的操作顺序
u3d商业级开心消消乐源码开发总结_第15张图片
最终项目得以顺利完成

总结完毕,感谢观看!
如果你觉得本视频能对你有帮助,请转发和一键三连,这也是我更新视频的最大的动力
u3d商业级开心消消乐源码开发总结_第16张图片
泰课在线 是目前国内U3D最为专业和广泛的在线教育网站,学习U3D 选泰课在线

你可能感兴趣的:(unity3d,游戏开发)