实战:用Unity快速开发太空飞机大战(上)
用unity动手先来试试一个简单的太空飞机大战吧。看官请继续往下。。。
最终效果,可控制己方战机,朝目标敌机发射子弹,打飞机~~~!伴随想象,慢慢呈现这个太空飞机大战游戏。
1、 新建打飞机unity工程,建好资源分类目录,导入飞机FBX模型文件以及贴图,射击和爆炸等声音文件等等。
如图:
2、 新建场景game.unity,下面大部分工作都在这个场景里完成!
3、 我们想要游戏场景背景里显示一个火星球和星空的效果,这样更真实。新建一个平面体Plane作为火星背景模型;然后创建一个材质球命名为Background,指定好之前导入的火星贴图文件。操作如下:
4、 好,上面都是一个个来选择,来个拖动方式来进行一次关联操作。Unity几乎所有的关联操作都可以通过拖动方式完成!现在准备设置平面体即我们的火星背景模型材质,选中刚建好的Background材质球拖放到火星模型上。如图:
5、 创建另一个平面体,放到火星后面,准备做一个星空的效果。同样创建星空材质球设置好贴图操作同上。然后将星空材质球拖到新的平面体。Ok,我们可以看到星空中的火星了。。。
6、 想让星空在运行游戏时缓动起来,产生动画效果,让你感觉星动~
这里先不详述UV动画以及动画制作过程。准备了个.anim动画文件,选中星空模型添加animation组件设置下动画文件为.anim文件,使星空有缓动效果。
7、 上面步骤,已经将游戏需要模拟太空背景的效果处理差不多了,接下来需要调整试图角度,我们需要从上向下展望火星和星空。我调整了下摄像机视角和视野大小。选中Main Camera,选择GameObject里Align With View使摄像机视角与当前试图一致。现在就可以看到太空的火星和星空了,如图效果:
8、 接下来,准备创建己方战机了,这就是我们要控制的主角了。把准备好的主角战机Fbx拖入场景里,调整下战机朝向:
9、 让战机动起来。这里我们主要用到的是Input包装了输入功能的类,包括了很多键盘、鼠标或触控操作函数;Transform组件主要功能是和移动、旋转、缩放游戏体有关的。
选中我的战机模型,添加一个脚本给它,我们将在脚本里还需要做:
1.控制战机上、下、左、右来移动,控制移动速度;
2.控制战机发射子弹,以及子弹发射间隔;
3.控制战机生命值,设置战机爆炸声音和爆炸效果等等。
添加脚本,选中战机,将对应脚本拖到战机上即可,如下:
10、 创建子弹
子弹是游戏中需要重复使用的游戏体,需要创建prefab。
将子弹Fbx拖入场景里,新建一个子弹的prefab,选中Hierarchy子弹游戏体拖入prefab上,如图示:
子弹主要是控制飞行、造成伤害值、自身生存时间。我们给子弹添加脚本
然后可删除场景里的子弹。
11、 让我的战机能发射子弹,设置Player脚本参数,rocket就是我们创建的子弹prefab,设置0.1s发射间隔,另外还给了一个战机发射子弹的声音,如下:
上面说道了声音,凡是要发声的物体,需要添加audio source这个组件!
12、 子弹主要是飞行然后消失。消失分两种情况,一是碰撞了敌机,二是生存时间到了自动消失。这里提到碰撞和OnTriggerEnter事件,后面再说。脚本:
战机的话主要是移动,输入控制发射子弹,并伴随射击声音,脚本如下:
这里Instantiate是unity中函数实例化,不是我们常用的new!!!
13、 现在仅有了主角战机、子弹,暂无其他交互了。运行中,我们可以看到实例化出来的子弹,以及其被delete的过程,截了一张运行时的图,详细如下:
14、 好了,准备创建敌战机了。敌机也需要重复使用,先创建敌机的prefab,给敌机增加控制脚本,如图:
首先这种敌机我们不给其具有攻击性,不让其发射子弹,它就能移动,我方战机可以发射子弹打掉它。先整个简单点的敌机、简单点交互哈!
15、 上面有提到碰撞和OnTriggerEnter事件,现在处理打掉敌机就需要运用了。
给敌机增加Box Collider组件,它是立方体碰撞组件,选中trigger使其有触发作用,简单说这个就能使OnTriggerEnter有响应了。
给敌机增加刚体组件。所有参与物理计算的游戏体都需要有一个刚体才能正常工作!不选use Gravity使其不受重力影响,选中Is Kinematic使其运动不受物理模拟影响。(以上改动都会自动更新与prefab一致)
同样,按上面所示给子弹、主角战机也添加Box Collider组件、刚体。
16、 设置好敌机、子弹、主角战机的tag标志, 以下就是我们需要在各脚本OnTriggerEnter需要处理的逻辑!
- 敌机碰到子弹会损失生命直到为零就自动销毁;敌机撞到主角战机直接挂掉销毁;
2.子弹碰到敌机就自动销毁;
3.主角战机碰到非自己射出的子弹就减少一条命,直到为零自动销毁游戏结束!
17、 为了防止敌机未被消灭会一直存活下去,我们可以在屏幕下方放置一个空的碰撞体,敌机碰到它就自动销毁咯。
18、 通过上面所有步骤,我们就能控制战机移动、发射子弹攻击或直接撞击敌机。一个太空飞机大战游戏初期形式到此已基本完成!
后面,我们可以在这基础上动手去增加扩展:
超级敌机,继承自普通敌机,它将具备攻击能力,生命也更强,可以自动朝主角战机发射子弹,被其子弹命中可以减少主角生命值;
敌人生成器;
用GUI来展示游戏信息,比如战机生命值、当前得分,游戏失败状态等等;
可以加个start.scene新场景,加开始游戏按钮,点击后才进入game.scene;
可以改下战机移动,除方向键外,增加鼠标移动的控制,方便发布到手机上。
遇到的坑:我确认都已经将子弹、敌机、主角战机都加好了刚体等,也激活了碰撞等等,运行时候总是不能触发OnTriggerEnter,无奈打不了飞机。后来发现是子弹、敌机、主角战机三游戏体的position里y不一样导致的!虽是一个简单的错误,可能很多时候都没注意导致小有纠结!所以这里注意下咯~
就先分享以上内容。。。。。。。。。
结束语:
简单的一个游戏,这里涉及到unity制作游戏的很多基础内容,包括unity编辑器基本使用、资源管理、编写控制脚本、添加各种组件、声音、使用物理功能等等,还有碰撞、prefab等等。除了上面说的扩展,我们还可以为这个游戏添加更多细节要素,更好的流程体验!
待续。。。