太空大战游戏开发实例
Posted Bingghost
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了太空大战游戏开发实例相关的知识,希望对你有一定的参考价值。
Unity 版本: 5.3.5.f1
一. 游戏策划
操作模式:
上下左右按键, 空格发射子弹
游戏中的敌人:
(1) 初级敌人,装甲交弱,以撞击主角为主, 沿弧线飞行
(2) 高级敌人,装甲较强,可以发射子弹, 直线飞行
二.游戏场景制作
1.导入游戏所需要的美术资源
方法一:
Assets目录点击右键->show in explorer->将美术资源直接copy到Assets目录
在回到unity3d界面就可以看到相关资源
方法二:
Assets目录点击右键->import new asset->浏览选择目标资源
![](https://image.cha138.com/20210611/8eae185d8a3f46248edbaece109c8ab7.jpg)
3.创建场景
File->new sense当前场景为level0
![](https://image.cha138.com/20210611/6eaf3bda0374452d8754f6c772a5fbbc.jpg)
双击level0 即可选定编辑
(1).创建一个平面体作为游戏背景
GameObject->3D Object->Plane
U3D中采用左手坐标系系统
![](https://image.cha138.com/20210611/960c609285e54427b114dbdd6fe6b023.jpg)
所以我们可以选择top视角(从上往下看),即可观察到平面
![](https://image.cha138.com/20210611/1d24dee92f9a4f43872f6620bfc06282.jpg)
(2). 创建一个材质
assets目录右键->create->material
![](https://image.cha138.com/20210611/462182de4e604237a85e00d842899d9f.jpg)
Transparent材质将带有alpha信息,可以设置透明度(alpha cutoff)
(3). 完成场景设定
将background拖放到创建好的plane上面即可(U3D中很多操作都可以通过拖放来完成)
![](https://image.cha138.com/20210611/223447c5b35243bc8d2392e994953bf9.jpg)
(4). 创建星空背景
继续新建一个平面体,使其在刚刚星球平面体下方,在inspector->scale中可以指明X和Z方向上的长度
由于默认是1,我给2就刚好星球平面体的大小的2倍
![](https://image.cha138.com/20210611/61e2495a8a684d329f9cbfabb6cafb78.jpg)
继续创建一个材质与其绑定
![](https://image.cha138.com/20210611/bebf4e6992b24bb0866b0c709d503f70.jpg)
完成后效果如下:
![](https://image.cha138.com/20210611/a8dc834d6c4544f78cd098ccac97b8d9.jpg)
4. 场景中添加动画
(1) 选中星空图平面体,菜单栏点击Windows->animation(快捷键Ctrl+6)
![](https://image.cha138.com/20210611/fb63631396a54d2f83ebefd1d92b7229.jpg)
先点左上角那个小红点开始录制,然后选择curves,点击add property
出现各种颜色的线,比如Material._Main Tex_ST.w是黄色的线
拖动这个呈直线,斜率越低速度越慢(但是只会跑半边动画)
如上路效果就是星空图相对与星球向下移动
- -!这里被坑的有点惨,玩了半天才玩懂
5.设置摄像机和灯光
(1) 设置摄像机
调整好视角
a. 按鼠标中建平移视图
b. 按鼠标左键+alt键旋转视图
c. 按鼠标右键+alt键或滑动鼠标滑轮推拉视图
d. 按F键快速锁定选中目标
![](https://image.cha138.com/20210611/a9aa774b9e454ca5b895ed0d652df51f.jpg)
调整好视角之后,在hierarchy窗口选择Main Camera,Main Camera是游戏的默认摄像机
在菜单栏选择Game Object->Align with view 使摄像机视角与当前视角保持一致.
(2).设置灯光
添加亮度
Windows->Lighting->Ambient intensity调节亮度
![](https://image.cha138.com/20210611/3435faf825c2461d8ec30126ae48800f.jpg)
添加灯光
GameObject->Light->point Light
添加完毕后会出现黄色的光源范围
![](https://image.cha138.com/20210611/681f7844521343b4a74b209c49929c82.jpg)
默认就有一个光源(看来黄色线条表示光源)
![](https://image.cha138.com/20210611/87c5965c635a42a7911194e1fc0d1ac8.jpg)
三.游戏主角设定
游戏的主角是一个太空飞船,也是我们的操作目标
1.将主角设定到场景中
将Player.fbx拖放到游戏场景, 在asset目录有个播放的小三角形图标
![](https://image.cha138.com/20210611/1a8d5ad8e87b492da2b4e9890b613b01.jpg)
在光照效果下已经在星球表明形成阴影
![](https://image.cha138.com/20210611/139e11fbdc0c437ebee58486d61d42ac.jpg)
酷炫 突然明白了U3D就像是一套物理引擎,设计好游戏场景,每个场景有不同的物理元素(GameObject)
然后写程序控制每个GameObject实现游戏逻辑
![](https://image.cha138.com/20210611/12182fe067b449c989a62ccdc4839b97.jpg)
2. 编写控制代码
在assets目录下新建script目录,然后脚本目录下新建Player.cs
双击脚本VS 2013打开,U3D目录会自动生成VS的sln工程文件
将Player直接拖放到Player的Inspector窗口,即可完成脚本绑定
![](https://image.cha138.com/20210611/62c6cf4aa575460083807e536ecfc7d1.jpg)
编写代码如下:
![](https://image.cha138.com/20210611/5554b9a961f846a7b011d69cd932e2cd.jpg)
说明:
a.Start()函数 主要执行一些初始化操作
Update()函数 每桢执行一次, 有点像Win32GUI编程中的WM_PAINT
b. Time.deltaTime表示每桢的经过时间,那些需要每桢做增减变动的数值都需要乘上Time.deltaTime
我们的例子种速度和Time.deltaTime相乘,表示每桢移动N米距离
c. Transform组件提供的主要功能和移动,旋转,缩放游戏体有关,其中Vector3类型的参数用来表示在x,y,z3个方向上移动的距离
这个时候点击场景播放,就可以发现我们可以控制战机的移动了
U3D也识别出了Speed为1
![](https://image.cha138.com/20210611/7a0691e572a84b9282cc1d1bbcdc6881.jpg)
3. 创建子弹
(1). 设定子弹体
将rocket.fbx拖放到level0场景,编写代码如下:
![](https://image.cha138.com/20210611/41559f2d4aa4459b9bd941bb8007d2a1.jpg)
设置代码组件后,我们发现子弹so~一下就消失了
(2)创建子弹prefab
prefab可以理解为可以重用的游戏体,
然后我们可以在任意场合,时间包括其他的U3D游戏中重复使用
新建一个frefabs目录,新建一个空的prefab,然后可以直接从场景中的rocket拖放到prefabs即可
![](https://image.cha138.com/20210611/07c31a0e68d24161b494f51176a99102.jpg)
同时设置prefab脚本为rocket.cs即可,原场景中的rocket可以删掉了
(3). 发射子弹
player中添加代码,注意必须是public,否则不会显示在Inspector窗口
![](https://image.cha138.com/20210611/42bb8832b31b4828991eb3f7824916d1.jpg)
此时Inspector窗口多了Rocket属性,将prefab的Rocket拖放到Rocket选项即可
![](https://image.cha138.com/20210611/81d474aefa354e4c8c1e762cb501aaf4.jpg)
编写子弹逻辑,0.1秒发射一次子弹
![](https://image.cha138.com/20210611/fd492e638f3e4a279e6fbbe1ac71b7d2.jpg)
再次运行游戏,可以发射子弹了
4.创建敌人
创建敌人和创建主角差不多,直接拖动到上面即可,敌人可以复用,所以最后还是创建prefab
编写代码如下:
![](https://image.cha138.com/20210611/f1ab92735dc54d36be208ee55f46acc0.jpg)
运行游戏,敌人开始做曲线向下运动
5. 碰撞检测
(1).为敌人添加碰撞
选中敌人,添加组件
![](https://image.cha138.com/20210611/923ff2498c624c6da36109b188308eb8.jpg)
添加Physics->Box Collider
![](https://image.cha138.com/20210611/287c8c7433744f26ba432e8bf983d550.jpg)
将is Trigger勾选,使其触发状态激活
![](https://image.cha138.com/20210611/15f267e19b134288856b19a87cf69cb5.jpg)
在继续添加一个刚体,所有参与物理计算的游戏体都需要一个刚体才能正常工作
Add Component->physics->rigidbody
![](https://image.cha138.com/20210611/5042381d883d4936a7990cc0857f1003.jpg)
去掉Use Gravity不受到重力影响
is kinematic 勾选使得游戏体不受到物理模拟的影响
同样为主角和子弹添加刚体和物理碰撞
(2).设置tags
Edit->Project Setting->tags and layouts
添加2个tag
![](https://image.cha138.com/20210611/0f0da7baff814ed3b4ec933583ba3c75.jpg)
在prefab中绑定tag
![](https://image.cha138.com/20210611/bc62598b5f2a4fefae607d7317166c74.jpg)
(3).游戏体碰撞检测
敌人代码检测逻辑:
碰撞到子弹后,根据子弹的威力递减生命值,当生命值为负数时,自动销毁
碰撞到主角,直接死亡
![](https://image.cha138.com/20210611/de8f369331eb428da07fc38a204c6db7.jpg)
子弹碰撞检测
与敌人碰撞就销毁
![](https://image.cha138.com/20210611/be3ce0021efc4c9d8439dff2b2a9c552.jpg)
主角碰撞检测
与不是己方子弹碰撞,都减少1点生命
![](https://image.cha138.com/20210611/f832556198fa42278e107b8fa73f9d74.jpg)
(4). 游戏边界碰撞检测
在游戏下方添加一个游戏边界(一个空的游戏体),当敌人碰撞边界就销毁
![](https://image.cha138.com/20210611/43cc1c59b05c414ba6e5c006bc8f8e5e.jpg)
设置如下
![](https://image.cha138.com/20210611/2394bc386d194c109f21c30f016e090a.jpg)
注意保证Y坐标一致,不然可能无法发生碰撞
6. 添加高级敌人
添加一个可以发射子弹的高级敌人,其方法和主角一样,只是控制交给计算机完成
![](https://image.cha138.com/20210611/64a2f8f31414437c87d3e46a33348f8a.jpg)
高级敌人继承于初级敌人类即可, 重载移动方式函数
Awake每次实例创建会调用一次,时机早于start函数
实例创建立即寻找当前player,每隔2秒发射一颗定向导弹
7. 声音和特效
导入音效文件和特效文件
新建一个FX文件夹->Import Package->Custom Package->*.unitypackage文件
![](https://image.cha138.com/20210611/11919b0e29824307a7725b6d6aa0e9b5.jpg)
也可以把本工程的特效声音文件导出为unitypackage文件给其他游戏使用
(1).声音播放
播放声音需要添加Audio Source组件,Add Component->Audio->Audio Source
![](https://image.cha138.com/20210611/7c698d5f97ef4d518e54a63ad50adc6e.jpg)
代码中定义
![](https://image.cha138.com/20210611/bfa6090837a74b05b74012726ffc69b4.jpg)
将声音文件与m_shootClip绑定(U3D窗口拖放即可完成绑定)
Start中初始化Audio
![](https://image.cha138.com/20210611/7b61575ecbc64ba280928d8e967dcd31.jpg)
调用Play相关函数即可播放声音
![](https://image.cha138.com/20210611/c411c00b378e4712ad24ba21287059c2.jpg)
(2). 特效
特效的操作和声音比较相似,定义一个Transform
![](https://image.cha138.com/20210611/026da98de5514111b5e3f7372915a74d.jpg)
U3D中将特效文件和该定义字段绑定
![](https://image.cha138.com/20210611/c07716d44121444a96d4b564d030d9fd.jpg)
调用Instantiate函数播放爆炸特效
![](https://image.cha138.com/20210611/9f65074c7b9241d8b8cfe1b378a97fd2.jpg)
8. 敌人生成器
我们可以定义一些空的GameObject来源源不断的产生敌人,道理和主角发子弹一样
把空的GameObject发射指定逻辑的敌人
创建2个prefabs,绑定不同的敌人,将prefab分布到场景的指定地点出怪即可
![](https://image.cha138.com/20210611/67f8ff7adbc04f78b9972a515489602d.jpg)
同时用代码控制出怪逻辑,5~10秒随机生成敌人
![](https://image.cha138.com/20210611/07b90f83cd344993921d4e02877219bf.jpg)
9. 游戏管理器
游戏信息的展示,也是在场景里面和一个空的GameObject绑定,执行相关的代码
10. 新场景的建立(游戏向导)
File->New Scene->保存为start
添加一个空gameobject->添加一个组件GUI Texture->指定一张图片
![](https://image.cha138.com/20210611/f89d8b1f0cf648bbb30b071870c5b2d9.jpg)
将摄像机对准图片对象
编写代码,通过LoadLevel可以载入其他场景
![](https://image.cha138.com/20210611/8f737b52e4e44fb4a5eb6ecea8041ba8.jpg)
11. 发布游戏
Edit->project Setting->Player设置发布的图标,公司,产品名称等信息
![](https://image.cha138.com/20210611/f1eccc988b154ec395cac6b96b3c433d.jpg)
设置游戏分辨率相关信息
![](https://image.cha138.com/20210611/edecec32486449d0be8b7250935eb249.jpg)
File->Build Setting即可发布游戏, 启动游戏后程序会按列表顺便播放相应的场景
![](https://image.cha138.com/20210611/56f5ff4b011a498a8506a3ae402b23a7.jpg)
游戏运行效果
![](https://image.cha138.com/20210611/86bffff496284d5b9394a7e68b65f90d.jpg)
以上是关于太空大战游戏开发实例的主要内容,如果未能解决你的问题,请参考以下文章