从零开始用 Unity 做俄罗斯方块小游戏

本贴最后更新于 2299 天前,其中的信息可能已经渤澥桑田

状态

项目未完成,持续更新中[2017.12.11]

说明

这不是教程,这不是教程,这不是教程!重要的事情说三遍!
这只是我自己学习摸索 Unity 的笔记,随时更新,后面推翻前面设计的可能性非常高!
项目完成后,会另外整理一篇教程。

前言

一年多前用 Unity 做了一款魔方小游戏(非常烂,自己都不玩),集成了腾讯的广告平台,发现每个月都能有几块几毛钱进账,到现在已经赚了 58 块。如果受众这么小,制作这么烂的游戏都能赚钱,为什么不认真做一款呢?
像我这样没有什么游戏制作经验,一直奋斗在企业级系统后台的 Java 程序猿,突然要用 C#认真写一个游戏,当然要选一个相对简单的项目,于是一拍屁股,决定做一个俄罗斯方块。

尝试

自己做游戏嘛,如果直接看教程,那就没意思了,素材甚至代码都准备好,自己组装一下就出来了。
作为一个有追求的程序猿,虽然 Unity 用的半生不熟,还是决定自己从零开始,连思路都不看教程。
所以悲剧了。

第一次碰壁

用 Cube 拖了几种基本形状,I 型,Z 型等,做成 Prefab,Start 方法中初始化一个,Update 中设置时间间隔改变方块位置
跑起来
有模有样的
突然想到,如果某一行满了需要消除,那就需要改变预制体的组成,好像有无限多种可能,开局半小时,卒。

第二次碰壁

预制体是走不通的,那就换条路,动态生成方块。
把预制体改为一格小方块,写了一个 CubeGenerator,接收 type,通过小方块的位置关系,生成相应的 Cube,再给一个空 GameObject 对象做整体管理,如果要消除,找到该对象下面的对应方块,删掉再整体下移。然后加刚体,给碰撞器
跑起来
有模有样的
为了让碰撞器能够正常碰到,通常要比物体要大一点,嗯?初始化时碰撞了 4 次?落到方块上又碰撞了 N 次?小方块旋转跳跃我闭着眼,等等!这变成了一个物理游戏了吧?卒。

反思

今天早上,没错,就是我开始写这篇文章之前,还在思考如何才能正确的处理俄罗斯方块的各种情况。
如果物理没办法搞定,那就把它交给数学,通过前两次经验的总结,大体思路如下

  1. 需要把整个画布网格化,用二维数组表示,抽象化,每次移动用一格加方向表示,通过专门的方法换算成坐标,0 表示空,1 表示有方块
  2. 每个 Cube 为一个独立的 4 * 4 二维数组,同样 0 为空,1 为有方块
    3f944e5184984d7ab16c6fe55ef5bcf5-image.png
  3. 在画布上设置两列为 1,表示两边边界,y=0 为自然底边
  4. Cube 整体在画布上移动,每次移动进行碰撞检测,比如向左移动,找到 Cube 中最左边为 1 的格子,转换成画布坐标后,判断它左边是否为 1,是则取消移动,否则可以移动
    目前就想到这么多,下班回家试一下
    虽然碰了两次壁,才勉强摸到一条不知道是否正确的路,可能照着教程早就做完了,但我觉得还是值得的,毕竟这么一轮下来,印象还是挺深刻的,而且下次如果再做一个类似的游戏,我肯定会选择用数学去实现,而不是抓着物理系统硬刚。
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 251 关注
  • 笔记

    好记性不如烂笔头。

    303 引用 • 777 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...