unity onmousedown判断左右键_【Unity游戏开发】泡泡龙lua实现

前言

项目进行后期,开始开发各种玩法,丰富游戏内容,有2048、地牢探险、泡泡龙、跑火车等等,我实力接了个泡泡龙的开发。就这么简单的3个字,薅走了我一把头发。
对于这种现有的小游戏,肯定是去github找一找有没有现成的。
找了一圈,找到一个最合适的,写得最干净的C#版【bubble-shooter-unity3d】,碰撞是用的unity的Collider和rigidbody。我这个人头铁,明明项目时间赶得要死,还是不肯用现有的物理系统,好在燃烧了一周的头发之后,基本的计算都有完成。接着就是一堆业务逻辑和工作量了。

玩法分析

基本框架,找到的项目都已经写得很美了,然后剩下的就是一些二维计算,和几个算法的实现。先分析一下几个比较耗时间的点:

  1. 地图的生成,数据结构
  2. 地图的移动(上移和下移)
  3. 【算法】找邻居
  4. 【算法】小球消除
  5. 【算法】小球脱落
  6. 【计算】小球发射会撞到的球
  7. 【计算】小球应该落在哪个格子上
  8. 【计算】墙体的碰撞
  9. 瞄准线动态长短。
  10. 【拓展】特殊球的实现:炸弹、闪电球、石头、珠宝

实践

接下来我们就按分析的难点进行逐一击破。

  1. 地图的生成,数据结构
首先,是地图的生成,地图的格子,我使用一个二维矩阵去维护格子数据和模板生成。

8833ad5dc9d9af2e3d735c5817f2e3c8.png

2. 地图的移动(上移和下移)

286267c77769d722a8364c106aecdd22.png
地图的移动,地图的表现是一个偏移坐标的矩阵,地图在超过预期行数的时候需要上下移动,移动的时候要考虑奇数行靠左还是奇数行靠右。我维护了一个变量isBaselineAlignedLeft来记录第一行是否靠左,在移动基数行的时候,修改这个变量。

3. 【算法】找邻居

在二维矩阵找邻居的时候,可以分析坐标在矩阵中所在行是靠左还是靠右,来对矩阵进行行数和列数加减找邻居,刚开始,我一个条件一个条件斟酌,写了差不多200行if else去分析情况,后面,学习了一下正六边形格子研究,用配表一下子搞定了,配表简直是神器!我们只要分别列出奇数行和偶数行的所有邻居格子偏移坐标,就能一下子都找出来了。
local NeighborsMap =
{
    --      左、  右、  左上、  右上、  左下、右下
    [1] = {{0,-1},{0,1},{-1,-1},{-1,0},{1,-1},{1,0}},   -- 奇数
    [2] = {{0,-1},{0,1},{-1, 0},{-1,1},{1, 0},{1,1}},   -- 偶数
}

9142aedbf8f2db3167b38e9743055047.png

4. 【算法】小球消除

小球的消除算法,在找邻居算法完成后,一切都是那么顺理成章,找邻居算法+递归就搞定

5. 【算法】小球脱落

3ecfe8553bd341a2e84c46bd6f551823.png
小球掉落算法也是找邻居算法+递归,不同的是,找邻居是从最顶上一行开始找,最顶上一排称作支点,从支点连接下来的都不会脱落;
首先我们遍历所有球,设置状态为脱落状态,然后遍历最上一排球,逐个做找邻居算法+递归,找到一个邻居就设置为连接状态,记得做好已访问列表的维护,否则会重复走太多次逻辑,甚至死循环,最后遍历一次所有球,仍然为脱落状态的就是我们要找得球。

6. 【计算】小球发射会撞到的球

小球发射会撞到的球的计算,有多种计算方式。我用的是算点到线的距离计算的,遍历所有小球,计算球心到发射线段的距离,找出距离小于球的直径的球,这就是发射方向上,所有可能撞到的球。

3b6d37f806c48253f9a8ab5c9804fb01.png
接着就是找到真正碰撞到的球:我算的是球心到线段的距离+垂足到发射点的距离,虽然我讲不出什么科学道理,但是表现上是对的。

85c63720ef45f78b3ae74270f5a931ff.png

7. 【计算】小球应该落在哪个格子上

算出了小球的碰撞坐标,接着要做的就是找到小球该落在那个格子上,这边我在写地图生成的时候,就提供了CellForPosition和PositionForCell来进行localPosition和格子坐标的转换

8.【计算】墙体的碰撞

在计算6,算出啥都没撞到的情况下,就要开始判断是否撞到了墙体。
①先判断发射点延长线和顶部线段是否相交,相交了就要停下来
②判断是否与左右边界相交,相交的话做反射【递归】

9. 瞄准线动态长短

我用了LineRender去实现动态长度,然后还是用了物理系统的collider去实现碰撞,找到端点。Unity LineRenderer绘制连续反射的射线

【拓展】特殊球的实现:炸弹、闪电球、石头、珠宝

本来面向过程,写了一堆垃圾代码,后面整理了一下,用配表解决了一下,配表大法,天下第一。工厂方法解决一切。

参考:

正六边形格子研究

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值