【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;或…

【Linux】 Dockerfile Tomcat部署

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Dockerfile Tomcat部署 构建SSH镜像Systemctl镜像nginx镜像tomcat 镜像mysql镜像 构建SSH镜像 mkdir /opt/sshd cd /opt/sshdvim Dockerfile #第一行必须指明基于的基础镜像…

【无标题】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;它连接了数十亿台计算机和其他设备。它是由…

mysql中MyISAM引擎和InnoDB引擎的区别

MyISAM和InnoDB是MySQL数据库中两种常用的存储引擎。它们在功能和性能方面有一些区别&#xff0c;下面是它们的主要区别&#xff1a; 事务支持&#xff1a;InnoDB是一个支持事务处理的存储引擎&#xff0c;而MyISAM不支持事务。事务是一组数据库操作&#xff0c;可以一起成功或…

il汇编整数相加

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

[课程][原创]CMakeLists编写实战linux版

课程地址&#xff1a;https://edu.csdn.net/course/detail/38887 课程介绍课程目录讨论留言 你将收获 学会如何编写CMakeLIsts 学会如何调试自己cmake项目 学会如何引用头文件和库 学会如何调用开源库 适用人群 对CMakeLists感兴趣的入门学者 课程介绍 CMake是一个跨…

无涯教程-Perl - 面向对象

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

【iOS】—— 离屏渲染

文章目录 离屏渲染UIView和CALayer关系GPU屏幕渲染有两种方式:产生离屏渲染的原因&#xff1a;既然离屏渲染这么耗性能,为什么有这套机制呢?什么情况会离屏渲染&#xff1f;既然离屏渲染这么不好&#xff0c;为什么我们还要强制开启呢&#xff1f;如何避免离屏渲染&#xff1f…

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;…

CSDN第68期编程竞赛活动经验

1、题目名称&#xff1a;小球游戏 某台有10个小球的游戏机&#xff0c;其设定的规则如下&#xff1a; 每一轮游戏在开始之前会把编号为0到9的小球依次放入从左到右编号也为0到9的10个位置&#xff1b;游戏开始后会快速对调任意两个球的位置若干次&#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><…

誉天程序员-2301-3-day08

4. 书籍管理实现CURD 这个结构比较复杂&#xff0c;是有一套复杂的机制&#xff0c;注意它们之间的关系和控制实现。  新增和修改怎么复用对话框  对话框中的数据&#xff0c;表格中展现的数据&#xff0c;临时记录正在操作的数据统一联动起来  单条删除怎么传递数据&am…

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

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

驱动开发day8

编写LED灯的驱动&#xff0c;使用GPIO子系统&#xff0c;里面添加按键的中断处理 1.应用程序发送指令控制LED亮灭 2.按键1 按下&#xff0c;led1电位反转 按键2按下&#xff0c;led2电位反转 按键3 按下&#xff0c;led3电位反转 驱动程序 #include <linux/init.h> #i…

java动态绑定机制

规则 调用对象方法时&#xff0c;该方法会和对象的运行类型绑定。调用对象属性时&#xff0c;没有动态绑定机制&#xff0c;哪里声明哪里使用。 例子&#xff1a; class Base{public int a10;public int getA(){return a;}public int getSum(){return 10getA();//这里会调用…