Unity 3D 官方教程——Space Shooter学习记录

写到凌晨2点,结果今天一打开博客,整个Space Shooter文章全不见了,没有记录,没有回收站。

注意,我每写一小节都会立即保存文章。真不知道这CSDN博客是什么奇萌的风格。

还好昨晚写完后有备份,不然今天抑郁一天。

以下是正文。

----------------------------------------------------

unity 官方教程Space Shooter 学习笔记

1.新建项目

起名为Space Shooter。如何新建项目已在Roll A Ball中说明。

2.导入资源

打开unity官方资源商店网址(请自行搜索),在官方商店中搜索"Space Shooter",点击资源后点击“在unity中打开”,之后在unity中点击Import,资源就导入完成了。

导入后资源内容如下。

 

 

3.保存场景

先保存场景以免丢失,打开File下的Save Scene,在Assets文件夹下新建文件夹起名为“_Scenes”,将场景保存在_Scenes中并将场景命名为Main。项目的所有文件都必须保存在Assets文件夹中,文件夹前加下划线是为了使文件夹在Project视图中排在前面。

 

 

4.设置我们将要操控的飞机

⑴将Models中的第5个模型拖入Hierarchy中,F2重命名为Player,并Reset新对象。

⑵为了让飞机有物理属性我们添加Rigidbody(点击Add Component 中的Physics),因为飞机在太空中不需要重力,故勾掉Use Gravity选项。

⑶将场景方向改为向上为了更好观察(场景方向管理上右键选择front),在这里飞机是不规则形状的,网格碰撞器是设置物理范围的最优选项。添加Mesh Collider(点击 Add Component 中的Physics),并将Models中的player_ship_collider拖入到Mesh Collider。要使碰撞可检测,勾选Mesh Collider中的Covex 和Is Trigger选项。

⑷最后添加飞机尾后的引擎特效,在Prefabs→VFX→Engines,将engines_player拖入Hierarchy中的Player。

 

 

 

5.摄像机和灯光

⑴设置主摄像机,选定Main Camera并reset,将Position设置为(0, 10, 5),Rotation为(90, 0, 0)。将模式改为正交模式(Inspector→Camera→Project,选择 Orthographic),正交模式没有透视效果(远小近大)。

⑵我们不需要背景,故选择纯色(Inspector→Camera→Clear Flags,选择Solid Color),背景色取为黑色。

⑶为了不影响接下来的设置,删除系统自带的Hierarchy下的Direction Light。去掉系统默认的Sky Box(Window→Lighting,Scene 下的Sky Box右边的小圆圈选择None)。

 

 

⑷Hierarchy下新建Directional Light命名为Main Light,并reset。设置Main Light 的Rotation为(20, -115, 0),intensity为1.5。不设置Position是因为光照只与角度有关,与位置无关。选定Main Light,复制(Ctrl+D)命名为Fill Light并reset,设置Fill Light的Rotation为(5, 125, 0),intensity为0.75,颜色设置为(R=128, G=192, B=192), 这是左边照射的光。复制Fill Light命名为Rim Light并reset,设置颜色为白色,Rotation为(-15, 65, 0),intensity为0.4,这是底光。最后再在Hierarchy中新建对象并命名为Lights,reset后将三个光对象拖入Light以便管理。

 

 

6.添加背景

⑴Hierarchy中新建平面(create→3D Object→Quad)命名为Background并reset。设置Rotation为(90, 0, 0),并将Player隐藏以免阻挡视线。

⑵找到背景图片文件(Project→Textures→tile_nebula_green_dff),拖入到Scene视图的平面上。因为原图是(1024*2048)大小,故设置Background的Scale为(20, 40, 0),Y为X的两倍。上面我们为飞机设置了很多光照,但背景不需要,所以选择阴影模式为Unlit/Texture。

⑶取消隐藏Player,我们发现飞机嵌在平面里了,故设置平面Positon为(0,-10, 0)让飞机位于平面上方。

 

 

 

7.让飞机移动起来

⑴为了让飞机移动起来,我们给Player添加新的脚本,命名为PlayerController。

