B站视频演讲稿:点击观看
unity3d商业级消消乐,开发心得总结
这期的内容讲的是消消乐项目 开发心得总结
消消乐是一种经典玩法的游戏,有许多用户受众
这是我游戏开发生涯第三次遇到消消乐开发的需求
特此在项目收尾之际,做个总结
想要获取源码的可以进Q群
我们先看一下成品效果
消消乐的核心算法是对棋盘进行计算
棋盘创建伪代码
读取关卡编辑数据
迭代每行每列
根据节点的属性创建网格和物件
最终得到棋盘
因为策划是借鉴了开心消消乐的原型,所以要在基础的消消乐功能中加入
伪代码
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 和任特殊通糖果交互后 把屏幕所有同颜色的糖果 变成高级糖果 后再消除
**横,竖消糖果** 代码表示为 StripedCandy
出现条件 横向和竖向满个数>=4 的合并
功能 自己被消除时 会消除 一横或一列的内容
炸弹糖果 代码表示为 WrappedCandy
出现条件 满足十字型消除
功能 自己被消除时 会消除 周围8格的内容
特殊糖果被消除时会造成一系列的连锁反应
程序在这里使用的是递归处理
就以爆炸糖果举个例子
GameBoard.爆炸(坐标集合)
{
炸弹糖果爆炸的集合= 炸弹糖果爆炸();
if (集合!=null)
GameBoard.爆炸(炸弹糖果爆炸的集合)
}
递归爆炸的具体实现详见
private void ExplodeTileRecursiveByXy
特殊糖果的派生交互
比如万能糖果与各种特殊糖果的交互派生,2个万能炸弹 交互后会全屏炸 屏幕所有的内容都会被炸掉
其余更多高级糖果交互效果不再一一阐述
-收集要素 代码表示为Collectable
该种类的消除方式 到达最底一行才能消除
实现伪代码
CheckCollectables()
{
遍历整个表格最底一的行
if (bottom != null && bottom.GetComponent<Collectable>() != null)
collectablesToDestroy.Add(bottom);
}
冰块方格
被冻结的物体不产生下落效果,冰块可以被炸掉
冻结移动效果 的实现
bool DoFallAll(int type, int col )
{
移动表格中所有的物体
遍历移动表格中的所有物件时,假如物体的类型 特殊种类 则不进行操作
if (tiles[moveTragetIdx] != null && tiles[moveTragetIdx].GetComponent<SpecialBlock>() != null) continue;
}
巧克力
在玩家步数结束后,会把周围8格的糖果 变成 巧克力,具有分裂效果
假如不消除,会不断分裂,游戏也会失败
他的作用是加大游戏难度
实现思路
步数之后->
private void ExpandChocolate()
随机选中一课巧克力,覆盖周围8格的其中一格内容
}
遮罩效果,其目的是为了避免物件创建时,出现在顶部
背景用了sprite Mask组件,前景则用了
visible inside Mak属性
游戏新手指引系统
前期是采用读表,但后来发现灵活度和效率都太低,后来改用prefab方式编辑内容
在prefab的 GuiData中,策划只需要 填入 滑动的开始坐标和结束坐标,以及UI的出现坐标和对应的文字提示即可
游戏开发测试相关
为了能够快速测试场景,在编辑器中启用z_EdtiorObj下的GameManger组件,勾选Last Selectd level 即可测试对应的关卡
而无需从 从游戏主页面进场开始游戏,节省测试时间
因为本来这套系统是使用u3d的商城插件做的二次开发,代码熟悉程度不高,加上项目时间紧迫,导致
到了后期,物体的数量和需求增加时,出现了一些难以重新的bug,具有不确定性,
比如(A组合和B组)再和(C组合) 进行组合,游戏会出现空指针报错
此种BUG具有不确定性.和不可重现的问题
为了解决这种不确定性,把游戏中本来的随机算法改成伪随机算法,这样就能得到一个可重现的方案
把本来的随机对象替换为自定义的RandomExt
这样每次合成和掉落的算法都结果一致的,只要记录下 操作步骤,就能还原bug
从轻易的找出并解决游戏基础源码中一些藏得很深的bug
总结完毕,感谢观看!
如果你觉得本视频能对你有帮助,请转发和一键三连,这也是我更新视频的最大的动力
泰课在线 是目前国内U3D最为专业和广泛的在线教育网站,学习U3D 选泰课在线