unity3d入门教程八-飞机大战

unity3d入门教程八-飞机大战

  • 19.2竖屏设置
  • 19.3主控脚本
  • 19.4制作子弹
  • 19.5制作飞机
  • 19.6制作怪物
  • 19.7击中目标
  • 19.8随机生成怪物
  • 19.9预制体怪物随机更换头像
  • 19.10怪物相关优化
  • 19.11游戏背景
  • 19.12游戏最终优化
    • 一、 HP显示
    • 二、怪物预制体
    • 三、分值显示
    • 四、背景音乐

19.2竖屏设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

切换到 Game 窗口,修改分辨率
在这里插入图片描述

点加号,
在这里插入图片描述

Type : 选择 Aspect Ration ( 长宽比 )
Width & Height : 设为 9 : 16

点 OK 即可
在这里插入图片描述

19.3主控脚本

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主控脚本优先级暂时不设置了

设置帧率等,全局性,运行一次即可的放在主控脚本中即可
在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyGame : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Application.targetFrameRate = 60;}// Update is called once per framevoid Update(){}
}

19.4制作子弹

在这里插入图片描述

子弹制作过程和16章是相同的制作成预制体,让其不断的发射子弹
可以详细看到第16章
在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyBullet : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//transform.localPosition = new Vector3(0, 1.0f, 0);}// Update is called once per framevoid Update(){//另其向上移动float step = 1.8f * Time.deltaTime;transform.Translate(0, step, 0, Space.Self);//判断子弹的对象是否超出视野,若超出,则销毁Vector3 sp = Camera.main.WorldToScreenPoint(transform.position);if (sp.y > Screen.height){GameObject.Destroy(this.gameObject);}}
}

在这里插入图片描述

19.5制作飞机

和16张相同,可以参照16章
在这里插入图片描述
在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class myjet2 : MonoBehaviour
{//预制体资源 ‘子弹’public GameObject myPrefab;//定时private float interval = 0.4f;//计时,每个0.4秒发射一颗子弹private float count = 0;// Start is called before the first frame updatevoid Start(){Application.targetFrameRate = 60;}// Update is called once per framevoid Update(){如果鼠标按下就发射//if (Input.GetMouseButtonDown(0))//{//    Fire();//}//计时,每个0.4秒发射一颗子弹count += Time.deltaTime;if (count >= interval){count = 0;Fire();}//按键响应float step = 2.5f * Time.deltaTime;//若左键被按下(按下的状态是一直按着的,不是按下一次)if (Input.GetKey(KeyCode.LeftArrow)){transform.Translate(-step, 0, 0);}if (Input.GetKey(KeyCode.RightArrow)){transform.Translate(step, 0, 0);}}//发射开火子弹private void Fire(){//Instantiate方法可以将预制体资源创建为一个objectGameObject bullet = Instantiate(myPrefab);bullet.transform.position = transform.position + new Vector3(0, 1f, 0);//创建位置放在飞机的上方bullet.name = "bullet";//更改创建的实例的名称}
}

在这里插入图片描述

19.6制作怪物

在这里插入图片描述

怪物图片是一张大图,需要切割获得,具体可参考6.2节
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Monster脚本如下,怪物只进行向下移动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class monster : MonoBehaviour
{public float speed = 1.0f;      //定义移动速度// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){float dy = speed * Time.deltaTime;transform.Translate(0, -dy, 0);     //向下移动}
}

在这里插入图片描述

其实怪物也是一个模板,一个预制体了,后面要将其转换成预制体

19.7击中目标

击中目标时的处理

飞机发射子弹,怪物子弹下降

子弹击中怪物的时候应该将其怪物消灭

需要给子弹加入刚体组件和碰撞组件
在这里插入图片描述
在这里插入图片描述

给怪物添加刚体组件和碰撞组件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Player是默认存在的,不要额外添加标签
在这里插入图片描述

在这里插入图片描述

