unity 简易太空大战

news/2024/11/22 17:57:00/

一、太空大战需求
1、背景
2、角色
我方飞机、敌方飞机、敌方陨石、子弹
3、功能:
(1).背景
a.循环滚动
(2).我方飞机
a.键盘控制移动
b.鼠标左键发射子弹
c.生命功能,碰到敌机及子弹,陨石扣生命值
(3).敌方陨石
a.程序启动3秒后随机克隆3个,然后每个6秒克隆3个
b.陨石自身旋转并向下移动
d.碰到我方子弹,飞机或边缘碰撞器自动销毁
(4).敌方飞机
a.程序开启,每隔8秒随机克隆3个
b.每隔1秒自动发射子弹
c.被我方子弹击中或我方飞机触碰,摧毁
d.碰到边缘碰撞器摧毁
e.自动向前方向移动
(5)、子弹
a.子弹移动
b.子弹碰到敌机,陨石,我方飞机,边缘触发器就摧毁
3.特效
(1).我方飞机尾部喷射特效
(2).发射子弹有声音播放
(3).摧毁伴随爆炸声音以及爆炸特效
4、技术(基于unity开发)
(1)键盘事件
(2)鼠标事件
(3)克隆、销毁
(4)协程
(5)碰撞检测
(6)音频
(7)Mathf类、Transform类、Time类、GameObject类、Vector3类、Random类

二、场景
1、背景
通过两个Quad拼接而成
在这里插入图片描述
Quad由两个三角形拼成的四边形,当场景对象被作为简单显示图片或者影片的屏幕时,使用Quad时很合适的。然后添加太空图片。
在这里插入图片描述
2、边缘碰撞器
新建一个Cube,将除Transform以外的组件全部移除,然后添加Box Collider碰撞组件,点击Edit Collider修改绿色框框的大小,形成边缘碰撞器(别忘记勾选Is Trigger(触发器))
在这里插入图片描述
3、角色
在网上找素材。

三、代码部分
(由于初学,没有私有,所以很多东西都是拖拽的)
1、背景循环滚动

public float speed = 5;//速度
private Vector3 startPos;//初始位置
void Start () 
{startPos = transform.position;
}
void Update ()
{
//背景滚屏效果
float pos = Mathf.Repeat(speed*Time.time,30);
transform.position =startPos+ Vector3.back*pos;
}

(a)、Mathf.Repeat:重复
在这里插入图片描述
循环数值t,0到length长度之间,t的值永远不会大于length的值,也永远不会小于0。

(b)、Time.time:时间
在这里插入图片描述
本帧开始的时间(只读)。这是以秒为单位的时间,从游戏开始。
2、玩家
(1)、玩家移动,射击

