1.基础设置
创建新项目命名为2D UFO,选择为2D项目,导入官方资源并保存场景为Main(这些操作已在前些学习记录中说明)。
接下来创建游戏将要运行的平面。将Sprites文件夹下Background精灵和UFO精灵依次拖入Hierarchy,并reset。将Hierarchy下的UFO改名为Player。
将Background的Sorting Layer选为“background”,Player的Sorting Layer选为“player”。2D游戏不像3D游戏一样有透视来确定渲染顺序,故要在每个对象的Sprites Renderer里设置Sorting Layer来决定前后顺序,Sorting Layer的渲染顺序是从列表上到下,所以显示在界面上的是从下到上的顺序(有点像PS的图层)。Sorting Layer里可以点击Add Sorting Layer,在弹出的Inspctor里上下拖拉各个层名来改变顺序。
将Player的Scale设置为(0.75,0.75),2D项目Scale-z不起作用。
可以看到Background大大超出了游戏预览界面,这里我们不是更改Background的Scale,而是设置摄像机,将摄像机size设为16.5。2D项目的摄像机默认为正交模式,也可以选择透视模式,但正交模式在设置游戏时逻辑更合理,故确认摄像机为正交模式。
摄像机视野内未被游戏对象渲染处(即边缘空的地方)可通过设置Main Camera的背景色来改色,将颜色改为(32,32,32)。
2.控制飞碟移动
为Player添加2d刚体,并在Scripts文件夹下新建脚本命名为PlayerController,将新建脚本拖入Player并编辑。
保存后回到unity将speed设置为10。
3.设置碰撞器
给Player添加Circle Collider2D,将半径(Radius)设为2.15。并把Rigidbody2D的Gravity Scale设为0(不需要重力)。
为了不让player飞出平台,我们给background添加碰撞器。我们首先可以想到的办法是给平面添加一个盒子碰撞器把UFO包起来。实验一下发现UFO飞到平面边缘时直接粘到平面的外缘不能移动了。这是unity处理碰撞器的逻辑,一个物体可以有多个碰撞器,unity会把碰撞器重叠部分处理成一体。也可有重叠的碰撞器(Survival Shooter内的player),但重叠的碰撞器间只能有一个不勾选Is Trigger的。如果有多个,像盒子里包UFO的圆圈,unity会把他们合并成一个没有勾选Is Trigger的碰撞器。所以UFO粘到了平面的外缘和平面成了一体。
故我们需要在平面边缘建四个碰撞器粘成一个框状把平面包起来,下面是操作(小技巧:添加一个后点组件的小齿轮选Copy Component后选Paste As New Component可快速 添加)
4.摄像机跟随
使摄像机跟随UFO首先想到是否可把camera拖入player成为子对象,但当UFO旋转时镜头也会旋转。所以新建脚本CameraController脚本并拖入Main Camera,编辑。
保存后回到unity,将player拖入脚本组件。
5.设置宝石
将Sprites文件夹内PickUp精灵拖入Hierarchy,将PickUp的Sorting Layer设置为PickUps以在平面上显示。添加Circle Collider,将Radius设为0.92。为了让宝石有旋转特效,新建脚本命名Rotator为并拖入Pickups,编辑。
Assets下新建文件夹Prefabs并把设置好的PickUp拖入使成为预制件。Hierarchy下新建对象命名为Pickups并拖入PickUp使成为子对象,然后复制(ctrl+D)PickUp11次并摆成菱形。
接下来设置宝石可以被UFO消除,打开PlayerController脚本编辑。
将预制件PickUps的tag设为PickUp,可以看到所有的tag都变成了PickUp。然后把预制件PickUps的Is Trigger勾选(可以被触发)。
和3D模式不同的是,系统默认的静态物体(即没有添加刚体)如果给予脚本使其移动虽然可行,但系统在每一帧都会重新计算该静态物体,这会损失大量性能,所以为PickUp预制件添加Rigidbody2D,并选择模式为Kinematic。
6.计分板和UI
新建Text命名为CountText,内容改为"Count Text",颜色设为黄色,Anchor Presets为锚点和位置都为左上角(shift+alt),位置Pos设为(10,-10,0),Canvas下新建Text命名为Win Text,将内容改为Win Text,,Pos Y设为75,设为居中,字体大小为24,颜色为黄色。打开PlayerController脚本编辑。
把countText和WinText拖入到脚本组件。保存场景。完成!