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

这篇具有很好参考价值的文章主要介绍了【unity之IMGUI实践】抽象父类继承实现【三】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#


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

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

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unityUI专题篇
unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#


⭐抽象父类继承实现⭐

unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#



🎶前言


🅰️


🎶(A)常用关键API


unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#
unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#


🎶(B)需求分析


unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#


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


  • 总效果图

unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#
unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#


😶‍🌫️:步骤

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

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

unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#
unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#

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.创建提示面板进行退出确定

unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#
unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#

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();
    }
}

unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#


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


unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#

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)行为实现——坦克移动和旋转


unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#———————————unity继承父类update,# UnityGUI篇,# unity简单游戏demo制作,unity,游戏引擎,单例模式,c#

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大全(万字详解),不信你不收藏



你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!文章来源地址https://www.toymoban.com/news/detail-603898.html

到了这里,关于【unity之IMGUI实践】抽象父类继承实现【三】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【unity之IMGUI实践】单例模式管理数据存储【二】

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unityUI专题篇 🅰️ 😶‍🌫️:步骤实现 1.首先将音乐数据封装在类中,不采用单例模式 2. 而后封装一个游戏数据类为单例模式:功能

    2024年02月16日
    浏览(37)
  • 【unity之IMGUI实践】单例模式管理面板对象【一】

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unityUI专题篇 🅰️ API:简单的旋转 解析: 1.采用单例模式,原因: 单例模式无法被纂改基类,适合当管理者 2.基类提取了子类所有的共

    2024年02月15日
    浏览(38)
  • C# 父类实现的 IEquatable<T> 接口,重写的相等性判断函数都能被子类继承

    在父类重写的 Equals 方法,继承的 IEquatable 接口,重写的 == ,!= 运算符,重写的 GetHashCode 方法在子类中仍然是表现为被重写的状态。 现在让子类也实现 IEquatable 接口 此时代码提示如下 子类实现接口后,调用的默认就是子类实现的 Equals 方法。也可以用强制转换调用父类的

    2024年02月16日
    浏览(33)
  • JAVA中,继承父类和重写父类方法有什么区别?

    在Java中,继承和重写都是面向对象编程的重要概念,但它们有着完全不同的作用: 继承:继承是对象之间的一种关系,子类(派生类)会继承父类(基类)的属性(成员变量)和方法。这使得你可以使用父类的代码,并添加或改变类的行为,以适应新的需求。继承主要是为

    2024年02月10日
    浏览(43)
  • [Lua] 如何模拟单继承OO、实现抽象工厂

    Lua 没有严格的 oo(Object-Oriented)定义,可以利用元表特性来实现 先定义所有类的基类,即 Object 类。代码顺序从上到下,自成一体。完整代码 定义一个空表 Object , __index 指向其自身(继承将直接使用该表作为对象的元表) new 定义构造对象时的初始化行为,相当于 构造器

    2024年02月11日
    浏览(65)
  • C++ | 继承(基类,父类,超类),(派生类,子类)

    文章参考:https://blog.csdn.net/war1111886/article/details/8609957 一 .继承中的访问权限关系 1.基类,父类,超类是指被继承的类,派生类,子类是指继承于基类的类.  2.在C++中使用: 冒号表示继承,如class A : public B;表示派生类A从基类B继承而来 3.派生类包含基类的所有

    2024年02月15日
    浏览(30)
  • [Lua] 实现所有类的基类Object、模拟单继承OO、实现抽象工厂

    Lua 没有严格的 oo(Object-Oriented)定义,可以利用元表特性来实现 先定义所有类的基类,即 Object 类。代码顺序从上到下,自成一体。完整代码 定义一个空表 Object , __index 指向其自身(继承将直接使用该表作为对象的元表) new 定义构造对象时的初始化行为,相当于 构造器

    2024年02月11日
    浏览(31)
  • java子类继承父类方法、或者接口中方法的javadoc注释

    详情可以阅读: https://docs.oracle.com/en/java/javase/19/docs/specs/javadoc/doc-comment-spec.html#method-comment-inheritance 子类继承父类、或者子类实现接口,在子类中为了避免重复写注释,可以在子类方法注释的主要描述部分、或者@return、@param、@throws标记后面的文本参数部分插入{@inheritDoc}标记

    2024年02月11日
    浏览(31)
  • 【002JavaScript 类继承】基本继承、调用父类方法和混入模式等方面的知识。掌握类继承的概念和技巧,提升代码的灵活性和可维护性。

    在 JavaScript 中,类继承是实现代码复用和扩展的重要概念。通过继承,我们可以基于现有类创建新类,并继承父类的属性和方法。本文将详细介绍 JavaScript 类继承的各个方面和技巧。 使用 extends 可以实现基本的类继承。 } class Dog extends Animal { bark() { console.log( ${this.nam

    2024年02月08日
    浏览(48)
  • 【C++】 为什么多继承子类重写的父类的虚函数地址不同?『 多态调用汇编剖析』

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 本篇文章主要是为了解答有关多态的那篇文章那块的一个奇怪现象,大家还记得这张

    2024年02月19日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包