用Unity实现"打砖块"游戏
说明:这个游戏已在Windows Phone/Store apps环境下通过测试。
游戏场景与对象概述
首先,该游戏仅有一个游戏场景,场景中的游戏对象如下:
- 摄像机(Camera):设置为正交(Orthographic)投影,这种投影方式适用于2D游戏。
- 定向光源(Directional Light):为场景提供光照。
- GameManager游戏物体:包含GameManager脚本,负责游戏的整体运行。
- 球(Ball):在关卡中运动,是游戏的核心交互元素。
- 短板(Paddle):玩家可操控此物体,用于防止球触地。
- 地板(Floor):若球与之碰撞,玩家生命将减少。
- 侧边障碍物(BoarderBlocks):用于将球限制在关卡范围内。
- 状态文本(Status Text):用于显示游戏的相关文本信息。
- 方块(Block):需被球击中,这些方块被组织在四个方块行(BlockRow)中。
游戏目的是让球击中关卡中所有的方块,达成此条件则游戏胜利;若球碰到地板超过一定次数(此次数即“生命”),则游戏失败。无论游戏结果如何,都可重新开始游戏。
各游戏对象代码分析
以下所有代码均在Visual Studio中编辑。为方便调试,可点击下载 Visual Studio tools for Unity。
侧边障碍物(LeftBlock、RightBlock和UpperBlock)
LeftBlock、RightBlock和UpperBlock均为带有2D Box Collider的quad,其物理材质为BouncyMaterial,该材质的摩擦力为0,弹力为1。这样,当球与它们碰撞时,不会有速度(更准确地说是能量)损失,球只会简单反弹。
地板(Floor)
地板是“失去生命”触发器,包含FloorScript脚本。当带有“Ball”标签的游戏物体(即球)与地板碰撞时,FloorScript脚本会通知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方法:当球与方块碰撞后,该方法会增加玩家分数,并在GameManager中从“活着的”方块数量中减去1,然后将此方块设置为非活动状态。不使用Destroy方法的原因是,当玩家重新开始游戏(无论失败或胜利)时,需要将所有方块重新激活。
球(Ball)
球是一个精灵(Sprite),包含CircleCollider2D组件、Rigidbody2D组件以及BallScript脚本组件,并带有“ball”标签。游戏开始时,将球在X轴方向的速度设置为0,Y轴方向的速度设置为一个随机数。同时,会持续检查球在两个轴向上的速度是否过小,若出现这种情况,会给球一个小的“推力”(此方法目前属于投机取巧,正在研究更优解决方案)。
GameManager脚本
在GameManager脚本底部,定义了一个名为GameState的枚举,包含游戏中的5种状态:
- 开始(Start)
- 游戏中(Playing)
- 胜利(Won)
- 失去一条生命(LostALife)
- 失去所有生命(LostAllLives)
在游戏开发中,使用状态管理器是一种常见实践,因为游戏会根据不同的状态做出不同反应,并处理可能的玩家交互。
GameManager脚本还保存了对方块的引用,以及一些静态变量用于保存玩家的生命、分数和“活着的”方块数量。具体方法如下:
- DecreaseLives方法:该方法由FloorScript脚本调用,会使球停止运动(速度velocity = 0),检查剩余生命数并相应设置游戏状态,同时根据游戏状态更新Status文本内容。
- Update方法:会考虑游戏状态。当处于需要玩家输入的状态(如Start、Won、LostALife及LostAllLives状态)时,会检查键盘或触摸输入;在Playing状态下,该方法不做任何操作,因为此时玩家的输入由PaddleScript脚本控制短板来处理。
- Start方法:获取游戏中所有Block游戏物体的引用以及对ball脚本的引用。若玩家触摸或点击屏幕,InputTaken方法返回true。同时,获取Status Text游戏物体。
- Restart方法:执行一些基础工作,包括遍历所有方块,将它们设置为活动状态并改变颜色,重新设置生命数和分数。
资源链接
若您是Unity新手,可参考微软社区在线课程:Microsoft Virtual Academy course。
原文链接:[http://www.gamasutra.com/view/ne ... e_code_included.php](http://www.gamasutra.com/view/ne ... e_code_included.php) 原文作者:Dimitris - Ilias Gkanatsios