前言

这一篇文章主要记录做星球大战小游戏的整个过程。

设置背景的移动

首先创建两个板子Plane,然后让背后的星空移动。

Notes:原本的星球是有边框的,如何让边框消失?
–设置透明:在Matrial设置:

让背景星空移动:
和前篇设置Cube移动差不多,但是这里有几个注意点:
背景图移动的话选这个:

想要循环移动,不重合可以把Offset设为1:(材质球里的属性)

另外这里除了动画还可以用代码来循环:

public class under_plane_move : MonoBehaviour {public float moveSpeed;// Use this for initializationvoid Start () {}// 我弄的还有重合的问题void Update () {if (transform.position.z <= -8.0f) {transform.position = new Vector3 (transform.position.x, transform.position.x, 8.0f);}transform.Translate (-Vector3.forward * moveSpeed * Time.deltaTime);}
}

前提是要复制一个背景plane,而且要计算什么时候合适,我太懒了,随便输了几个数,可以实现,但是会有重合的部分。

控制飞机(玩家)的移动

通过wasd控制移动,碰到边界就不可以继续移动了。
这里用代码就可以实现,代码的前提是知道项目设置中input的属性:有以下这些:


这里的代码是根据这个属性写的:

public class Player_Control : MonoBehaviour {public GameObject prefab;public Transform kong;public float movespeed;// Use this for initializationvoid Start () {}void Update () {float Horizontal = Input.GetAxis ("Horizontal");if (transform.position.x <= -3.79 &&Horizontal >0.0f) {Horizontal = 0.0f;}if (transform.position.x >= 3.68 &&Horizontal <0.0f) {Horizontal = 0.0f;}transform.Translate (new Vector3 (Horizontal*movespeed*Time.deltaTime, 0, 0), Space.Self);float Vertical = Input.GetAxis ("Vertical");if (transform.position.z <= -2.00 &&Vertical >0.0f) {Vertical = 0.0f;}if (transform.position.z >= 1.42 &&Vertical <0.0f) {Vertical = 0.0f;}transform.Translate (new Vector3 (0, 0, Vertical*movespeed*Time.deltaTime), Space.Self);if (Input.GetMouseButtonDown (0)) {Instantiate (prefab, kong.position, prefab.transform.rotation);}}
}

子弹预设

这里是要打出子弹的效果。
1 首先把子弹放在合适位置,调整大小,起名Rocket,这个Rocket可以勾掉,因为不按鼠标左键就不会有子弹。

1 然后设置一个空物体kong,这个空物体的作用是当作Rocket的克隆,是个工具人。
2 写一个子弹可以一直往前飞的代码:

public class RocketsSelfMove : MonoBehaviour {//子弹是自动移动的public float movespeed;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {transform.Translate (-Vector3.forward * movespeed );}
}


放到Rocket的模块里。
3 将Rocket拖入预设中:

4.给子弹加音效
首先这个是点击才有声音,因此要设置一个AudioClip,有音乐自然还要设置一个 AudioSource;等需要的时候,让 AudioSource的click等于这个AudioClip,然后播放即可。

  1. 写代码(上面已经有了,这里总结一下):