此时游戏中的tag都设置好了,这样就可以通过标签来判断对方身份,接着进行碰撞检测函数了

在子弹的对象脚本组件中加入碰撞检测函数进行碰撞的判断,实现与怪物的销毁和子弹的销毁
在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyBullet : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//transform.localPosition = new Vector3(0, 1.0f, 0);}// Update is called once per framevoid Update(){//另其向上移动float step = 1.8f * Time.deltaTime;transform.Translate(0, step, 0, Space.Self);//判断子弹的对象是否超出视野,若超出,则销毁Vector3 sp = Camera.main.WorldToScreenPoint(transform.position);if (sp.y > Screen.height){GameObject.Destroy(this.gameObject);}}//设置碰撞事件,发生碰撞时会调用此函数(此为子弹与怪物碰撞时,销毁怪物)private void OnTriggerEnter2D(Collider2D collision){//如果碰撞的物体标签时MOnsterif (collision.tag.Equals("Monster")){Destroy(collision.gameObject);  //销毁子弹碰到的对象即怪物Destroy(this.gameObject);   //销毁子弹本身的对象}}}

在这里插入图片描述

怪物与飞机相撞游戏结束

19.8随机生成怪物

在这里插入图片描述
在这里插入图片描述

随机数 API
value = Random.Range( min, max )
定时器 API
InvokeRepeating ( method, delay, interval )

将怪物作成预制体,且其出现位置是随机的

在这里插入图片描述

要将预制体拖到右侧的怪物控制脚本中

所有怪物控制代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MonsterCtr : MonoBehaviour
{public GameObject monsterPrefab;// Start is called before the first frame updatevoid Start(){InvokeRepeating("CreateMonster", 0.1f, 2f);    //定时调用CreateMonster函数,第一次在0.1秒后,每个2秒出现一次}// Update is called once per framevoid Update(){}void CreateMonster(){float x = Random.Range(-2, 2);  //根据屏幕实际宽度float y = 5;                    //GameObject monster = Instantiate(monsterPrefab);    //通过预制体创建怪物对象monster.transform.position = new Vector3(x, y, 0);  //设置出现的位置}
}

19.9预制体怪物随机更换头像

在这里插入图片描述

之前随机生成预制体怪物可以了,此时需要更改一下怪物控制脚本进行
在这里插入图片描述

在这里插入图片描述

上方图片数组为6个
在这里插入图片描述

所有代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MonsterCtr : MonoBehaviour
{public GameObject monsterPrefab;public Sprite[] images;     //用于接收各个怪物图片// Start is called before the first frame updatevoid Start(){InvokeRepeating("CreateMonster", 0.1f, 2f);    //定时调用CreateMonster函数,第一次在0.1秒后,每个2秒出现一次}// Update is called once per framevoid Update(){}void CreateMonster(){float x = Random.Range(-2, 2);  //根据屏幕实际宽度float y = 5;                    //GameObject monster = Instantiate(monsterPrefab);    //通过预制体创建怪物对象monster.transform.position = new Vector3(x, y, 0);  //设置出现的位置int index = Random.Range(0, images.Length); //范围在int类型,不包含最后数SpriteRenderer renderer = monster.GetComponent<SpriteRenderer>();renderer.sprite = this.images[index];       //渲染预制体的图像}
}

在这里插入图片描述

19.10怪物相关优化

自动分割的怪物大小不一致,需要将其宽度变为一致,高度角不管了
在这里插入图片描述

