本文仅供个人记录和复习,不用于其他用途
前言
我写学习笔记更多是为了日后温习,所以某些知识可能就一笔带过了。这里推荐 SiKi 的教学视频:http://www.taikr.com/user/7
源码和素材都可以在这个网站上下载,我这里就不上传 GItHub 了。
总结
上一章主要讲了 2D 游戏的基本开发流程,因为我之前学过一段时间的 Cocos2dx,所以对这方面还是有了解的。对于 2D 游戏而言,由于游戏是从下往上渲染,那么就必须要将各项元素的渲染顺序理清楚。Untiy 提供了几种分层方式,Sorting Layer 用于分类,Order Layer 则用于同一层的排列。
2D 乒乓球同样也用到了碰撞检测,比如 OnCollisionEnter2D(),发生碰撞时就会自动调用这个方法,不过因为游戏本身比较简单,所以不需要用到另外两种形式。Unity 内置了几种 2D 碰撞器,譬如 Box、Circle,我们在开发时可以根据图片的形状进行自由选择。值得注意的是,3D 建模固然能够做到精确地界定碰撞范围,但 2D 游戏可做不到这一点。事实上,2D 游戏仅仅是由图片构成的,我们不可能对每个图片描边然后确定其碰撞范围,那样是不现实的。对于人形这一类不规则的图片,一般的做法是使用 Box Collider 覆盖人形的主干,而手脚部分则不做碰撞判定。
关于预制体,在 Roll A Ball 之中我们用预制体创建了多个相同的方块,且对某一预制体的修改将作用到其他的预制体上,非常适用于批量创建。而在 2D 乒乓球中,虽说只存在两个球拍,但它们的组件都是相同的,只是部分的参数存在差异。要注意的是,虽然预制体会同步修改,但对于位置和脚本公共变量等属性是不会同步的(毕竟得有一些差异)。
此外,这次的代码写得有些乱,对物体的命名存在一些问题。最开始我只是把 Walls 当成围墙对象的集合,然后而写代码时却不知不觉把 Walls 当成了游戏消息的管理对象。事后想想,似乎把它取名为 Manager 要更合适一些。
问题基本就这么多,弹性材质、音效等新组件还是比较好理解的,我就不多说了。
游戏发布
游戏的发布就不细讲了,Player Settings 里面有很多选项,像是修改游戏图标、游戏开场动画等等,这些日后再说。话说在发布完之后,我又找到了两个 BUG……
第一个就是 Reset 按钮,记得要将它的锚点设置为正上方,否则窗口尺寸一变按钮就不见了。第二个也是和 Reset 有关的,在 Ball 脚本的 Reset() 中,除了要将小球的位置归零,还要将它的速度归零:
|
|
如果速度不归零,那么当你快速连点重置按钮后,小球的速度会不断地累加,导致其越来越快。原因如下:
|
|
我们对小球在初始时赋予了一个力,所以不停地按重置按钮就会导致速度加快。另外,如果把这条语句换成对速度的赋值,想必就不会出现 BUG 了。
还有就是当小球被球拍与墙夹在中间时,分数会飞快地飙升(不停地弹来弹去)。要解决这个问题其实很简单,就是当小球撞到墙壁得分时,把它的位置重新设为原点就好了。
最后说一句,教程也不是全对的,最好结合实际进行修改,不要一味地照搬。