【unity之IMGUI实践】游戏结束流程封装实现【七】

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unityUI专题篇
在这里插入图片描述



文章目录

    • 🎶前言
    • 🎶(==A==)关键逻辑梳理
    • 🎶(==B==)需求分析
    • 🎶(==C==)行为实现——血条
    • 🎶(==D==)场景搭建——敌方阵营
    • 🎶(==E==)场景搭建——通关面板
    • 🎶(==F==)行为实现——通关点触发
    • 🎶(==G==)场景搭建——结束面板


🎶前言

在这里插入图片描述


🅰️


🎶(A关键逻辑梳理


在这里插入图片描述


🎶(B需求分析


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


🎶(C行为实现——血条


在这里插入图片描述


😶‍🌫️:步骤实现

  • 1.坐标三个转化
  • 2.GUI的原点和屏幕的原点
  • 3.结构体的特点回顾——涉及Rect_结构体类型
  • 4.血条的显隐
  • 5.倒计时的两个方法
  • 6.近大远小血条的缩放——待

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

血条核心代码

 //GUI生命函数private void OnGUI(){if(showTime >=0) //血条倒计时展示{//简单的倒计时showTime -= Time.deltaTime;//世界坐标转屏幕坐标SreecPosition = Camera.main.WorldToScreenPoint(transform.position);//屏幕坐标转GUI坐标_____GUI的原点在左上角,屏幕坐标原点在左下角SreecPosition.y = Screen.height - SreecPosition.y;//底图Rect位置参数赋值GUIPosition1.x = SreecPosition.x - 50;GUIPosition1.y = SreecPosition.y - 70;GUIPosition1.width = 100;GUIPosition1.height = 15;//血条图Rect位置参数赋值GUIPosition2.x = SreecPosition.x - 50;GUIPosition2.y = SreecPosition.y - 70;//血条长度和血量同步GUIPosition2.width = 100*(nowBlood/maxBlood);GUIPosition2.height = 15;//绘制底图    GUI.DrawTexture(GUIPosition1, underTexture);//绘制血条       GUI.DrawTexture(GUIPosition2, topTexture);}}

更新敌方坦克

______-在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:      
//___________功能:敌方坦克逻辑封装
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class EnemyTank:TankFather 
{//随机移动点的位置数组public  Transform[] randomPosition;//目标位置private Transform target;//目标坦克public Transform Player;//检测范围public float distance = 10f;//子弹发射参数public AudioSource shootMusic;   //发射音效public GameObject shootball;     //发射的子弹类型public float shootSpeed = 1000f; //子弹的速度 public Transform[] shootTransform; //发射的组件信息public bool shootSwitch = false;  private float endTime = 3f;      //子弹发射间隔的时间//血条的参数public Texture underTexture;public Texture topTexture;private Vector3 SreecPosition;private Rect GUIPosition1;private Rect GUIPosition2;public float showTime = 0;private void Start(){//属性初始化赋值maxBlood = 500;nowBlood = 500;attack = 30;HeadSpeed = 50;//射击音效关闭shootMusic.enabled = false;moveSpeed = 10f;//先随机整一个目标点RandomPosition();}private void Update(){    transform.LookAt(target);//始终超自己的正方向移动transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);  //当距离差不多相等时,再随机目标点if(Vector3.Distance(transform .position ,target .position)< 0.5f){RandomPosition();}//范围检测if (Vector3 .Distance(transform .position ,Player.position )<= distance && Player !=null ){//炮口瞄准玩家Head.transform.LookAt(Player);//倒计时发射子弹endTime = Mathf.MoveTowards(endTime, 0, 0.1f);if (endTime <= 0){Fire();endTime = 3f;}        }}//随机指向一个移动点public void RandomPosition(){if (randomPosition.Length != 0)target = randomPosition[Random.Range(0, randomPosition.Length)];}//触发检测private void OnTriggerEnter(Collider other){if (other.gameObject.tag == "bullet" ){//添加子弹挂载的目标坦克,方便获取该子弹的攻击力,与受伤逻辑相结合BulletMove ball = other.gameObject.GetComponent<BulletMove>();TankFather ballTank = ball.Tank.GetComponent<TankFather>();//当子弹不是自己打的到自己身上的时候if (ballTank.tag != gameObject.tag){//扣血Heart(ballTank);}}}public override void Fire(){//开启射击音效shootMusic.enabled = true;shootMusic.Play();for (int i = 0; i < shootTransform.Length ; i++){GameObject ball = Instantiate(shootball, shootTransform[i].position, shootTransform[i].rotation);BulletMove movScript = ball.GetComponent<BulletMove>();Rigidbody shootBall = ball.GetComponent<Rigidbody>();shootBall.AddForce(shootTransform[i].transform.forward * shootSpeed);movScript.Tank = gameObject;  //声明子弹是由谁打出去的}}//死亡行为重写public override void Death(){base.Death();GamePlane.SingleInstance.AddScore(10);}//受伤行为重写public override void Heart(TankFather other){base.Heart(other);showTime = 3; //血条倒计时展示}//GUI生命函数private void OnGUI(){if(showTime >=0) //血条倒计时展示{//简单的倒计时showTime -= Time.deltaTime;//世界坐标转屏幕坐标SreecPosition = Camera.main.WorldToScreenPoint(transform.position);//屏幕坐标转GUI坐标_____GUI的原点在左上角,屏幕坐标原点在左下角SreecPosition.y = Screen.height - SreecPosition.y;//底图Rect位置参数赋值GUIPosition1.x = SreecPosition.x - 50;GUIPosition1.y = SreecPosition.y - 70;GUIPosition1.width = 100;GUIPosition1.height = 15;//血条图Rect位置参数赋值GUIPosition2.x = SreecPosition.x - 50;GUIPosition2.y = SreecPosition.y - 70;//血条长度和血量同步GUIPosition2.width = 100*(nowBlood/maxBlood);GUIPosition2.height = 15;//绘制底图    GUI.DrawTexture(GUIPosition1, underTexture);//绘制血条       GUI.DrawTexture(GUIPosition2, topTexture);}}
}

更新炮台

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:      
//___________功能:敌方坦克逻辑封装
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class EnemyTank:TankFather 
{//随机移动点的位置数组public  Transform[] randomPosition;//目标位置private Transform target;//目标坦克public Transform Player;//检测范围public float distance = 10f;//子弹发射参数public AudioSource shootMusic;   //发射音效public GameObject shootball;     //发射的子弹类型public float shootSpeed = 1000f; //子弹的速度 public Transform[] shootTransform; //发射的组件信息public bool shootSwitch = false;  private float endTime = 3f;      //子弹发射间隔的时间//血条的参数public Texture underTexture;public Texture topTexture;private Vector3 SreecPosition;private Rect GUIPosition1;private Rect GUIPosition2;public float showTime = 0;private void Start(){//属性初始化赋值maxBlood = 500;nowBlood = 500;attack = 30;HeadSpeed = 50;//射击音效关闭shootMusic.enabled = false;moveSpeed = 10f;//先随机整一个目标点RandomPosition();}private void Update(){    transform.LookAt(target);//始终超自己的正方向移动transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);  //当距离差不多相等时,再随机目标点if(Vector3.Distance(transform .position ,target .position)< 0.5f){RandomPosition();}//范围检测if (Vector3 .Distance(transform .position ,Player.position )<= distance && Player !=null ){//炮口瞄准玩家Head.transform.LookAt(Player);//倒计时发射子弹endTime = Mathf.MoveTowards(endTime, 0, 0.1f);if (endTime <= 0){Fire();endTime = 3f;}        }}//随机指向一个移动点public void RandomPosition(){if (randomPosition.Length != 0)target = randomPosition[Random.Range(0, randomPosition.Length)];}//触发检测private void OnTriggerEnter(Collider other){if (other.gameObject.tag == "bullet" ){//添加子弹挂载的目标坦克,方便获取该子弹的攻击力,与受伤逻辑相结合BulletMove ball = other.gameObject.GetComponent<BulletMove>();TankFather ballTank = ball.Tank.GetComponent<TankFather>();//当子弹不是自己打的到自己身上的时候if (ballTank.tag != gameObject.tag){//扣血Heart(ballTank);}}}public override void Fire(){//开启射击音效shootMusic.enabled = true;shootMusic.Play();for (int i = 0; i < shootTransform.Length ; i++){GameObject ball = Instantiate(shootball, shootTransform[i].position, shootTransform[i].rotation);BulletMove movScript = ball.GetComponent<BulletMove>();Rigidbody shootBall = ball.GetComponent<Rigidbody>();shootBall.AddForce(shootTransform[i].transform.forward * shootSpeed);movScript.Tank = gameObject;  //声明子弹是由谁打出去的}}//死亡行为重写public override void Death(){base.Death();GamePlane.SingleInstance.AddScore(10);}//受伤行为重写public override void Heart(TankFather other){base.Heart(other);showTime = 3; //血条倒计时展示}//GUI生命函数private void OnGUI(){if(showTime >=0) //血条倒计时展示{//简单的倒计时showTime -= Time.deltaTime;//世界坐标转屏幕坐标SreecPosition = Camera.main.WorldToScreenPoint(transform.position);//屏幕坐标转GUI坐标_____GUI的原点在左上角,屏幕坐标原点在左下角SreecPosition.y = Screen.height - SreecPosition.y;//底图Rect位置参数赋值GUIPosition1.x = SreecPosition.x - 50;GUIPosition1.y = SreecPosition.y - 70;GUIPosition1.width = 100;GUIPosition1.height = 15;//血条图Rect位置参数赋值GUIPosition2.x = SreecPosition.x - 50;GUIPosition2.y = SreecPosition.y - 70;//血条长度和血量同步GUIPosition2.width = 100*(nowBlood/maxBlood);GUIPosition2.height = 15;//绘制底图    GUI.DrawTexture(GUIPosition1, underTexture);//绘制血条       GUI.DrawTexture(GUIPosition2, topTexture);}}
}

🎶(D场景搭建——敌方阵营


在这里插入图片描述


🎶(E场景搭建——通关面板


_____________在这里插入图片描述

在这里插入图片描述
😶‍🌫️:步骤实现:

  • 1.面板制作
  • 2.数据显示和存储
  • 3.循环开始

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
//-------------------------------------
//—————————————————————————————————————
//___________项目:      
//___________功能:通关面板逻辑相关
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class VictorPlane : BeginFather<VictorPlane>
{public Button Require;  //确认按钮public InputFram name;  //输入的昵称public Label Score;     //显示的分数public Label LTime;      //显示的时间private int time;private void Start(){//添加按钮事件Require.triggerEvent += () => {//点击按钮后跳到主场景SceneManager.LoadScene("BeginScreen");//将数据存储SaveGameData.DataContorl.SaveRankData(name.ContorlContent.text, Convert.ToInt32(Score.ContorlContent.text), time);};//默认隐藏Hidden();}private void Update(){//将光标显示出来Cursor.visible = true;//分数显示Score.ContorlContent.text = GamePlane.SingleInstance.laScore.ContorlContent.text;//时间显示LTime.ContorlContent.text = GamePlane.SingleInstance.laTime.ContorlContent.text;//时间time = GamePlane.SingleInstance.time;}}

🎶(F行为实现——通关点触发


在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:      
//___________功能:  通关触发
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class over : MonoBehaviour
{private void OnTriggerEnter(Collider other){if(other.CompareTag ("Player") ){Time.timeScale = 0;VictorPlane.SingleInstance.Show();}}
}

🎶(G场景搭建——结束面板


在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 死亡显示面板
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class DiedPlane : BeginFather<DiedPlane >
{public Button back;private void Start(){back.triggerEvent += () =>{//点击按钮后跳到主场景SceneManager.LoadScene("BeginScreen");};Hidden();       }
}

相关文章


⭐【2023unity游戏制作-mango的冒险】-6.关卡设计

⭐【2023unity游戏制作-mango的冒险】-5.攻击系统的简单实现

⭐【2023unity游戏制作-mango的冒险】-4.场景二的镜头和法球特效跟随

⭐【2023unity游戏制作-mango的冒险】-3.基础动作和动画API实现

⭐【2023unity游戏制作-mango的冒险】-2.始画面API制作

⭐【2023unity游戏制作-mango的冒险】-1.场景搭建

⭐“狂飙”游戏制作—游戏分类图鉴(网易游学)

⭐本站最全-unity常用API大全(万字详解),不信你不收藏



你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LNMP搭建及论坛搭建

一、LNMP LNMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c; 能够提供动态Web站点服务及其应用开发环境。LNMP是一个缩写词&#xff0c;具体包括Linux操作系统、nginx网站服务器、MySQL数据库服务器、PHP&#xff08;或…

【无标题】uniapp引入萤石云 真机无法运行 踩坑集合

Uniapp 接入萤石云 踩坑 1.先用了 UIKit Javascript 就是在 pc端 那套流程 npm install ezuikit-jsimport EZUIKit from ezuikit-js;这套流程貌似只适用于pc端&#xff0c;我在接入uniapp的时候没看官网 以为都是一套流程&#xff0c;然后就在uniapp中也来了这一套&#xff0…

python与深度学习(十五):CNN和宝可梦模型

目录 1. 说明2. 宝可梦模型2.1 导入相关库2.2 建立模型2.3 模型编译2.4 数据生成器2.5 模型训练2.6 模型保存 3. 宝可梦的CNN模型可视化结果图4. 完整代码5. 宝可梦的迁移学习 1. 说明 本篇文章是CNN的另外一个例子&#xff0c;宝可梦模型&#xff0c;是自制数据集的例子。之前…

快速文件传输常见问题

我们所处的世界充斥着各种信息&#xff0c;能够迅速获得正确的数据往往是企业成功的关键因素。将文件从A点移动到B点需要考虑很多问题&#xff0c;但是当涉及需要在最短时间内送达全球各地收件人的大型关键任务文件时&#xff0c;就不能再使用Dropbox和 Google Drive 等方案了。…

互联网的发展

目录 1.什么是互联网 2.互联网的发展历史 3.中国互联网的发展历程 4.互联网对人们生活的影响 5.互联网给人类带来了哪些负面影响 1.什么是互联网 互联网&#xff08;Internet&#xff09;是一个全球性的计算机网络系统&#xff0c;它连接了数十亿台计算机和其他设备。它是由…

il汇编整数相加

在这里尝试了IL汇编字符串连接&#xff1b; IL汇编字符串连接_bcbobo21cn的博客-CSDN博客 下面来看一下IL汇编整数相加&#xff1b; 大概的看一下一些资料&#xff0c;下面语句&#xff0c; ldc.i4 20 ldc.i4 30 add 看上去像是&#xff0c;装载整数20到一个类似于…

无涯教程-Perl - 面向对象

Perl中的面向对象概念很大程度上基于引用以及匿名数组和哈希。让我们开始学习面向对象Perl的基本概念。 定义类 在Perl中定义一个类非常简单。类以最简单的形式对应于Perl软件包。要在Perl中创建一个类&#xff0c;我们首先构建一个包。 Perl软件包在Perl程序中提供了一个单…

EditPlus取消自动.bak备份

Tools->Preferences->File 将√取消

Vulnhub靶机DC-2 writeup

靶机介绍 靶机介绍&#xff1a;https : //download.vulnhub.com/dc/DC-2.zip ​ 信息搜集 获取IP地址 扫描靶机的IP的方法 1. nmap -sP 192.168.142.0/24 #nmap进行ping扫描发现存活主机 2. arp-scan -l #基于ARP发现内网存活主机 3. netdiscover -r 192.168.142.0/24 -…

qt富文本编辑基本知识(QTextBlockFormat、QTextListFormat)

可以参考该文章&#xff1a;QTextBlockFormat、QTextListFormat - 程序员大本营 核心知识如下&#xff1a; 如果想开发一个富文本编辑器&#xff08;html&#xff0c;markdown等常见格式&#xff09;&#xff0c;Qt已经为用户完成了几乎所有与编辑有关的具体工作&#xff0c;…

uniapp android底部弹框

uniapp android底部弹框&#xff0c;带有动画效果 <view class"popup_box"><view class"bottom_more" click"handleClickCancel"><image src"/static/images/rescue/icon_more.png"></image></view><…

AutoDL从0到1搭建stable-diffusion-webui

前言 AI绘画当前非常的火爆&#xff0c;随着Stable diffusion&#xff0c;Midjourney的出现将AI绘画推到顶端&#xff0c;各大行业均受其影响&#xff0c;离我们最近的AI绘画当属Stable diffusion&#xff0c;可本地化部署&#xff0c;只需电脑配备显卡即可完成AI绘画工作&…

Git常见问题

git clone 提示OpenSSL SSL_read git clone 时提示Connection was reset, errno 10054类错误 fatal: unable to acce ss https://github.com/fex-team/ueditor.git/: OpenSSL SSL_read: Connection was reset, errno 10054 备注&#xff1a;以下方法只是归纳整理&#xff0c;…

使用事件侦听器和 MATLAB GUI 查看 Simulink 信号研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

仓库管理系统有哪些功能,如何对仓库进行有效管理

阅读本文&#xff0c;您可以了解&#xff1a;1、仓库管理系统有哪些功能&#xff1b;2、如何对仓库进行有效管理。 仓库是制造业的开端&#xff0c;原材料的领料开始。企业的仓库管理是涉及企业生产、企业资金流和企业的经营风险的关键环节。在众多的工业企业、制造型企业、贸…

Linux 安装软件 - yum工具

在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行…

FFmpeg下载安装及Windows开发环境设置

1 FFmpeg简介 FFmpeg&#xff1a;FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。项目的名称来自MPEG视频编码标准&#xff0c;前面的"FF"代表…

mysql函数及用法

目录 一、前言 二、函数 2.1五大聚合函数 2.2 日期函数 3.字符串函数 三. 总结&#xff1a; 一、前言 mySQL 是一种常见的关系型数据库管理系统&#xff0c;提供了大量的函数可以帮助开发者有效地操作和管理数据库。mySQL根据这些函数将数据更好的进行操作&#xff0c;从…

《向量数据库》——怎么安装向量检索库Faiss?

装 Faiss 以下教程将展示如何在 Linux 系统上安装 Faiss: 1. 安装 Conda。 在安装 Faiss 之前,先在系统上安装 Conda。Conda 是一个开源软件包和环境管理系统,可在 Windows、macOS 和 Linux 操作系统上运行。根据以下步骤在 Linux 系统上安装 Conda。 2. 从官网…

Python:Spider爬虫工程化入门到进阶(1)创建Scrapy爬虫项目

Python&#xff1a;Spider爬虫工程化入门到进阶系列: Python&#xff1a;Spider爬虫工程化入门到进阶&#xff08;1&#xff09;创建Scrapy爬虫项目Python&#xff1a;Spider爬虫工程化入门到进阶&#xff08;2&#xff09;使用Spider Admin Pro管理scrapy爬虫项目 本文通过简…