【U3D入门小白教程——案例篇】之二:全民打飞机

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iceSony/article/details/77801934

个人学习第二章节:雷电游戏

1.通过上一章的了解,初步入门了Unity引擎。现在我们将进一步学习游戏开发,学习制作一款射击类小游戏。首先我们需要去官网下载我们所需要的所有资源并且导入项目。

 

 

 

 

2.在项目中新建_Scenes文件夹用来保存当前场景。这里需要用到的资源从已完成项目导入即可。

 

 

 

3.先导入飞船模型,添加碰撞器Mesh Colider,再将原有的Mesh替换为已给的飞船Mesh。注意这里我们将飞船作为刚体(发生碰撞事件),因为环境是太空,所以取消重力作用。

 

 

4.建议将玩家作为坐标原点,这样便于后期的优化==,所以在处理相机位置时候,我们将摄像头改为投影模式(符合游戏视角),这里视频中修改背景为黑色,便于在没有添加背景时对飞船进行补光。

 

 

 

5.处理完相机的位置和视角,删除默认光线并且在windows中调整light设置,删除默认的Skybox的材料,改变环境颜色为黑色,最终效果如下图。

 

 

 

6.对飞船进行光线填充,这里模拟右侧直射光线,这里用到了右侧光,左侧光,边缘光对飞船外观进行优化。

 

 

 

7.场景的建立就差最后一步,我们通过资源导入背景材料和背景图片。在当前场景下新建一个3d四边形,将图片拖动到Quad上,并且更改材料,此时添加着色器Shader,更改为Unlit/Texture(不受光影响的纹理),这样背景不受光线影响和图片一样。

 

 

8.背景添加完成,我们接下来创建飞船子弹模型。在层次视图添加Empty GameObject,复位后添加一个子Quad,用创建游戏背景的方法将子弹材料添加进Quad,更改Quad着色器为Particles/Additive,让子弹看起来明亮一些。然后在Quad中添加一个触发器和刚体模型,注意这里不需要受重力影响。

 

 

9.将完成的子弹拖动到新创建的Prefabs文件夹中作为预设模型,这时飞船的所有模型都已经添加完成。接下来完成对小行星的创建。在项目导入的Models列表下可以看到三个行星模型,把他们拖动到层次试图,依次创建一个空的父对象,在其中添加刚体模型和触发器,调整Capsule Colider的大小。

 

 

10.把完成的行星添加到Prefabs文件夹中,这时所有模型建立完毕,该让游戏动起来了。在飞船中添加脚本让飞船动起来并且可以射出子弹。

这里采用的方法不是上一章的给物体添加受力,而是直接的改变物体的位置,在飞船左右移动的时候给他添加一个旋转的动作,使得画面更真实。注意这里创建子弹的方法Instantiate,在unity视图界面我们需要将模型里的子弹拖动到bolt下。且每次射击的时间间隔nextTime。

 

 

 

11.接下来完成行星的脚本设置,添加两个脚本RandomRotator和Mover,分别控制行星的下落和旋转,代码都极其简单。分别是

在Start()添加rb.angularVelocity = Random.insideUnitSphere * tumble;

在Start()添加GetComponent<Rigidbody>().velocity = transform.forward * speed;

我们对子弹射击行星的碰撞添加脚本,官方demo中将所有敌方单位都添加这个碰撞脚本,但是个人建议将玩家飞船子弹和敌机飞船各自写一个脚本,这样便于管理,用同一个脚本容易造成不必要的bug

 

 

对于行星碰撞不同的物体触发不同的爆炸特效,比如碰撞到物体触发自身爆炸,碰到玩家飞船,还要触发飞船爆炸特效,在GameController中配置得分等内容。

 

12.这时候飞船已经可以进行射击,游戏中需要源源不断提供行星,添加空对象GameController,这里涉及到startcoroutine的用法,可以参考:http://www.cnblogs.com/fly-100/p/3910515.html

这里简单说明当你每次返回并没有线程创建,所以每一次调用相互不影响,避免了异步线程的问题。

 

 

 

13.这时候我们配置一下GameController参数,让行星可以源源不断产生。

 

 

14.通过建立飞船的方法创建敌机,新建一个空对象添加引擎,模型,射击器。将空对象添加刚体模型与触发器,我们需要对飞船添加飞行脚本利用行星的Mover脚本即可(碰撞脚本也是如此)。我么需要添加子弹射击脚本,利用InvokeRepeating方法每隔一段时间射出子弹。

 

 

 

15.游戏大体完成,最后我们对游戏进行优化。敌机不应该和行星一样垂直下落,应该具有移动射击这样游戏体验更好,所以我们再添加一个AI移动脚本。

 

 

对脚本进行配置,让敌机自己动起来。

 

 

16.此时运行游戏一切ok,除了敌机子弹没有正常射出,why?因为敌机子弹飞行没有添加飞行脚本以及碰撞脚本,所以将之前行星碰撞脚本添加,再添加飞行脚本WeaponController

 

 

 

17.一款优良的游戏需要良好的配乐,我们在爆炸中添加音效插件,将已给资源中的声效添加入音效文件中。背景乐设定为Play On Awake 且 Loop,这样BGM无限循环,在对应脚本中(比如子弹射出,在子弹射出代码处播放子弹音效),等等还差一点,我们要对背景图片进行移动,在飞船行进过程中背景同样要移动,先在背景图片添加一个子图片背景拼接到背景后面。然后我们对BackGround添加脚本移动。

 

 

 

在脚本中设定移动移动速度和重复播放长度。这里设定速度为-2,播放长度为两个bg的长度30。并且添加光效让背景看起来更加真实。

 

 

 

18.最后添加空游戏对象,添加组件Gui Text,用来显示当前得分,在GameController中添加每次击破更新Gui Text。这里在脚本中添加方法判定游戏是否结束,添加分数方法,重新开始游戏方法。

这里解释一下,飞船发生碰撞则为游戏结束,需要重新加载游戏。

 

重新加载游戏代码为Application.LoadLevel(Application.loadedLevel);

 

在其他脚本中获取GameController的方法是

GameObject gameControllerObject = GameObject.FindGameObjectWithTag("GameController");

这样会在全部脚本中搜索GameController类对象,然后就可以实现分数增加。

 

实现效果如下:

 

 

 

我对游戏进行了一些小调整,比如随着时间和分数增加,敌机陨石下落速度增加,产出敌方单位会增加等。

 

附上完整项目地址:https://github.com/sonyi2009/Space-Shooter.git

 

 

 

 

 

 

阅读更多

没有更多推荐了,返回首页