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

news2024/11/24 14:24:27

在这里插入图片描述


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

👨‍💻 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.coloradmin.cn/o/820113.html

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

相关文章

把握前沿大模型风向标?这场大会一定不能错过!

2023年全球AI浪潮迭起&#xff0c;大语言模型热度空前&#xff0c;生成式人工智能为千行百业高质量发展带来更多想象空间。作为前沿科技风向标、汇聚全球开发者的顶级盛会&#xff0c;WAVE SUMMIT 2023深度学习开发者峰会正式定档8月16日&#xff0c;在北京望京凯悦酒店召开。本…

振弦采集仪完整链条的岩土工程隧道安全监测

振弦采集仪完整链条的岩土工程隧道安全监测 隧道工程是一种特殊的地下工程&#xff0c;其建设过程及运行期间&#xff0c;都受到各种内外力的作用&#xff0c;如水压、地震、地质变形、交通荷载等&#xff0c;这些因素都会对隧道的安全性产生影响。因此&#xff0c;对隧道的安…

【C++】开源:mumble跨平台语音通信配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍mumble跨平台语音通信。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…

二分查找及详细注意事项

二分查找是很基础的一种算法 例题&#xff1a; 在一个有序数组中查找具体的某个数&#xff0c;如果找到了返回&#xff0c;这个数的下标。找不到的返回-1 其原理图如图所示 因为是有序的数列&#xff0c;所以可以将要查找的数与中间的数进行比较&#xff0c;如果要查找的数比…

【论文】【生成对抗网络五】Wasserstein GAN (WGAN)

【题目、作者】&#xff1a; 紫色&#xff1a;要解决的问题或发现的问题 红色&#xff1a;重点内容 棕色&#xff1a;关联知识&#xff0c;名称 绿色&#xff1a;了解内容&#xff0c;说明内容 论文地址&#xff1a; 论文下载 本篇文章仅为原文翻译&#xff0c;仅作参考。…

C# 根据图片的EXIF自动调整图片方向

PropertyItems 代码 /// <summary>/// 根据图片exif调整方向/// </summary>/// <param name"img"></param>public void RotateImage(Bitmap img){var exif img.PropertyItems;byte orien 0;var item exif.Where(m > m.Id 274).ToArra…

从单平台运营到多平台服务,Live Market打造跨境产业集合平台

随着全球贸易和数字化的不断发展&#xff0c;跨境电商市场已经成为全球贸易的重要组成部分。在这个竞争激烈的市场中&#xff0c;品牌需要寻找更好的出海跨境运营孵化服务&#xff0c;而多平台服务已经成为了品牌出海的必选之路。Live Market是一家跨境电商产业集合平台&#x…

leetcode 135. 分发糖果

2023.8.1 这道题只从前向后遍历会出各种问题&#xff0c;所以最后决定向前向后各遍历一次。 先定义一个饼干数组biscuits&#xff0c;记录每个孩子的饼干数量&#xff0c;初始化每个孩子饼干数量为1。 然后从前向后遍历、从后向前遍历&#xff0c;使其满足“相邻两孩子评分更高…

day17 | 654.最大的二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

文章目录 一、最大的二叉树二、合并二叉树三、二叉搜索树中的搜索四、验证二叉搜索树 一、最大的二叉树 654.最大的二叉树 构建二叉树的题目&#xff0c;都用前序遍历。 因为我们一定要先构建根节点&#xff0c;才能继续向后构建。 递归函数的参数和返回值&#xff1a; Tree…

问道管理:总资产大于总市值好吗?

在财政领域&#xff0c;总财物和总市值是两个非常重要的指标。总财物是指公司所有的财物&#xff0c;包括固定财物、流动财物、无形财物等&#xff0c;而总市值则是指公司股票在商场上的总价值。当总财物大于总市值时&#xff0c;这是否是一个好的信号呢&#xff1f;咱们将从多…

【万字长文】SpringBoot整合MyBatis搭建MySQL多数据源完整教程(提供Gitee源码)