修改monsterctr
在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MonsterCtr : MonoBehaviour
{public GameObject monsterPrefab;public Sprite[] images;     //用于接收各个怪物图片// Start is called before the first frame updatevoid Start(){InvokeRepeating("CreateMonster", 0.1f, 2f);    //定时调用CreateMonster函数,第一次在0.1秒后,每个2秒出现一次}// Update is called once per framevoid Update(){}void CreateMonster(){float x = Random.Range(-2, 2);  //根据屏幕实际宽度float y = 5;                    //GameObject monster = Instantiate(monsterPrefab);    //通过预制体创建怪物对象monster.transform.position = new Vector3(x, y, 0);  //设置出现的位置//随机选择一个头像int index = Random.Range(0, images.Length); //范围在int类型,不包含最后数SpriteRenderer renderer = monster.GetComponent<SpriteRenderer>();renderer.sprite = this.images[index];       //渲染预制体的图像//头像的大小设置为100PX(宽度)Sprite sprite = this.images[index]; //图像的实际宽度获取float imgWidth = sprite.rect.width; //缩放比列(宽度总是设置为100个像素即一个单位)float scale = 100 / imgWidth;       //(宽度总是设置为100个像素即一个单位)monster.transform.localScale = new Vector3(scale, scale, scale);    //设置实际怪物物体宽度等比例缩放}
}

在这里插入图片描述

此时怪物自动被销毁,就不会额外消耗资源了

要将飞出边界的怪物对象进行销毁,修改monster

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class monster : MonoBehaviour
{public float speed = 1.0f;      //定义移动速度// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){float dy = speed * Time.deltaTime;transform.Translate(0, -dy, 0);     //向下移动//怪物飞离开屏幕下边界,则销毁该怪物Vector3 sp = Camera.main.WorldToScreenPoint(transform.position);    //获取世界坐标系转换为屏幕坐标,左下角坐标0if (sp.y < 0){Destroy(this.gameObject);   //销毁此怪物对象}}
}

19.11游戏背景

使用一张图像作为游戏背景

注意图片的高度,最好和相机匹配

高度10个格,图片应为1000像素,而宽度不固定是需要和宽高比的,要多宽一些
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

还需要让背景图片进行滚动
即需要两张背景图

复制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在脚本中设置背景图初始位置

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class BackgroundCtr : MonoBehaviour
{Transform bg1;Transform bg2;public float speed = 1.0f;// Start is called before the first frame updatevoid Start(){bg1 = GameObject.Find("/背景/bg1").transform;     //获取bg2 = GameObject.Find("/背景/bg2").transform;//设置bg12的初始位置bg1.position = new Vector3(0, 0, 0);bg2.position = new Vector3(0, 10, 0);}// Update is called once per framevoid Update(){float dy = speed * Time.deltaTime;bg1.Translate(0, -dy, 0);               //向下移动背景bg2.Translate(0, -dy, 0);//当第一个背景移出主摄像机的范围时,将其移动到第二个背景上方,依次循环// 交替时,显式的设置位置,以清除float累计误差if (bg1.position.y <= -10){//bg1.Translate(0, 20, 0);    bg1.position = new Vector3(0, 10, 0); // 交替时,显式的设置位置,以清除float累计误差bg2.position = new Vector3(0, 0, 0); }if (bg2.position.y <= -10){//bg2.Translate(0, 20, 0);bg1.position = new Vector3(0, 0, 0); // 交替时,显式的设置位置,以清除float累计误差bg2.position = new Vector3(0, 10, 0);}}
}

19.12游戏最终优化

怪物有分值,不同次数才能急啥一个怪物,还有得分显示
在这里插入图片描述

一、 HP显示

在怪下的上方,添加HP显示。
在这里插入图片描述

(1) 准备素材
在这里插入图片描述

细节:把hpvalue的pivot修改为 Left Center ,即靠左。

(2) 套2个子节点,模拟一个百分比进度条的效果
在这里插入图片描述

hp节点:背景
value节点,红色的前景,用以表示百分比。

(3) 在Monster.cs中,添加 SetHealth()方法。通过修改子节点的scale,来实现百分比的效果。
在这里插入图片描述

二、怪物预制体

在这里插入图片描述

根节点 ‘怪物’ 是一个空物体。下挂 animal 为实物图片,hp为血条。
虽然 ‘怪物’ 是一空物体,但可以挂载 Monster.cs / Rigidbody 2D / Box Collider 2D 。

注意,也要给 Box Collider 2D 指定碰撞范围

