太空大战算是比较经典的游戏了。这两天在跟着视频自学了一下。能做到的效果就是飞机发出子弹打爆陨石,如果被陨石碰到就死掉。简单的赤果果。界面如下:

现在做个总结:(模型声音之类的是导入的资源包。)

很明显这个游戏是一个2D游戏,但是我们是在3D环境下做的,其实没太大影响。

我们让这个背景和飞机都在X-Z平面上,飞机在(0,0,0)的位置,背景在(0,-10,10)的位置,如图:

这样我们的飞机和陨石就相当于只在X-Z这个平面运动,三维就降到了二维。很明显,相机要在飞机的Y轴上方才能出现游戏的界面效果。

这样我们的大体位置就摆好了。下面写代码控制飞机的运动:

void FixedUpdate(){//水平移动float h = Input.GetAxis ("Horizontal");//垂直移动float v = Input.GetAxis ("Vertical");//移动方向Vector3 move = new Vector3 (h, 0f, v);//移动速度_rigi.velocity = speed * move;//限制飞机移动的范围,限制value的值在min和max之间, 如果value小于min,返回min。 如果value大于max,返回max,否则返回value_rigi.transform.position = new Vector3(Mathf.Clamp(_rigi.transform.position.x,bound.xMin,bound.xMax),0,Mathf.Clamp(_rigi.transform.position.z,bound.zMin,bound.zMax));}

简单说一下FixedUpdate()和Update()的区别:

pdate()是每渲染新的一帧就会调用;FixedUpdate()是固定的时间间隔调用,时间可以通过edit->Project Settings->time进行设置

接触了一个新函数:Mathf.Clamp。Mathf是常用数学函数的集合。

static function Clamp(value:float,min:float,max:float):float限制value的值在min和max之间, 如果value小于min,返回min。 如果value大于max,返回max,否则返回value

控制飞机发出子弹:

void Update(){//如果敲击空格键,生成子弹if(Input.GetKeyDown(KeyCode.Space)){_audio.PlayOneShot (fire,0.7f);Instantiate(bolt,spawnPos.position,spawnPos.rotation);}}

bolt是一个预制体Prefab,spawnPos是一个空物体。Instantiate的意思就是在这个空物体的位置生成一个子弹。

怎么销毁子弹呢?这里用到了OnTriggerExit()

void OnTriggerExit(Collider other){//print (other.name);//销毁物体Destroy (other.gameObject);}

也就是在飞机和子弹的平面上有一个box collider,当然这个collider是触发模式。判断当子弹离开这个collider的时候,就销毁子弹。如图:

好了飞机能够飞能够发射子弹了。那么我们生成陨石吧

我们把本身已经导入的模型拉入到Hierarchy中(附在一个空物体上),然后做成Prefab。现在控制单个陨石的旋转和降落以及碰到子弹就爆炸。

首先旋转:

public class RandowRotate : MonoBehaviour {//陨石旋转速度public float Tumble = 5;private Rigidbody _rigi;void Start(){_rigi = GetComponent<Rigidbody> ();//设置刚体的角速度????_rigi.angularVelocity = Random.insideUnitSphere * Tumble;}void Update(){}
}

Random.insideUnitSphere的意思就是返回半径为1的球体内的一二随机点。

然后运动:

public class Mover : MonoBehaviour {private Rigidbody _rigi;public float speed = 10;void Start(){_rigi = GetComponent<Rigidbody> ();_rigi.velocity = speed * new Vector3 (0,0,1);}
}

这个Mover.cs其实是控制飞机写的,但是照样能控制陨石,只需把Unity界面内的speed改成复数即可。

碰撞爆炸效果:

void OnCollisionEnter(Collision other){//如果陨石碰到飞机,飞机爆炸,飞机销毁if (other.gameObject.tag == "Player") {Instantiate (playerExplosion, other.gameObject.transform.position, other.gameObject.transform.rotation);Destroy (other.gameObject);_gc.GameOver ();}//陨石爆炸,陨石销毁Instantiate (explosion,transform.position,transform.rotation);Destroy (this.gameObject);_gc.AddScore (score);}

playerExplosion和explosion都是公有变量,在Unity面板中拉入效果即可。如图:

如果要添加声音的话,也要在这些个预制体面板中添加AudioSource,这样每次生成爆炸效果的时候也会生成Audio。因为我发现调用audio 的时候只能在Update()这样的函数中调用,如果只是一个普通的函数,声音是不会响的。所以以陨石爆炸为例,简单记录一下声音的附载:

这就不用写代码控制。Unity已经帮你做好了。puls,通过上图我们可以看到一个cs文件,这个是根据时间销毁爆炸效果的(毕竟爆炸也是一个粒子系统),代码如下:

public class DestroyByTime : MonoBehaviour {//过了一定时间就销毁public float lifetime;void Start(){Destroy (this.gameObject,lifetime);}
}

好了现在陨石可以降落了,飞机可以打陨石了。怎么控制陨石有规律的一波一波的降落呢?我们在Hierarchy面板中新建一个空物体,更名为GameController,GameController一般都是必不可少的。它的面板如下:

首先来看我们的GameController.cs文件:

    public Vector3 spawnValues;
    //创建三个物体
    public GameObject[] hazard;
    //一波10个小陨石
    public int numPerWave = 10;
    //出现小陨石之前的等待时间
    public float startWait = 2f;
    //小陨石间隔时间
    public float spawnWait = 1f;
    //每波之间的间隔时间
    public float waveWait = 4f;
  void Update(){if (gameOver && Input.GetKeyDown (KeyCode.R)) {//Application.LoadLevel (Application.loadedLevel);SceneManager.LoadScene("spceshooter");}}//有规律的随机产生小陨石IEnumerator SpawnWaves(){yield return new WaitForSeconds (startWait);while(true){for (int i = 0; i < numPerWave; i++) {Spawn ();//?????yield return new WaitForSeconds (spawnWait);}yield return new WaitForSeconds(waveWait);if (gameflag==false) {break;}}}//随机创建小陨石void Spawn(){//取三个物体中的一个GameObject o = hazard[Random.Range(0,hazard.Length)];//产生随机位置,主要是x不同Vector3 p = new Vector3 (Random.Range(-spawnValues.x,spawnValues.x),spawnValues.y,spawnValues.z);//默认旋转Quaternion q = Quaternion.identity;//初始化小陨石Instantiate (o, p, q);}

需要了解的是yield,这个方法在代码中是经常使用的。这个比较复杂,自行百度。有空再写篇博客介绍。

现在可以有多波小陨石了。怎么计分呢,控制游戏结束,重新开始呢?

在Hierarchy面板中添加三个GUIText,如图:

分别对应得分、游戏结束、游戏重新开始的界面。控制代码如下,这些代码最好是写在GameController.cs:

        //得分public GUIText scoreText;private int score = 0;//游戏结束public GUIText gameOver;public bool gameflag = true;//游戏重新开始public GUIText gameRestart;
        void Start(){//????spawnValues.x = 6;StartCoroutine (SpawnWaves ());scoreText.text = "Score: " + score;
     //先为空,不显示gameOver.text = "";gameRestart.text = "";}

得分以及游戏结束:

        //分数增加public void AddScore(int v){score += v;scoreText.text = "Score: " + score;}//游戏结束public void GameOver(){gameflag = false;gameOver.text = "Game over";gameRestart.text = "press R to restart";}

得分及游戏结束的判断在DestroyByContact.cs文件内,只要是判断陨石碰到了飞机,就调用GameOver();只要是判断陨石碰到了子弹,就调用分数增加。那么怎么判断R键的按下呢。需要在GameController.cs的update()内进行判断:

void Update(){if (gameOver && Input.GetKeyDown (KeyCode.R)) {//Application.LoadLevel (Application.loadedLevel);SceneManager.LoadScene("spceshooter");}}

ok大功告成!一个原型就这么做出来了。可以改进的地方很多,比如说:

判断飞机打到什么程度就换关卡,不同关卡的难度怎么设计?

怎么添加敌人这个角色,让敌人能够移动并发射子弹打飞机?

飞机有没有大招?

飞机能不能快速移动?

能不能让场景有移动的感觉?

---------------------------------------性感的分割线-------------------------------------------------------------

写项目的时候出现的错误以及解决办法:

说一下背景bg:其实很简单,就是一个Quad,然后把长图贴上去即可。

1.给飞机添加了一个mesh collider,添加了Rigibody之后,运行总是报错:

Non-convex MeshCollider with non-kinematic Rigidbody is no longer supported in Unity 5.

If you want to use a non-convex mesh either make the Rigidbody kinematic or remove the Rigidbody component. Scene hierarchy path "Player", Mesh asset path "Assets/SpaceShooter/Models/vehicle_playerShip_collider.FBX" Mesh name "player_ship_collider"

这个错误的意思就是:

碰撞检测时,如果想使用非凸网格,删除刚体  或者勾选   is kinematic 选项。但是不能删除刚体, is kinematic的意思是是否运动学的。如果勾选上了,这个对象只受transform影响不受force影响,所以就别想让飞机动弹了。解决办法是:

勾选Convex。勾选上了以后就是用非凸网格。报错就消失了。

2.刚开始collider之间的is trigger都填上了,陨石和子弹都在一个平面内的Collider内,所以判断不到陨石和子弹的碰撞,后来只有这个平面Boundary是触发的,其他的都变成了非触发的collider。就可以检测到碰撞了。

原型代码请看评论,评论会给出链接

初学者Unity项目--太空大战相关推荐

  1. Unity项目 - 坦克大战3D TankBattle

    目录 游戏原型 项目演示 绘图资源 代码实现 技术探讨 参考来源 游戏原型 游戏玩法:在有界的战场上,玩家将驾驶坦克,代表绿色阵营,与你的队友一起击溃红蓝阵营的敌人,在这场三方大战中夺得胜利! 操作指 ...

  2. 视频教程-Unity经典案例再现《太空大战》-Unity3D

    Unity经典案例再现<太空大战> 专注于VR/游戏研发八年,精通各种常用语言,熟练使用Unity和UE4引擎开发. 张建飞 ¥12.00 立即订阅 扫码下载「CSDN程序员学院APP」, ...

  3. Unity项目总结(已完成17项,持续更新ing,含商城、塔防、背包、动画、坦克大战等)

    Unity项目总结 写在前面 视频播放(Lua调UnityAPI) AB包使用(异步加载AB包) 编辑器模式运行(Editor编辑器开发) Phong光照模型(顶点片元Shader.表面体Shader ...

  4. 2021-11-04太空大战项目制作

    太空大战项目制作 一.背景制作 1.创建一个Quad,更名为BG,并为其添加材质 2.设置旋转和放大参数 3.创建一个Quad,更名为BG2,并为其添加材质,作为BG的子对象,设置Y轴位置为-1 4. ...

  5. 太空大战--敌人创建

    太空大战–敌人创建 前言 该博客为记录学习太空大战unity项目的过程. 游戏介绍 在游戏中,主角操作太空飞船和敌人的太空飞船战斗.消灭敌人的飞船可以取得一定的分数,游戏没有尽头,如果主角的飞船被击落 ...

  6. 太空大战--场景创建

    太空大战–场景创建 前言 该博客为记录学习太空大战unity项目的过程. 游戏介绍 在游戏中,主角操作太空飞船和敌人的太空飞船战斗.消灭敌人的飞船可以取得一定的分数,游戏没有尽头,如果主角的飞船被击落 ...

  7. 2021Unity学习教程:本地下载的Unity项目怎么打开?

    2021Unity学习教程:Unity项目怎么打开? 前言:很多人想通过下载学习Unity项目资源来快速上手Unity,但初学者有时在打开文件这一步就遇到了问题.其实,Unity项目工程需要在Unit ...

  8. unity 项目实践经验 和 架构体系

    GameRes游资网授权发布 文 / 吴秦(Tyler) 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身.虽然基于Unity3D,很多东西同样适用于Cocos.本文从以下10大点进行阐述: ...

  9. 用Html5结合Qt制作一款本地化EXE游戏-太空大战(Space War)

    本次来说一说如何利用lufylegend.js引擎制作一款html5游戏后将其通过Qt转换成EXE程序.步骤其实非常简单,接下来就一步步地做一下解释和说明. 首先我们来开发一个有点类似于太空大战的游戏 ...

最新文章

  1. SAP MM 启用批次管理的物料,在分类视图里指派023类型分类不是必须的
  2. 例题:青歌赛打分程序。去掉两个最高分,去掉两个最低分,再算平均分。主要学习数组和冒泡排序,什么情况下要定义数组...
  3. 深度学习100例-卷积神经网络(AlexNet)手把手教学 | 第11天
  4. HDU-5023 线段树染色问题+延时标记
  5. C使用递归实现前N个元素的和
  6. 64位 setupdienumdeviceinterfaces_win7 32位重装系统详细教程
  7. 关于WebBrowser(浏览器)控件的调用
  8. C语言中各小写字母对应的ascal码值,asc2(ascall码对照表)
  9. 大学学计算机需要英语,大学学什么才能不被计算机淘汰
  10. 用python可以免费下载音乐吗-Python 教你轻松下载网易音乐歌曲
  11. HTML+CSS伸缩式导航栏
  12. Pygame开发Flappy Bird小游戏(下)
  13. markdown插入图片的几个办法
  14. python 标准输入设备_实时获取MIDI设备的输入(Python)
  15. 中国演绎太空生命传奇
  16. 使用webcollector爬虫技术获取网易云音乐全部歌曲
  17. 计算机图形学——二维图形几何转换
  18. C/C++ 拼凑春联
  19. Matlab-RGB-颜色对照表(0-1之间取值)
  20. XP停服务,卡巴当后盾——卡巴斯基反病毒软件2014(一年版)

热门文章

  1. CentOS 7安装Cowsay(奶牛有话说)
  2. Visual Studio 2013正式版下载(附直接链接汇总),本人亲测好使
  3. 华北五省机器人擂台格斗大赛决赛代码(可以参考战斗逻辑)
  4. oracle 物理dg 逻辑dg,物理DG与逻辑DG的区别与逻辑DG同步异常处理方法
  5. BGP同步与路由黑洞,路由聚合
  6. 面向过程给出《贝叶斯思维:统计建模的Python学习法》——二维彩球问题学习代码
  7. 功能性癫痫中内在网络连接与精神症状严重程度的关系
  8. 在虚幻引擎中使用蓝图实现简单的对话
  9. 云服务器虚拟目录吗,虚拟主机 虚拟目录
  10. 视频技术的发展对车载移动远程监控行业有何影响?