public float speed = 10;//移动速度
public GameObject playerBullet;//玩家子弹预设体
public Transform point;//子弹发射位置
private float shotSpace = 0.25f;//发射子弹间隔
private float nextShot;//下次射击时间
void Update () 
{
Move();
Fire();
}
/// <summary>
/// 玩家移动
/// </summary>
void Move()
{
float h = Input.GetAxis("Horizontal");//水平
float v = Input.GetAxis("Vertical");//垂直
Vector3 pos = new Vector3(h,0,v);
transform.Translate(pos*Time.deltaTime*speed);
//x:-6.7 6.7 z:-13 10(该项目的范围)
//限制飞机飞行范围
float x = Mathf.Clamp(transform.position.x,-6.7f,6.7f);
float z = Mathf.Clamp(transform.position.z,-11.5f,12f);
transform.position = new Vector3(x,transform.position.y,z);}
/// <summary>
/// 玩家射击
/// </summary>
void Fire()
{
//每个0.25秒发射一颗子弹
if (Input.GetMouseButtonDown(0) && Time.time>nextShot){nextShot = Time.time + shotSpace;//克隆子弹Instantiate(playerBullet,point.position,Quaternion.identity);			}
}

(a)、Mathf.Clamp:限制范围
在这里插入图片描述
限制value的值在min,max之间。
(2)、玩家子弹移动,触碰边缘碰撞器摧毁

public float speed = 5f;
void Update () {transform.Translate(Vector3.forward*Time.deltaTime*speed);
}/// <summary>/// 子弹碰到边框摧毁(采用触发器)/// </summary>/// <param name="c"></param>
void OnTriggerExit(Collider c){//注意要手动设置标签(边缘碰撞器)if (c.gameObject.CompareTag("Border")){Destroy(gameObject);		}}//用OnTriggerExit的原因子弹一直碰撞盒子内,只有当离开盒子碰撞器的时候消失

3、游戏管理部分

    public GameObject[] asteroids;//陨石(3种)public GameObject gameOverPanel;//游戏结束界面public Text hpTxt, scoreTxt;//记录玩家生命,分数文本public int hp = 3, score = 0;public GameObject enemyShip;//敌机//Unity单例模式public static GameManage instance;void Start(){instance = this;//协程 克隆陨石和敌机StartCoroutine(Clone());StartCoroutine(CloneEnemyShip());gameOverPanel.SetActive(false);}/// <summary>/// 克隆陨石/// </summary>/// <returns></returns>IEnumerator Clone(){yield return new WaitForSeconds(3f);for (int i = 0; i < 3; i++){int index = Random.Range(0, asteroids.Length);int x = Random.Range(-6, 6);int z = Random.Range(10, 12);Instantiate(asteroids[index], new Vector3(x, 0.168f, z), Quaternion.identity);}while (true){yield return new WaitForSeconds(6);for (int i = 0; i < 3; i++){int index = Random.Range(0, asteroids.Length);float x = Random.Range(-6, 6);float z = Random.Range(10, 14);Instantiate(asteroids[index], new Vector3(x, 0.168f, z), Quaternion.identity);}}}/// <summary>/// 克隆敌机/// </summary>/// <returns></returns>IEnumerator CloneEnemyShip(){while (true){yield return new WaitForSeconds(8f);for (int i = 0; i < 3; i++){int x = Random.Range(-6, 6);int z = Random.Range(10, 12);Instantiate(enemyShip, new Vector3(x, 0.168f, z), Quaternion.Euler(0,180,0));}}}void Update(){hpTxt.text = hp.ToString();scoreTxt.text = score.ToString();if (hp <= 0){Time.timeScale = 0;//游戏暂停gameOverPanel.SetActive(true);}}public void Restart(){Time.timeScale = 1;//游戏重新开始gameOverPanel.SetActive(false);hp = 3;score = 0;SceneManager.LoadScene("Game");}public void Quit(){//跳转场景(要把场景发布一下)//using UnityEngine.SceneManagement;SceneManager.LoadScene("Start");}

4、陨石部分

public GameObject explosion_asteroid;//陨石摧毁特效
public float speed = 5f;
void Update () {transform.Translate(Vector3.back*Time.deltaTime*speed);transform.Rotate(Vector3.forward,1f);
}
void OnTriggerExit(Collider c){if (c.gameObject.CompareTag("Border")){Destroy(gameObject);}}/// <summary>/// 子弹碰到陨石,玩家碰到陨石/// </summary>/// <param name="c"></param>
void OnTriggerEnter(Collider c){if (c.gameObject.CompareTag("PlayerBullet")){Destroy(c.gameObject);Destroy(gameObject);GameObject explosion = Instantiate(explosion_asteroid, c.transform.position, Quaternion.identity);Destroy(explosion, 2);//玩家加分GameManage.instance.score++;}else if (c.gameObject.CompareTag("Player")){Destroy(gameObject);GameObject explosion = Instantiate(explosion_asteroid, c.transform.position, Quaternion.identity);Destroy(explosion, 2);//玩家减血GameManage.instance.hp--;}
}

5、敌机部分

public float speed = 5f;public GameObject EnemyBullet;//敌机子弹public GameObject explosion_enemy;//敌机爆炸特效void Start () {StartCoroutine(Fire());}	void Update () {Move();}void Move(){transform.Translate(Vector3.forward * Time.deltaTime * speed);}IEnumerator Fire(){while (true){yield return new WaitForSeconds(1f);Instantiate(EnemyBullet,transform.GetChild(0).position,Quaternion.identity);}	}/// <summary>/// 敌机碰到边界摧毁/// </summary>/// <param name="c"></param>void OnTriggerExit(Collider c){if (c.gameObject.CompareTag("Border")){Destroy(gameObject);}}/// <summary>/// 敌机碰到玩家及其子弹/// </summary>/// <param name="c"></param>void OnTriggerEnter(Collider c){if (c.gameObject.CompareTag("PlayerBullet")){Destroy(c.gameObject);Destroy(gameObject);GameObject explosion = Instantiate(explosion_enemy, transform.position, Quaternion.identity);Destroy(explosion, 1f);GameManage.instance.score += 10;}else if (c.gameObject.CompareTag("Player")){Destroy(gameObject);GameObject explosion = Instantiate(explosion_enemy, transform.position, Quaternion.identity);Destroy(explosion, 1f);GameManage.instance.hp--;}}

四、演示图
在这里插入图片描述

该项目于Unity 5.6.7版本写的。


http://www.ppmy.cn/news/754368.html

相关文章

流浪地球的终点正是三体人要逃离的地方

智子其实是个弱智&#xff0c;不过就是一个传话筒而已&#xff0c;流浪地球的终点正是三体人要跳出来的火坑&#xff0c;不过在码农看来一切都是渲染出来的…… 大刘的作品全部是黑暗主题&#xff1a;三体人智子弱智刚到地球就被狡猾的地球人忽悠的精神分裂了&#xff1b;倒霉吹…

除了“带地球去流浪”,还有哪些脑洞大开的太空计划?

硅谷Live / 实地探访 / 热点探秘 / 深度探讨 本文授权转载自脑极体&#xff08;ID&#xff1a;unity007&#xff09; 作者&#xff1a;藏狐 大家最近都看了头顶“硬科幻”标签的《流浪地球》吧&#xff1f;最近它收获的不光是漫天彩虹屁&#xff0c;从剧情逻辑到科学细节&#…

人类首次商业载人飞船直播——翻车了?

西雅图IT圈&#xff1a;seattleit 【今日作者】 Powerball选号机 身体和灵魂总有一个要 走在买PowerBall的路上 5月27号原本是航天史上一个重要日子&#xff0c;商业航空公司SpaceX计划在这天首次实现载人飞行&#xff0c;与NASA合作将2名美国宇航员送上太空。 此次发射由Space…

杨洋组织的“太空营救”中,那2小时到底发生了什么?

最近&#xff0c;航天界居然被一部都市爱情剧刷屏了。 在《你是我的荣耀》这部剧中&#xff0c;杨洋饰演的男主于途是一个心怀梦想的航天设计师。在前往西北卫星测控中心抢救JX-1号卫星的剧情里&#xff0c;涉及到了大量的航天专业知识。 当中心领导脱口而出&#xff1a;“赶紧…

马斯克喊你生孩了 太空有UFO吗? 王亚平解密 日本亿万富豪入驻国际空间站

目录 1. 马斯克喊你生孩子了 2.太空有UFO吗&#xff1f;王亚平揭秘 3. 日本亿万富豪入驻国际空间站 1. 马斯克喊你生孩子了 人多力量大&#xff01;这次为“生娃”大声疾呼的是世界首富、创新先锋、特斯拉首席执行官&#xff08;CEO&#xff09;埃隆马斯克。 近日他参加了《…

“我要做太空人”----太空人表盘制作

这里写目录标题 需求准备程序huawei.hhuawei.c 运行图后续 需求 有智能手表的人都知道&#xff0c;前段时间的“太空人表盘”非常火热。那么我们也可以自己动手来制作一款太空人表盘。 准备 Visual Studio 2019EasyX Graphics Library &#xff1a;Visual C 的免费绘图库 程…

未来人类殡葬一览:太空中正飘着上千个骨灰盒

想象一下&#xff0c;以后&#xff0c;夜空中的流星&#xff0c;可能是逝者的骨灰盒在大气层中燃烧...... 25日凌晨&#xff0c;Space X又将发射一颗携带152位死者骨灰的卫星&#xff0c;“参与者”包括了儿童、太空爱好者、科学家、宇航员、作家等。骨灰飞入太空轨道的价格不…

仿生水下航行器

仿生水下航行器 前面介绍的水下航行器的设计&#xff0c;大部分都是螺旋桨推进&#xff0c;虽然目前仍然广泛用于各种成熟的产品或者研发作品中&#xff0c;但是不得不承认的是螺旋桨在水下的推进的效率较低&#xff0c;对水下环境的扰动较大&#xff0c;不利于隐蔽&#xff0c…