在这里插入图片描述
在这里插入图片描述

三、分值显示

在这里插入图片描述

这个是UI 技术,参考 22、23、24章的技术。
(1) 添加UI
在这里插入图片描述

(2) 在 Canvas 上添加一个 GameUI.cs 脚本
在这里插入图片描述

在 GameUI.cs 里,添加一个更新分值 显示 的方法
在这里插入图片描述

四、背景音乐

背景音乐的使用,参考第20章。背景音乐放在 Audio目录下。

把MP3音乐挂载到 游戏主控 节点下。如图所示。
在这里插入图片描述

五、分值规则
每个怪物的价值不等,1-5之间。如果一个怪物价值为5,则击杀后,得5分。

怪物的价值 在 Monster.Start() 里随机指定。
在这里插入图片描述

当怪被命中时,HP减1,如果HP降为0则标识该怪物被杀死。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146163.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙媒体开发系列08——AudioCapturer录制音频

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、概述 我们在鸿蒙媒体开发系列07——AVRecorder音频录制中我们了解到&#xff0c…

【后端开发】JavaEE初阶—线程的理解和编程实现

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解多线程的知识哟~~~&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;【后端开发】JavaEE初阶——计算机是如何工作的&#xff1f;&#xff1f;&#xff1f;-CSDN博客 &#x1f308;感兴趣的小伙…

Linux介绍;Linux安装;Linux常见错误

一&#xff0c;Linux简介 1.1操作系统 指人和计算机硬件沟通交流的平台。 1.2常见的操作系统 1.21 PC windows MacOS Linux 1.22 移动端 Android IOS 鸿蒙 塞班 1.3什么是Linux Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&…

【漏洞复现】泛微OA E-Office jx2_config.ini 敏感信息泄漏漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

buucft hashcat

使用文本编辑器打开时乱码 使用010editor打开发现时xml文档 拷贝到kali&#xff0c;使用binwalk查看&#xff0c;发现时xml文档&#xff0c;改后缀名为ppt。打开发现有密码 Accent OFFICE Password Recovery 64位-Office密码恢复软件 v20.09 免费版 - 下载吧 试试这个Accent O…

飞腾计算模块RapidIO性能测试

1、背景介绍 飞腾计算模块采用FT2000 64核处理器&#xff0c;搭配Tsi721 PCIE转RapidIO芯片&#xff0c;实现飞腾平台下的SRIO数据通信。操作系统采用麒麟信安&#xff0c;内核版本4.19.90. 2、驱动加载 驱动加载部分类似之前写过的X86平台下的RapidIO驱动加载&#xff0c;具…

Ngnix 在windows上的简单使用

安装 下载链接: nginx: download 选择页面中 Stable version 下的windows版本直接下载解压到本地。 运行nginx: 解压到本地后,结构如图: cmd 进入到上图的根目录,运行 start nginx ,即可开启。 打开 http://localhost 进行查看,如果正常打开nginx的测试页面,则说…

借10万块,年化利息明明是3.8%,为啥就变成了2.07%?

今天咱们来聊一聊贷款的奥秘&#xff0c;特别是那个令人爱恨交织的年利率。听起来直观得很&#xff0c;3.8%就像是每年给银行支付贷款总额的3.8%作为利息&#xff0c;但实际上&#xff0c;这里面的学问挺深的。有时候&#xff0c;名义上的3.8%年化&#xff0c;最终一算&#xf…

电子元器件之MOS管,附上几个常用MOS管电路和仿真。

MOS管是一种常用的电子元器件。 1.MOS管的类别 MOSFET简称MOS&#xff0c;是一种绝缘栅型场效应管。按照类别可以分为增强型mos管和耗尽型mos管。 导电沟道的形成方式‌ 增强型MOS管&#xff1a;在没有外加电压时&#xff0c;源极和漏极之间没有导电沟道存在。只有当栅极电…

打开Anaconda Navigator没反应,卡在Initializing...的解决方案

