用Unity实现"打砖块"游戏
发表于2015-09-11
说明: 这个游戏在Windows Phone/Store apps下通过测试。
首先,unity中我们仅有一个游戏场景。
场景中游戏对象如下:
- 一个摄像机Camera,设置为正交(Orthographic)投影(适用于2D游戏)
- 一个定向光源Directional Light
- 一个GameManager游戏物体,包含GameManager脚本,负责运行游戏
- 在关卡中跑来跑去的球Ball
- 短板Paddle,玩家用它来防止球触地
- 地板Floor,如果与球碰到,将减少玩家生命
- 侧边障碍物BoarderBlocks,用来将球保持在我们的关卡内
- 状态文本Status Text,用来显示文本信息
- 当然,还有方块,它们必须被球击中(在玩家控制下),被组织在四个方块行BlockRow中
游戏目的是让球击中关卡中所有的方块,则代表游戏胜利。如果球碰到地板超过一定的次数(我们称之为“生命”)则游戏失败。无论失败或者胜利都可以重新开始游戏。
现在,我们来分别讨论每个游戏对象的代码。以下所有的代码都是在Visual Studio中编辑。为了方便调试可以点下载Visual Studio tools forUnity。
LeftBlock、RightBlock和UpperBlock都是带2D Box Collider的quad,它们的物理材质是BouncyMaterial(摩擦力为0,弹力为1),这样每次球和它们碰撞的时候都不会有速度(或者更准确地说是能量)损失。这样,当球碰到这三个障碍物的时候,只是简单反弹。
地板Floor是 “失去生命”触发器。它包含FloorScript脚本,当球Ball(或者更准确地说,带有“Ball”标签的游戏物体)碰撞到它的时候,通知GameManager(后面详述)需要减少生命。GameManager被作为参数传递给FloorScript脚本。
短板Paddle是一个Quad,附带有BoxCollider2D组件以及PaddleScript脚本组件。PaddleScript脚本处理来自玩家的输入(触摸屏或键盘),并考虑Left Block和 Right Block的位置(它的位置限制在两个侧边障碍物之间)。另一个选择是给Paddle一个动力学2D刚体(kinematic RigidBody2D)并根据玩家的输入用AddForce为它加力(或者增加它的x轴速度)。
方块Block是一个quad prefab,带有一个BoxCollider2D组件和一个BlockScript脚本。它也带有“Block”标签。
BlockScript脚本有一个InitializeColor方法(用来为方块着色)以及一个CollisionExit2D方法用来增加分数,并在game manager里面从“活着的”方块里面减去1,然后设置这个方块为非活动。我们不使用Destroy方法是因为当玩家重新开始游戏(不论失败或胜利)的时候,我们又会将所有的方块重新激活。
球Ball是一个精灵(Sprite),包含CircleCollider2D组件、Rigidbody2D组件以及BallScript脚本组件,并带有“ball”标签。游戏开始时,我们将球在X轴方向的速度设置为0,Y轴方向的速度设置为一个随机数。我们持续检查球的速度是否在两个轴向上太小。如果这种情况发生,我们给它一个小的“推力”(这其实算是一种投机取巧,我正在研究是否能有办法做的更好)。
最后,我们来看看GameManager脚本。在它的底部,您可以看到,我们有一个叫做GameState的枚举。
它包含游戏中5种状态的名字。这5种状态是:开始Start, 游戏中Playing, 胜利Won, 失去一条生命LostALife 和 失去所有生命LostAllLives。构建游戏的时候,状态管理器是一种常见的实践,因为我们会根据游戏进行中状态作出不同的反应以及可能会有的玩家交互。
我们也保存对方块的引用,还有一些静态空间来保存我们的生命、分数以及“活着的”方块数。
减少生命的方法DecreaseLives(被FloorScript脚本调用)只是使球停止(速度velocity = 0),检查剩余生命数并相应设置游戏状态。此外,它还根据游戏的进行状态更新相应的Status文本内容。
Update方法也将游戏状态考虑进去。当需要玩家输入的时候(比方说Start, Won, LostALife 及 LostAllLives状态),它检查键盘或者触摸输入。您会注意到,在Playing状态中,它什么也不做,因为这种状态下玩家将输入交给短板Paddle,可以看到Paddle是由PaddleScript控制的。
在Start方法里,我们得到游戏中所有Block游戏物体的引用以及对ball脚本的引用,而如果玩家触摸或者点击了屏幕,InputTaken方法返回true。同时,这里我们也得到Status Text游戏物体。
最后Restart方法做了一些基础性的工作。
- 遍历所有的方块,把它们设置为active,并改变它们的颜色
- 重新设置生命数和分数
点此链接查看GitHub项目:https://github.com/dgkanatsios/BrickGame