⑵编辑脚本(下面的代码里tilt前加负号是为了正常认知的旋转,可以不加负号试一下。

 

 

⑶保存完脚本后回到unity设置各类数值(speed为飞机速度,boundary下为飞行范围,tilt为旋转角度)

 

 

 

8.设置飞机子弹

⑴为了不挡视野隐藏Player,Hierarchy下新建对象(Shift+Ctrl+N),命名为Bolt并reset。

⑵新建平面(create→3D Object→Quad),命名为VFX,reset后拖入Bolt成为子对象,让VFX的Rotation设为(90,0, 0)。

⑶之前我们在制作背景时直接将图片拖入平面,这次我们换种方式。选定Project下的Materials文件夹新建Material命名为fx_bolt_orange。将Textures下的子弹图片拖入Material的Albedo前的小方框,则Material变成了子弹的样子,再将Material拖入平面。

⑷我们发现子弹是生成了,但子弹所在的平面周围是黑色的,脱离了背景,所以设置子弹所在平面为透明的(Inspector→fx_bolt_orange→Shader→Particles→Additive)。

⑸选定Bolt,添加Rigidbody,并取消Use Gravity。添加Capsule Collider,选定主方向为Z,Radius设为0.04,Height设置为0.5,并勾选Is Trigger使可触发。

 

 

⑹为了让子弹动起来我们为Bolt添加脚本,命名为Mover,并编辑(下图应在void Start中加一句“rb = GetComponent<Rigidbody>();“”)。

 

 

⑺保存脚本后回到Bolt将速度设置为20(子弹速度比飞机快)。因为我们之后要多发子弹,故把Bolt拖入到Project下的Prefabs文件夹作为预制件,并删除Hierarchy中的Bolt。

⑻之后取消隐藏Player,新建对象(Shift+Ctrl+N)并命名为Shot Spown,reset后调整Position为(0, 0, 1.25),这是子弹初始发出的位置。

⑼之后打开PlayerController脚本编辑。

 

 

⑽保存脚本后点击Player,将预制件里的Bolt拖入shot变量,将Player下的Shotspawn拖入Shotspawn变量,Firerate设置为0.5,子弹设置完毕。

9.消除多余的子弹

⑴当我们测试上面所做的场景时,发现随着子弹射出将产生越来越多的对象,系统变得拥堵。所以我们制作一个“盒子”来回收这些子弹。

⑵Hierarchy下新建Cube,命名为Boundary,reset,勾选碰撞发生器Is Trigger。

⑶将Boundary的Position设置为(0,0,5),与摄像机处在同一垂直线;Rotation设为(20,1,40),覆盖整个界面,去掉Inspector下的网格渲染器(Mesh Renderer)&网格过滤器(Mesh Filter)。

⑷在Boundary中添加新脚本,命名为DestroyByBoundary,并编辑。

 

 

10.设置小行星碰撞物

⑴Hierarchy下新建对象命名为Asteroid,并reset,将Position调整为(0,0,16),将Project下模型里的第一个模型(Project→Assets→Models)拖入Asteroid成为它的子对象,将拖入的子对象reset。

⑵为Asteroid添加Rigidbody,并把重力勾选掉;再为Asteroid添加Capsule Collider,摁下Edit Collider可拖动视图里Capsule的网格节点来调整Capsule网格的大小,调整到刚好包裹小行星的大小。

 

 

⑶我们来设置让小行星自己转动起来,在Asteroid下新建脚本,命名为RandomRotator。将Assets下的C#文件拖入到Scripts文件夹,以便于管理。

⑷编辑脚本,保存后设置变量Tumble值为5。太空中没有空气阻力,故将Angular Drag设置为0.

 

 

⑸为了让小行星与子弹&飞机发生反应,新建脚本并命名为DestroyByContact,将脚本文件拖入到Scripts文件夹下。

 

 

⑹保存后回到unity,将Boundary的标签改一下,在标签选项栏新建标签,命名为Boundary,保存标签后勾选。

11.设置爆炸效果

⑴打开DestroyByContact,编辑脚本

 

 

⑵保存后回到Unity,将爆炸效果(Project→Assets→Prefabs→VFX→Explosions)分别拖入到对象变量。将Player的标签设为“Player”,为了让行星移动起来,将Mover脚本拖入Asteroid,并设置速度为-5.

 

 

⑶因为我们不需要小行星一直呆着,所以将Asteroid拖入Prefabs成为预制件,并删除Hierarchy下的Asteroid。

12.设置游戏控制器

⑴新建对象(Shift+Ctrl+N),命名为Game Controller后reset,选择该对象的标签为GameController。

⑵在Game Controller下新建脚本,命名为GameController,并把脚本文件拖入Scripts文件夹,编辑脚本。

 

 

⑶保存后回到unity,选定Hierarchy下的Game Controller,将Asteroid预制件拖入hazard变量,Spawn Values设置为(9,0,16)。

⑷接下来我们设置一堆而不是单个小行星落下,打开GameController脚本并编辑

 

 

⑸保存后回到unity,设置hazardCount为10(一波10个行星),spawnWait为0.5(行星间0.0秒间隔),Startwait设为1(给玩家反应的时间)。

⑹然后设置一波攻击后进行下一波攻击,编辑GameController脚本

 

 

⑺保存后测试我们发现每消除一个行星就会复制一个爆炸对象,越积越多。在这里Boundary不顶用了,我们用时间来回收。在Scripts文件夹下新建C#脚本命名为DestroyByTime,编辑脚本。

 

 

⑻选定两个爆炸特效预制件(Project→Assets→Prefabs→VFX→Explosions→explosion_player&explosion_asteroid,Ctrl键同时选取),添加Scripts选择DestroyByTime,设置lifetime为2。

13.添加音效

⑴点击Project下的Audio文件夹,我们可以看到一系列音效,将音频explosion_asteroid拖入到预制件explosion_asteroid,记得勾选Play On Awake(爆炸效果触发 同时播放音效)。

 

 

⑵同样的将音频explosion_player拖入其对应的预制件,使飞机被毁后播放。

⑶飞机打出子弹同样有声音,将音频weapon_player 拖入到Hierarchy下的Player,点击Player,取消勾选Play on Awake(我们只需在开火时播放)。

⑷编辑PlayerController脚本

 

 

⑸接着将背景音乐音频music_background拖入到Hierarchy下的Game Controller,勾选Play On Awake以在一开始就播放,勾选Loop来使背景音乐循环。

⑹最后调整各音频的音量,将Player和Game Controller下的音频的Volume值都改为5,而两个爆炸效果的音量为默认的1,使爆炸效果更突出。

14.设置计分板并计分

⑴Hierarchy下新建对象,命名为Score Text并reset,为新对象添加组件GUI Text(Add Component→Rendering→GUI Text)。

⑵将GUI Text的内容改为Score Text。将新对象的Position改为(0.04,1,0),Pixel Offset改为(-10,10),是为了将对象以目前为止以该像素(10,-10)偏移。

 

 

⑶为了游戏记录玩家的分数和更新GUI内容,打开GameController脚本并编辑

 

 

⑷保存后回到Game Controller将Score Text拖入

 

 

⑸然后我们要确定行星被击碎后累积X分数,编辑DestroyByContact脚本

 

 

⑹保存后点击预制件Asteroid将Score Value设为10,即一击10分

 

 

15.结束游戏

⑴新建对象命名为Restart Text,添加GUI Text(Add Component→Rendering→GUI Text),内容改为Restart Text。Position设为(1,1,0),选择位置为右上角(Anchor→Upper Right),Pixel Offset为(-10,-10).

⑵新建对象命名为Game Over Text,添加GUI Text,内容改为Game Over Text,Position设为(0.5,0.6,0),Anchor为Middler Center,Alignment设为Center。

⑶新建对象命名为Display Text,将Score Text,Restart Text和Game Over Text拖入以便管理。

 

 

⑷为了让新建的两个GUI Text起作用,编辑GameController脚本

 

 

 

 

⑸保存后回到unity,单击Hierarchy下的Game Controller,将两个文本对象拖入对应的变量框。

⑹接着判定游戏是否为gameover状态,编辑DestroyByContact脚本

 

 

⑺回到unity,我们修改一下GUI的外观,将分数板和restart板同时选定后将Font Size改为20(字体大小),游戏结束板字体大小改为25并改为红色。

⑻游戏完成啦,最后发布游戏就好了(已在ROLL-A-BOLL中介绍)。

-------------------------------------------------------------------------

16.改进

上面为官方原版教程,在实际操作中发射功能不停的Instantiate,Destroy是非常耗CPU的,通常用建立子弹的Object Pool来完成。

生成子弹

 

摧毁子弹

 

Object Pool的通用脚本

 

如果用上面的对象池的一般脚本的话,那生成子弹的脚本可直接改为

Hierarchy下新建空对象命名为ObjectPool。把ObjectPool脚本挂上去,然后把对象存为预制件。

这样做的好处是所有游戏对象都可公用一个游戏池,比如玩家发射和敌人发射。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值