【unity之IMGUI实践】抽象父类继承实现【三】

news2024/12/26 14:06:15

在这里插入图片描述


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

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

👨‍💻 本文由 秩沅 原创

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


抽象父类继承实现

在这里插入图片描述


文章目录

    • 抽象父类继承实现
    • 🎶前言
    • 🎶(==A==)常用关键API
    • 🎶(==B==)需求分析
    • 🎶(==C==)游戏运行面板搭建和封装
      • 😶‍🌫️:步骤
    • 🎶(==D==)逻辑封装——坦克基类
    • 🎶(==E==)行为实现——坦克移动和旋转
      • 总结:


🎶前言


🅰️


🎶(A常用关键API


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


🎶(B需求分析


在这里插入图片描述


🎶(C游戏运行面板搭建和封装


  • 总效果图

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


😶‍🌫️:步骤

1.创建游戏面板,进行组件管控 2.创建提示面板进行退出确定 3.同步面板直接的显隐和复用

步骤一创建游戏面板,进行组件管控

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

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________脚本名:  游戏面板类
//___________功能:   管理游戏中UI控件和面板数据更新
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class GamePlane : BeginFather<GamePlane>
{
    public Label laScore; //分数
    public Label laTime;  //时间
    public Button buQuit; //退出
    public Button buSet;  //设置
    public TextureIMGUI  bloodRoll;//血条
    

    //----记录最终的分数和时间,为公有方便外部调用-----
    [HideInInspector]
    public int nowScore;
    [HideInInspector]
    public float  nowTime;
    private int time;         //做时间格式转化的中介

    private void Start()
    {
        //退出事件
        buQuit.triggerEvent += () => { InformPlane.SingleInstance.Show(); };
        //设置事件
        buSet .triggerEvent += () => { SetPlane.SingleInstance.Show(); };
    }
    private void Update()
    {
        UpdateTime();
    }

    //更新时间
    private void UpdateTime()
    {
        nowTime = nowTime + Time.deltaTime; //帧间隔更新时间更准确
        time = (int)nowTime;

        //时间格式转化
        if (time / 3600 > 0)
        {
            laTime.ContorlContent.text = $"{time / 3600}小时{time / 60 % 60}分钟{time % 60}秒";
        }
        else if (time / 3600 == 0 && time / 60 % 60 > 0)
        {
            laTime.ContorlContent.text = $"{time / 60 % 60}分钟{time % 60}秒";
        }
        else if (time / 3600 == 0 && time / 60 % 60 == 0)
        {
            laTime.ContorlContent.text = $"{time % 60}秒";
        }
    }
    //外部更新分数
    public void AddScore( int defitScore)
     {
        nowScore  += defitScore;
        laScore.ContorlContent.text = nowScore .ToString();
     }

     
   
    //外部更新血条
    public void UpdataBlood(int max , int now)
    {
        bloodRoll.ContorlPosition.width = 330*(float)(now / max); //根据百分比来缩放血条大小
    }
}


2.创建提示面板进行退出确定

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能:  提示面板,确认退出
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class InformPlane : BeginFather<InformPlane>
{
    public Button yes; //确定按钮
    public Button No;  //取消按钮

    private void Start()
    {   
        yes.triggerEvent += () => SceneManager.LoadScene("BeginScreen");  //退出游戏
        No.triggerEvent += () => Hidden();
        Hidden();
    }
}

在这里插入图片描述


🎶(D逻辑封装——坦克基类


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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       
//___________功能: 坦克基类——集中子类相同点
//___________创建者:______秩沅______
//___________________________________
//-------------------------------------
public abstract  class TankFather : MonoBehaviour
{
    //攻击和防御相关
    public int attack;
    public int defence; 
    public int nowBlood;
    public int maxBlood;
    //移动和转速相关
    public int moveSpeed;
    public int RotateSpeed;
    public int HeadSpeed;
    //击败特效
    public GameObject DefitInstance;
  

    //受伤行为
    public virtual  void Heart(TankFather other)
    {
        //当攻击力大于防御力时才生效
        if (other.attack - defence > 0)
        {
            nowBlood -= (other.attack - defence);
        }
        if(nowBlood <= 0 )
        {
            nowBlood = 0;
            Death();
        }
       //更新血条
        GamePlane.SingleInstance.UpdataBlood(maxBlood ,nowBlood );
    }

    //死亡行为
    public virtual  void Death()
    {
        Destroy(this);
        //将特效实例化相关逻辑

        GameObject effect = Instantiate(DefitInstance,this.transform.position ,this.transform.rotation);
        AudioSource soudClip = GetComponent<AudioSource>();
        soudClip.enabled  = MusicContol.SingleMusicContol.nowMusicData.soundSwitch;
        soudClip.volume = MusicContol.SingleMusicContol.nowMusicData.soundRoll ;
        soudClip.mute = false;
        soudClip.playOnAwake = true;
    }

    //开火行为
    public abstract void Fire();  //子类中每一个的开火方式都不同,作为抽象方法
    
   
}


🎶(E行为实现——坦克移动和旋转


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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       
//___________功能:  坦克的移动和旋转
//___________创建者:_______秩沅_______
//_____________________________________
//-------------------------------------
public class TankSport : TankFather
{
    private void Start()
    {
        maxBlood = 100;
        nowBlood = 100;
        attack = 30;
        defence = 10;
        moveSpeed = 5;
        RotateSpeed = 50;
        HeadSpeed = 500;
    }
    private void Update()
    {
        //坦克的移动 = 大小*方向
        transform.Translate(Input.GetAxis("Vertical") *Vector3.forward*moveSpeed *Time.deltaTime );
        //坦克的旋转 = 大小*轴向
        transform.Rotate(Input.GetAxis("Horizontal") *Vector3.up *RotateSpeed *Time .deltaTime );
        //头部炮管的旋转 = 大小*轴向
        Head.transform.Rotate(Input.GetAxis ("Mouse X") *Vector3.up*HeadSpeed*Time .deltaTime );
        //左键发射炮弹
        if(Input.GetMouseButtonDown(0))
        {
            Fire();
        }
    }

    public override void Fire() 
    {
        throw new System.NotImplementedException();
    }
}

总结:

  • 面板基类和坦克基类用抽象方法和虚方法区别和好处
  • 为什么坦克基类不是单例模式呢?因为没有需要调用它的地方,单例模式是通过管理者来管理其他下属,而坦克基类只适合做抽象基类(保护了本类)

  • 代码习惯:
    1.是否为空条件处理
    2.是否报错条件处理

相关文章


⭐【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/761076.html

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

相关文章

Bypass!Burp分块传输绕WAF插件

插件简介 本插件主要用于分块传输绕WAF&#xff0c;不了解分块传输绕WAF的可阅读作者这篇文章&#xff1a;【第8周】编写Burp分块传输插件绕WAF 。 关注【Hack分享吧】公众号&#xff0c;回复关键字【230605】获取下载链接 插件使用 延时分块传输

CentOS7.8离线安装Docker24.0.2,离线安装gcc与g++环境

背景 有时候运维时要求在内网环境下操作&#xff0c;即服务器无法连接互联网&#xff0c;那么就无法通过 yum 源在线安装。。这时&#xff0c;一般通过以下3种方式来安装需要的软件&#xff1a; 下载源码包编译安装&#xff1b;下载对应平台编译好的安装包&#xff0c;解压即…

了解JVM

PS&#xff1a;本文以下部分&#xff0c;默认都是使用HotSpot,也就是Oracle Java 默认的虚拟机为前提来进行介绍的。 1.JVM执行流程 程序在执行之前先要把Java代码转换成字节码&#xff08;.class文件&#xff09;&#xff0c;JVM首先需要把字节码通过一定的方式类加载器(Clas…

python调用oepnai API

目录 apiAI官网介绍&#xff08;[Introduction](https://platform.openai.com/docs/api-reference/introduction)&#xff09;安装官方SDK认证&#xff08;Authentication&#xff09;申请API KEY请求组织&#xff08;Requesting organization&#xff09; 发送请求关于chat to…

CAJ文献如何转成PDF?分享两个免费的方法!

CAJ格式是中国知网&#xff08;CNKI&#xff09;常见的电子文献格式&#xff0c;但有时我们可能更倾向于将其转换为PDF格式以便于查阅、存储和共享。为了帮助大家完成这个任务&#xff0c;下面将分享两种免费的方法来将CAJ文献转换为PDF格式。无论您是研究学者、学生还是对特定…

学校招生报名小程序开发笔记(一)

背景 这是一个以报名为核心的职业学校招生小程序&#xff0c;目的是方便想要系统学习技能&#xff0c;入门某项技能或者领域的初高中毕业生&#xff0c;了解该学校的基本情况及各个专业&#xff0c;并提供报名路径&#xff0c;致力于技能型人才培养 功能规划 主要功能包括专…

使用 Pytest 运行 yaml 文件来驱动 Appium 自动化测试

目录 前言&#xff1a; 获取 yaml 文件 YamlTest 测试类 Appium 初始化 Pytest 测试类 自定义 runtest demo&#xff1a; 自定义错误输出 Yaml 使用方式规则 前言&#xff1a; 使用Pytest来运行yaml文件来驱动Appium自动化测试是一种方便且灵活的方法。通过将测试数据…

【异常解决】postman请求提示Full authentication is required to access this resource

Full authentication is required to access this resource解决办法 报错问题&#xff1a;在使用 postman 测试接口时&#xff0c;该接口需要在 Header 中传入 access_token&#xff0c;实际上也在请求的 Header 中添加上了 access_token 参数&#xff0c;但是服务端还是返回4…

【STM32零基础入门教程01】STM32入门基础知识

本篇内容为STM32零基础入门教程的第一篇&#xff0c;网上STM32的教程很多&#xff0c;有些初学者还是望而却步。其实STM32并不难&#xff0c;只是一个新的事物出现在我们面前一时间不适应&#xff0c;思来想去我打算写点东西一方面自己有点知识的积累&#xff0c;另一方面希望可…

Python教程(4)——Python开发工具PyCharm的下载与安装

PyCharm是一种专业的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发和维护。它提供了丰富的功能和工具&#xff0c;帮助开发人员更高效地编写、调试和测试Python代码。如果是一些大型Python项目强烈推荐用这个来开发。今天我们来介绍一下PyCha…

【实战】 七、Hook,路由,与 URL 状态管理(中) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十二)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

Docker基础(二)

1、Docker工作原理 Docker是一个Clinet-Server结构的系统&#xff0c;Docker守护进程运行在主机上&#xff0c;然后通过Socket连接从客户端访问&#xff0c;守护进程从客户端接受命令并管理运行在主机上的容器。 容器&#xff0c;是一个运行时环境&#xff0c;就是我们前面说的…

论文笔记:Deep Spatio-Temporal Residual Networks for Citywide Crowd FlowsPrediction

2017 AAAI 使用时空残差网络ST-ResNet 进行 城市区域流入流出客流量预测 1 研究对象 城市客流流入流出 根据经纬度将城市划分为网格 IJ 1.1 难点 空间依赖性 时间依赖性 外部影响 2 模型 3 实验 北京出租车数据纽约自行车数据 评价指标&#xff1a;RMSE

Java List中通过对象属性排序,可实现多条件排序

直接上代码&#xff1a; import com.google.common.collect.Lists; import lombok.AllArgsConstructor; import lombok.Data;import java.util.Comparator; import java.util.List; import java.util.stream.Collectors;/*** List 对象属性排序*/Data AllArgsConstructor clas…

[java安全]动态代理

文章目录 【java安全】动态代理前言本质重要方法Proxy#newProxyInstance()InvocationHandler#invoke() 举例 【java安全】动态代理 前言 java中代理分为两种&#xff1a;静态代理、动态代理 而动态代理又分为&#xff1a;jdk动态代理、CGLIB动态代理 本文我们来谈谈jdk动态代…

Iceberg从入门到精通系列之十七:Apache InLong往Iceberg同步数据

Iceberg从入门到精通系列之十七&#xff1a;Apache InLong往Iceberg同步数据 一、概览二、版本支持三、依赖项四、SQL API 用法五、多表写入六、动态表名映射七、动态建库、建表八、动态schema变更九、Iceberg Load 节点参数十、数据类型映射 一、概览 Apache Iceberg是一种用…

【机器学习算法】主成分分析(PCA)

主成分分析(PCA) PCA(Principal Component Analysis) 是实现数据降维的一种算法。正如其名&#xff0c;假设有一份数据集&#xff0c;每条数据的维度是d&#xff0c;PCA通过分析这d个维度的前k个主要特征(这k个维度在原有d维特征的基础上重新构造出来&#xff0c;且是全新的正交…

SpringBoot+React学科竞赛管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootReact框架开发的学科竞赛管理系统。首先&#xff0c;这是一个前后端分离的项目&#xff0c;代码简洁…

初学者怎么学习c++(合集)

学习c方法1 找一本好的书本教材&#xff0c;辅助看教学视频。好的教材&#xff0c;可以让你更快更好的进入C/C的世界。在校学生的话&#xff0c;你们的教材通常都是不错的。如果是自学&#xff0c;推荐使用谭浩强出的C/C经典入门教材。看视频是学习比较直观的方式。建议先看课本…

从零开始理解Linux中断架构(20)--关于二级中断控制-链式chained Handler

二级中断控制器是个双重角色,在上级中断控制器看来他是个中断设备,在连接到他的下级设备来看,他是个中断控制器。所以处理完成基本的中断控制器管理功能:映射本地中断,还要多个动作:修改上级中断的默认irq Handler,向上级中断设置自己的链式中断处理函数。 中断控制的层…