public GameObject prefab;    //声明一个预设,就是和子弹一样的属性
public Transform kong;      //这个空物体主要是用来阐述子弹要跑的位置
public AudioClip shootclick;
public AudioSource shootaudio;
if(EventSystem.current.IsPointerOverGameObject()==false){ //如果鼠标没放在ui物体上,例如背景音乐上if (Input.GetMouseButtonDown (0)) {GameObject reocketclone=Instantiate (prefab, kong.position, prefab.transform.rotation) as GameObject;ShootAudio.clip = ShootClip;ShootAudio.Play ();Destroy (reocketclone, 1f);   // //一秒后销毁这个预设,不然子弹会越来越多,占用内存}}

Instantiate (预设的物体, 预设要跑的位置, 预设的旋转角度);
kong的位置:

以上要点:
预设的使用
input中的属性:如何使物体左右上下移动
如何点击左键就有反应
Instantiate的用法:

AudioClip的用法: 优点是可以任意更换音频

敌人设置

设置一个敌人,以不规则的轨迹运动:

public class EnemyMove : MonoBehaviour {public float MoveSpeed;public float RotateAngle;  //旋转的角度,绕着世界坐标private float RotateTime;  //改变角度的时间// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {transform.Translate (-Vector3.forward * MoveSpeed * Time.deltaTime);RotateTime -= Time.deltaTime;    //时间逐渐减少if(RotateTime<=0){RotateAngle = -RotateAngle;  //旋转的角度就变化,变为原来的负方向RotateTime=1f;}transform.Rotate (Vector3.up * RotateAngle * Time.deltaTime,Space.World);}
}

增加碰撞检测

1 首先给两个物体添加碰撞器 Box碰撞器不是很真实,但是节约系统。
我给子弹和敌人都添加上碰撞器。

勾选Is Trigger的意思是可以穿过物体

注意子弹是一个预设,设置完必须勾选上,然后apply才起作用:

2 给其中一个物体设置刚体(必须有刚体才能碰撞),路径和上面差不多

3 有了碰撞器和刚体之后才能写代码,这个是系统可以自动测定的碰撞检测代码,参数很重要,没有这个参数那么这就是一个普通函数。

void OnTriggerEnter(Collider col){}

给子弹设置威力,给敌人设置生命。

1 首先给子弹设置威力,到时候在前台写上。

2 给敌人设置生命,并且每遇到子弹生命值就减少。

 public float EnemyLife;   //设置一下敌人的生命值//声明一个爆炸粒子// Use this for initializationvoid Start () {}void OnTriggerEnter(Collider col){if (col.transform.name.Equals ("rocket(Clone)")) {   //如果穿过的物体是子弹//先获取子弹的脚本,这个很重要,因为我有点不理解为啥可以之直接用RocketsSelfMove这个我的脚本名称,这里好像是给它起了个别名RocketsSelfMove RSM=col.transform.GetComponent<RocketsSelfMove>();EnemyLife = EnemyLife - RSM.RocketPower; //使用这个脚本中的某个值,}if (EnemyLife <= 0) {  //如果没生命了Destroy (gameObject);      //将自身消失}}

3 添加爆炸效果,爆炸效果其实是一个自带的粒子,当敌人生命值为0的时候,爆炸粒子在敌人的位置克隆一下然后消失。

//声明一个爆炸粒子public GameObject explosion_scene;if (EnemyLife <= 0) {//要复制的东西,敌人的位置,旋转的角度Instantiate (explosion_scene, transform.position, transform.rotation);Destroy (gameObject);      //将自身消失}

注意拖拽的时候要拖拽下面文件夹中的文件:因为每次消失都需要克隆,克隆不能用上面的文件,我的理解是和子弹差不多,预设。

每次爆炸完,爆炸粒子会自动销毁:

设置可以发射追踪弹的敌人

1 首先设置一个敌人,这个敌人可以缓慢向前开并且可以发射子弹。
1.1 给敌人设置速度
1.2 给子弹设置速度,克隆时候的位置(建立一个空物体在敌人头上),子弹生成时候的角度。

2 追踪子弹的设置,首先追踪子弹要用到这个函数:
transform.LookAt(),这个函数的要点是轴和前进方向要一致。

但是我们的子弹是反方向的。

我们建立一个父物体完全替代这个子弹本身(包括碰撞器/脚本所有属性/预设等等),这样就保持了前进方向和轴是一直的,就可以用lookat函数了。

3 代码:

public class Enemy2Move : MonoBehaviour {//这里的问题是要使子弹追踪玩家,追踪的前提是轴的正方向是前进的方向?public float MoveSpeed;public GameObject Fatherocket2;          //真实的子弹的父物体(完全替代子弹)public Transform kong;   //空物体,在敌人2头上,用来作为生成子弹的位置。private float rocket2Time;void Start () {//kong = transform.Find ("kong"); //可以用拖的方式}void Update () {transform.Translate (-Vector3.forward * Time.deltaTime * MoveSpeed);  //往前走rocket2Time-=Time.deltaTime;if (rocket2Time <= 0) {//重点理解一下instantiate函数,第一个变量只是一个物体,这个物体只要设置好形状就可以,放哪都行//第二个变量是生成时候产生的位置,所以把空物体放在敌人2头上,每个子弹都是由敌人二发射。//第三个是设置产生时候的角度,这个只要角度正确,用谁的角度都可以。GameObject rocket2clone=(GameObject)Instantiate(Fatherocket2,kong.position,kong.rotation);//追踪弹GameObject playerObj = GameObject.Find ("Player");  //追踪什么物体? Player。rocket2clone.transform.LookAt (playerObj.transform); //用transform.LookAt来追踪 //多少秒发一颗子弹rocket2Time = 1.0f;}}
}

上面这个内容有点难理解,要多实践几遍。

自动生成敌人

这个本质就是在合适的地方复制敌人,只需要把现在设置的敌人预设就可以。控制一个时间来生成,代码如下:
另外可以用一下标记空物体的知识:

public class CrateEnemy : MonoBehaviour {public GameObject EnemyPrefab;public float createtime;void Start(){}void Update () {//自动生成敌人,每隔几秒,就复制一个敌人在生成处。createtime -= Time.deltaTime;if (createtime <= 0) {createtime = Random.Range (5, 10);Instantiate (EnemyPrefab, transform.position, EnemyPrefab.transform.rotation);}}//用来在这个地方生成一个标记,secne视图中显示//图片必须放在Assets中的Gizmos中void OnDrawGizmos(){Gizmos.DrawIcon (transform.position, "item");}
}

计算分数–实例化

实例化是什么我具体还不太理解,但是过程很简单。
首先创建一个空物体叫GameManager,相关的代码如下:

public class GameManager : MonoBehaviour {public static GameManager Instance;   //声明静态实例public Text crrentScoreTxt;public int currentScore;// Use this for initializationvoid Start () {Instance = this;           //实例化的是当前物体currentScore = 0;}// Update is called once per framepublic void AddScore(int score){     //如此一来其他地方便可以调用函数,并把值传到这里来currentScore += score;crrentScoreTxt.text = currentScore.ToString ();}
}

其他地方如何调用:

if (EnemyLife <= 0) {Instantiate (explosion_scene, transform.position, transform.rotation);GameManager.Instance.AddScore (Score1);         //用这个句型调用。Destroy (gameObject);      //将自身消失}

暂停和模糊效果

将模糊效果拖到相机下面。


逻辑:如果玩家死了,游戏暂停,Blur勾上;
代码:

if (PlayerLife <= 0 ) {//复制到玩家身上,默认旋转Instantiate (explosion_scene, transform.position, transform.rotation); //爆炸效果Destroy (gameObject);  //自己消失Time.timeScale=0;   //游戏暂停  ..如果Time.timeScale=0.5,则时间减慢一半。Camera.main.GetComponent<Blur>().enabled=true;  //让bulr生效}

重点:Time.timeScale&&Camera.main.GetComponent().enabled

其他功能:

另外我还加了血条/倒计时和一些音效。原理之前都学过,下面是一些注意点:
血条得话要把Slider的结构弄成这样:

并且Fill和Fill Area这里都为0:

代码:

public Slider HP;
//使用:
public void BloodChange(int Power){HP.value = HP.value - (Power * 0.01f);}

将做好的游戏导出


Unity_4飞机大战小游戏项目相关推荐

  1. python 飞机大战小游戏

    飞机大战小游戏,这里需要下载pygame模块 这是需要的素材,需要的自取: 上代码: import time import pygame from pygame.locals import *#检测事 ...

  2. 点击list view中一行内容可以在combox中显示_java版飞机大战小游戏详细教程(零基础小白也可以分分钟学会!)...

    一:游戏展示 飞机大战小游戏我们都玩过,通过移动飞机来打敌机,这里给大家展示一下游戏成果:呜呜呜由于gif只能上传5M大小,所以就不能给大家展示操作了,如果大家有兴趣可以自己自己做出来再玩哟. 这里面 ...

  3. 飞机大战小游戏(超详细)

    偷学Python之最后的项目二:飞机大战小游戏(超详细) 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志.--苏轼 甜甜先说 这次用Python中的pygame模块来完成一个飞机大战的小游戏:基本思 ...

  4. matlab飞机大战小游戏(第二版)

    第一版链接:https://blog.csdn.net/slandarer/article/details/88025006 游戏截图: ------------------------ 游戏动图: ...

  5. 使用小程序制作一个飞机大战小游戏

    此文主要基于微信小程序制作一个飞机大战小游戏,上手即用,操作简单. 一.创建小程序 二.页面实现 三.代码块 一.创建小程序 访问微信公众平台,点击账号注册. 选择小程序,并在表单填写所需的各项信息进 ...

  6. C语言—飞机大战小游戏

    哈工大经典C语言大作业-飞机大战小游戏,源码如下,已经通过编译获得评分19+ (满分20)当时还是太菜了呜呜呜. 可以给大家参考一下,好像本来是加了音乐的,但是你们可能没有对应的音乐MP3文件,所以如 ...

  7. 基于Java语言在窗体上实现飞机大战小游戏

    全套资料下载地址:https://download.csdn.net/download/sheziqiong/85594271 项目介绍 飞机大战:用 Java 语言在窗体上实现飞机大战小游戏,运行程 ...

  8. js实现飞机大战小游戏

    用JavaScript来实现一个鼠标指针控制的飞机大战小程序,效果图如下. 1.进入页面阶段 2.第二载入阶段效果图 3.第三核心阶段 4.第四暂停阶段 5.第五结束阶段 实现这个项目的HTML代码只 ...

  9. 【Java代码实现飞机大战小游戏】简单理解

    飞机大战 飞机大战小游戏历经10天完成,主要用到的就是我们面向对象部分的知识:类,封装,继承,多态,静态代码块等等内容+swing部分内容.所以即使你是java小白,也不用担心欧! 游戏说明:游戏有3 ...

最新文章

  1. UITableView注意点
  2. JavaScript 中遍历对象的属性
  3. delayqueue_在DelayQueue中更改延迟,从而更改顺序
  4. 计算机开机引导的结果是,电脑开机显示引导媒体是怎么回事
  5. Win7系统关闭兼容性选项的方法
  6. php 几秒后返回,php计算两个时间差并返回差多少天、时、分、秒
  7. python改变数组元素排序
  8. 孩子忽悠家长充值?腾讯游戏在人脸识别中加入语音提醒
  9. 征集 | AAAI 2021线下论文预讲会讲者征集
  10. Codeforces 19E 树上差分
  11. Android之调试打印
  12. Java 方法重载简单小例子
  13. 微信小程序怎么做【零基础教程附源码】
  14. 使用seaborn绘制热图
  15. Jenkins流水线部署java项目
  16. oracle10gwin,win10肿么彻底卸载oracle10g
  17. 造成BGA焊接不良问题有哪些?
  18. c35是什么意思_混凝土c25、c30、c35分别代表什么意思?
  19. oracle nbu异机恢复,通过NBU进行Oracle异机恢复的实验操作步骤
  20. ZOJ 3964 Yet Another Game of Stones (博弈)

热门文章

  1. 数据结构期末考试试题总结
  2. 一种Flutter上传图片到阿里OSS的方式
  3. 看《中国合伙人》有感
  4. 关于JAVA中的可变形参(多个参数)
  5. 史上最详细的APP统计工具解析
  6. 双语||美国独立宣言全文(中英文对照)
  7. aarch64-linux-android-gcc交叉编译android 64位动态库
  8. .NET-7.WPF学习2. 知识总结
  9. Centos用gosu安装
  10. adb命令——基础系统类命令 ——安装apk程序以及卸载——adb shell pm命令查询...