状态
项目未完成,持续更新中[2017.12.11]
说明
这不是教程,这不是教程,这不是教程!重要的事情说三遍!
这只是我自己学习摸索 Unity 的笔记,随时更新,后面推翻前面设计的可能性非常高!
项目完成后,会另外整理一篇教程。
前言
一年多前用 Unity 做了一款魔方小游戏(非常烂,自己都不玩),集成了腾讯的广告平台,发现每个月都能有几块几毛钱进账,到现在已经赚了 58 块。如果受众这么小,制作这么烂的游戏都能赚钱,为什么不认真做一款呢?
像我这样没有什么游戏制作经验,一直奋斗在企业级系统后台的 Java 程序猿,突然要用 C#认真写一个游戏,当然要选一个相对简单的项目,于是一拍屁股,决定做一个俄罗斯方块。
尝试
自己做游戏嘛,如果直接看教程,那就没意思了,素材甚至代码都准备好,自己组装一下就出来了。
作为一个有追求的程序猿,虽然 Unity 用的半生不熟,还是决定自己从零开始,连思路都不看教程。
所以悲剧了。
第一次碰壁
用 Cube 拖了几种基本形状,I 型,Z 型等,做成 Prefab,Start 方法中初始化一个,Update 中设置时间间隔改变方块位置
跑起来
有模有样的
突然想到,如果某一行满了需要消除,那就需要改变预制体的组成,好像有无限多种可能,开局半小时,卒。
第二次碰壁
预制体是走不通的,那就换条路,动态生成方块。
把预制体改为一格小方块,写了一个 CubeGenerator,接收 type,通过小方块的位置关系,生成相应的 Cube,再给一个空 GameObject 对象做整体管理,如果要消除,找到该对象下面的对应方块,删掉再整体下移。然后加刚体,给碰撞器
跑起来
有模有样的
为了让碰撞器能够正常碰到,通常要比物体要大一点,嗯?初始化时碰撞了 4 次?落到方块上又碰撞了 N 次?小方块旋转跳跃我闭着眼,等等!这变成了一个物理游戏了吧?卒。
反思
今天早上,没错,就是我开始写这篇文章之前,还在思考如何才能正确的处理俄罗斯方块的各种情况。
如果物理没办法搞定,那就把它交给数学,通过前两次经验的总结,大体思路如下
- 需要把整个画布网格化,用二维数组表示,抽象化,每次移动用一格加方向表示,通过专门的方法换算成坐标,0 表示空,1 表示有方块
- 每个 Cube 为一个独立的 4 * 4 二维数组,同样 0 为空,1 为有方块
- 在画布上设置两列为 1,表示两边边界,y=0 为自然底边
- Cube 整体在画布上移动,每次移动进行碰撞检测,比如向左移动,找到 Cube 中最左边为 1 的格子,转换成画布坐标后,判断它左边是否为 1,是则取消移动,否则可以移动
目前就想到这么多,下班回家试一下
虽然碰了两次壁,才勉强摸到一条不知道是否正确的路,可能照着教程早就做完了,但我觉得还是值得的,毕竟这么一轮下来,印象还是挺深刻的,而且下次如果再做一个类似的游戏,我肯定会选择用数学去实现,而不是抓着物理系统硬刚。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于