前言&#xff1a;在我往期的博客介绍了2种关于如何使用SpringBoot搭建多数据源操作&#xff0c;本期博客我参考的是目前主流的框架&#xff0c;把最后一种整合多数据源的方式以博客的形式讲解完&#xff0c;整合的过程比较传统和复杂&#xff0c;不过我依旧会把每个实体类的思路…

【C++初阶】C++基础(下)——引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr

目录 1. 引用 1.1 引用概念 1.2 引用特性 1.3 常引用 1.4 使用场景 1.5 传值、传引用效率比较 1.6 引用和指针的区别 2. 内联函数 2.1 概念 2.2 特性 3.auto关键字&#xff08;C11&#xff09; 3.1 类型别名思考 3.2 auto简介 3.3 auto的使用细则 3.4 auto不能推…

企业级IT应用运维监控层次架构设计

企业基本都有自己的IT系统&#xff0c;而每个IT系统都有自己的监控系统。 企业级的IT应用监控架构是一种综合性的解决方案&#xff0c;涉及到很多层级和相应的工具。随着企业IT系统的规模和复杂程度的不断增加&#xff0c;监控和管理系统也面临着越来越大的挑战。 大家有时在…

【算法心得】善用js可以把函数写在函数里的特性;善用spread表达式生成新数组

https://leetcode.cn/problems/combinations/ 善用js可以把函数写在函数里的特性 这样维护全局变量很烦 把子函数直接写在combine()内部&#xff0c;n和k可以直接用&#xff0c;也不用因为ans是全局的&#xff0c;每次来一个新的case要专门将ans清空了 善用spread表达式生成新…

2023年推荐的四款出色财务管理软件,助力您高效管理财务

在当今数字化时代&#xff0c;各类数字化工具逐渐普及&#xff0c;其中财务管理软件成为各个企业的标配工具。财务管理软件市场也逐渐百花齐放&#xff0c;那么2023年有什么好用的财务管理软件吗&#xff1f;本文就为大家推荐2023好用的四款财务管理软件&#xff01; 一. Zoho …

Vue 常用指令 v-model 双向数据绑定

之前的指令&#xff0c;无论使用哪一种&#xff0c;都是在代码当中定义的内容。在web开发当中经常要去获取用户的输入&#xff0c;v-model可以十分方便的将表单的值和实例当中的数据关联起来。 这样就可以十分便捷的获取和设置表单元素的值了。&#xff08;注意是表单元素&…

基于Spirngboot运动会管理系统

一&#xff1a;技术栈 SpringbootVueElement-UIMavenMysqlredis 二&#xff1a;角色 1.管理员&#xff08;创建运动会项目&#xff0c;视频&#xff0c;运动会开幕式等&#xff09; 2.裁判&#xff08;打分&#xff09; 3.运动员&#xff08;报名参赛&#xff09; 二&#…

每天一个电商API分享:获取淘宝商品描述详情 接口

电商商品描述在电商平台中扮演着重要的角色&#xff0c;对于商品销售和用户购物体验起到关键作用。以下是电商商品描述的重要性&#xff1a; 吸引用户&#xff1a;商品描述是吸引用户的第一步。通过生动、详细、精准的商品描述&#xff0c;可以吸引用户的注意力&#xff0c;引起…

Posix API原理返回值说明

文章目录 1、概述2、connect函数3、listen函数4、accept返回值处理5、recv返回值处理5.1、LT\ET模式读取数据 6、send返回值处理 1、概述 主要介绍网络编程中&#xff0c;使用到的一些系统调用解释&#xff0c;以及返回值的说明 2、connect函数 connect函数功能为&#xff0c;客…

牛客网Verilog刷题——VL51

牛客网Verilog刷题——VL51 题目答案 题目 请编写一个十六进制计数器模块&#xff0c;计数器输出信号递增每次到达0&#xff0c;给出指示信号zero&#xff0c;当置位信号set 有效时&#xff0c;将当前输出置为输入的数值set_num。模块的接口信号图如下&#xff1a; 模块的时序图…