一、问题描述 打开Anaconda Navigator时&#xff0c;一直卡在Initializing...没反应&#xff0c;如下图所示&#xff1a; 二、解决方案 进入Anaconda安装目录下找到并打开文件夹attribution&#xff08;笔者Anaconda安装目录在D盘下&#xff0c;读者可自行查找自己安装目录中…

基于stm32物联网身体健康检测系统

在当今社会&#xff0c;由于经济的发展带来了人们生活水平不断提高&#xff0c;但是人们的健康问题却越来越突出了&#xff0c;各种各样的亚健康随处可在&#xff0c;失眠、抑郁、焦虑症&#xff0c;高血压、高血糖等等侵袭着人们的健康&#xff0c;人们对健康的关注达到了一个…

超越极限!Qwen2.5 助力多领域智能应用

前沿科技速递&#x1f680; 近日&#xff0c;Qwen2.5 系列重磅发布&#xff0c;成为开源语言模型领域的又一里程碑。作为一款全新的通用语言模型&#xff0c;Qwen2.5 在支持自然语言处理的基础上&#xff0c;还在编程、数学等领域进行了专项优化。Qwen2.5 模型支持长文本生成&a…

2024年中国研究生数学建模竞赛D题“大数据驱动的地理综合问题”全析全解

问题一解答&#xff1a;降水量与土地利用/土地覆被类型的时空演化特征描述 1. 降水量的描述性统计方法 降水量是一个连续变化的变量&#xff0c;可以通过以下几种描述性统计方法进行时空演化特征的总结&#xff1a; 平均降水量&#xff1a;统计中国范围内1990至2020年各年份的…

初步认识C++模版

前言 在C语言中&#xff0c;我们知道函数的形参需要指定类型&#xff0c;但是在C中&#xff0c;我们可以模版实现各种类型参数的通用函数。 1. 泛型编程 我们通过函数重载实现多种类型的同一作用的函数。如交换函数&#xff1a; void Swap(int& left, int& right) …

linux下将txt转成xlsx

在Linux环境下&#xff0c;可以使用Python的pandas库将TXT文件转换为Excel文件。以下是一个简单的示例代码&#xff1a; 首先&#xff0c;确保安装了pandas和openpyxl库&#xff1a; pip install pandas openpyxl 然后&#xff0c;使用以下Python脚本将TXT文件转换为Excel文件…

基于单片机汽车驾驶防瞌睡防疲劳报警器自动熄火设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…

项目第四弹:交换机、队列、绑定信息管理模块分析与代码实现

项目第四弹&#xff1a;交换机、队列、绑定信息管理模块分析与代码实现 一、模块设计分析1.模块划分2.功能需求 二、交换机模块的实现1.交换机结构体的实现2.交换机持久化管理模块的实现3.交换机对外管理模块实现声明、删除交换机时的查找不能复用exists函数为何持久化管理模块…

查找算法 01分块查找

自己设计一个分块查找的例子&#xff0c;不少于15个数据元素&#xff0c;并建立分块查找的索引 基于上述例子&#xff0c;计算查找成功的ASL、查找失败的ASL 拓展&#xff1a; ‌‌分块查找的平均查找长度&#xff08;‌ASL&#xff09;的计算公式如下‌&#xff1a;‌ ‌顺序…

ESP32 JTAG 调试

前言 个人邮箱&#xff1a;zhangyixu02gmail.com本人使用的是 Ubuntu 环境&#xff0c;采用 GDB 方式进行调试。对于新手&#xff0c;我个人还是建议参考ESP32S3学习笔记&#xff08;0&#xff09;—— Vscode IDF环境搭建及OpenOCD调试介绍进行图形化的方式调试。如果是希望在…

占领矩阵-第15届蓝桥省赛Scratch中级组真题第5题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第190讲。 如果想持续关注Scratch蓝桥真题解读&#xff0c;可以点击《Scratch蓝桥杯历年真题》并订阅合集&#xff0c;…