【unity之IMGUI实践】通用API实现抽象行为封装【五】

news2024/11/23 23:26:36

在这里插入图片描述


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

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

👨‍💻 本文由 秩沅 原创

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


通用API实现抽象行为封装【五】


文章目录

    • 通用API实现抽象行为封装【五】
    • 🎶前言
    • 🎶(==A==)常用关键API
    • 🎶(==B==)需求分析
    • 🎶(==C==)行为实现——武器拾取变成技能拾取
    • 🎶(==D==)行为实现——四个属性道具一个脚本
    • 🎶(==E==)行为实现——摧毁箱子爆出道具
      • 总结:


🎶前言

在这里插入图片描述


🅰️


🎶(A常用关键API


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


🎶(B需求分析


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


🎶(C行为实现——武器拾取变成技能拾取


在这里插入图片描述

😶‍🌫️:步骤

  • 1.添加道具预制体(随机生成武器)
  • 2.封装道具基类
  • 3.封装武器道具逻辑

在这里插入图片描述

1.封装道具基类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 道具基类,提取道具相同点
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public   class propsFather : MonoBehaviour
{
 
    public float RotateSpeed = 100;
    public GameObject Effect; //吃掉道具的特效

    private void Update()
    {
        transform.Rotate(Vector3.up * RotateSpeed * Time.deltaTime);    
    }

    public virtual  void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            GainEffect()}
    }

    //生成特效
    public void GainEffect()
    {
        GameObject effect = Instantiate(Effect, transform.position, transform.rotation); //实例化吃掉特效
        AudioSource effectAudio = effect.GetComponent<AudioSource>();
        effectAudio.enabled = MusicContol.SingleMusicContol.nowMusicData.soundSwitch;
        effectAudio.volume = MusicContol.SingleMusicContol.nowMusicData.soundRoll;
        gameObject.SetActive(false); //吃掉后让其先失活
        Destroy(effect, 3);          //特效持续三秒后消失    
    }
  
}

在这里插入图片描述

封装武器道具逻辑

using System.Collections;
using System.Collections.Generic;

using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 武器道具的逻辑封装
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class props_Weapon : propsFather
{
  
    public GameObject [] weapons;
    private int index;


    private void Awake()
    {
        weapons = Resources.LoadAll<GameObject>(@"Prefabs/Weapon") ; //加载武器资源
    }


    public override void OnTriggerEnter(Collider other)
    {
        base.OnTriggerEnter(other);
        if (other.CompareTag("Player"))
        {
            if (weapons != null)
            {
                //随机武器生成
                index = Random.Range(0, weapons.Length);
                GameObject NewWeapon = Instantiate(weapons[index]);
                //标识武器的主人
                Weapon weaponScript = NewWeapon.GetComponent<Weapon>();
                weaponScript.Tank = other.gameObject;
                //拾取武器
                MainTank tankScript = other.gameObject.GetComponent<MainTank>();
                tankScript.ChangeWeapon(NewWeapon);
            }
        }
    }

 
  
}



🎶(D行为实现——四个属性道具一个脚本


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

在这里插入图片描述

巧妙地使用了枚举,使得四个脚本变成一个脚本共同使用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 加血道具逻辑封装
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------

    
public enum Type_Atrribute //枚举类型的创建相当于将四个属性的脚本直接变成一个脚本
{
    blood,
    attack,
    defence,
    speed
}

public class props_Attribute : propsFather
{
    public Type_Atrribute atrribute = Type_Atrribute.blood ;  
    public int atk = 20;
    public int def = 20;
    public int Spe = 20;
    public int blo = 20;
   
    public override void OnTriggerEnter(Collider other)
    {
        base.OnTriggerEnter(other);

        if (other.CompareTag("Player"))
        {
            MainTank tankScript = other.gameObject.GetComponent<MainTank>();

            switch (atrribute)
            {             
                case Type_Atrribute.blood:         
                       tankScript.nowBlood += blo;
                    if (tankScript.nowBlood > tankScript.maxBlood)
                        tankScript.nowBlood = tankScript.maxBlood;
                    break;
                case Type_Atrribute.attack:
                    tankScript.attack += atk;
                    break;
                case Type_Atrribute.defence:
                    tankScript.defence += def;
                    break;
                case Type_Atrribute.speed:
                    tankScript.moveSpeed += Spe;
                    break;
                default:
                    break;
            }
         
        }
    }
   
}



🎶(E行为实现——摧毁箱子爆出道具


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

箱子类相关封装

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 箱子销毁相关逻辑封装
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class BoxTrigger : MonoBehaviour
{
    public int defence = 50;   //箱子的防御力
    public  GameObject effect;  //箱子销毁特效
    private GameObject[] props;
    private int sufferAttack;
    private int PropChance;
    

    private void Start()
    {
        PropChance = Random.Range(1, 101);
        if (PropChance <= 70)
        {
            props = Resources.LoadAll<GameObject>(@"Prefabs/Props");
        }

    }
    private void OnTriggerEnter(Collider other)
    {
        if(other.CompareTag("bullet"))
        {
            BulletMove BulletSript = other.gameObject.GetComponent<BulletMove>();
            //如果子弹是玩家打来的则获取子弹的攻击力
            if(BulletSript.Tank.tag == "Player")
            {
                TankFather tankScript = BulletSript.Tank.GetComponent<TankFather>();
                sufferAttack = tankScript.attack;
                defence -= sufferAttack;   //防御力减少
                sufferAttack = 0;          //子弹的伤害是一次性的所以伤害归0
                if (defence <= 0) RandomMakeProp();
            }
           
        }
    }

    //随机生成道具
    public void RandomMakeProp()
    {
        int index;
        if (props != null)  //70%概率生成道具
        {
            index = Random.Range(0, props.Length);
            GameObject eff = Instantiate(effect, transform.position , transform.rotation);
            //音效同步
            AudioSource audioS = eff.GetComponent<AudioSource>();
            audioS.enabled  = MusicContol.SingleMusicContol.nowMusicData.soundSwitch;
            audioS.volume = MusicContol.SingleMusicContol.nowMusicData.soundRoll;

            Destroy(eff, 3);  //延时销毁特效           
            GameObject prop = Instantiate(props[index], transform.position +new Vector3(0, 2, 0), transform.rotation);
            Destroy(gameObject);
        }
        else              //30%的概率直接销毁
        {
            GameObject eff = Instantiate(effect, transform.position , transform.rotation);
            //音效同步
            AudioSource audioS = eff.GetComponent<AudioSource>();
            audioS.enabled = MusicContol.SingleMusicContol.nowMusicData.soundSwitch;
            audioS.volume = MusicContol.SingleMusicContol.nowMusicData.soundRoll;

            Destroy(eff, 3);  //延时销毁特效
            Destroy(gameObject);           
        }
    }
}

总结:

  • 枚举在面向对象中的妙用

相关文章


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

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

相关文章

【数字图像处理与应用】模板匹配

【数字图像处理与应用】模板匹配 题目模板匹配原理Matlab代码实现算法介绍显示图像的匹配结果 (最匹配的一个)MATLAB实现运行结果图像的相关值结果&#xff1a;在原图像上绘制检测到的目标位置&#xff1a;显示检测到的目标坐标&#xff1a; 显示图像的匹配结果 (最匹配的三个&…

计讯物联5G千兆网关TG463赋能无人船应用方案,开启自动巡检的智能模式

方案背景 水电站、水库、堤坝等水利工程水下构筑物常年处于水下&#xff0c;并在复杂的水流环境下运行&#xff0c;难免会出现磨蚀、露筋等损伤&#xff0c;而传统的安全监测方式一般是通过潜水员检查上层水柱或通过降低水位进行人工巡查&#xff0c;不仅成本高&#xff0c;效…

深入理解Linux网络——TCP协议三次握手和四次挥手详细流程

文章目录 一、三次握手流程二、为什么握手是三次三、关闭连接的情况四、四次挥手流程五、为什么挥手是四次 系列文章&#xff1a; 深入理解Linux网络——内核是如何接收到网络包的深入理解Linux网络——内核与用户进程协作之同步阻塞方案&#xff08;BIO&#xff09;深入理解L…

EGE-UNet, 轻量化U-Net

随着transform 的出现&#xff0c;现在语义分割网路结构越来越复杂&#xff0c;轻量化网路也较少了&#xff0c;有些轻量化也只是名义上的轻量化。今天我看到一篇很好的论文&#xff0c;上海交大发表在 MICCAI 2023 的最新研究工作&#xff0c;一个称为Efficient Group Enhance…

堆排序与直接选择排序

目录 一、直接选择排序 1.基本思想 2.直接选择排序的特性总结 3.代码实现&#xff1a; 二、堆排序 1. 概念&#xff1a; 2.图像实现&#xff1a; 3.代码实现&#xff1a; 一、直接选择排序 1.基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09…

Edge 中比较独特的调试技巧

背景 大家日常开发基本都会使用 Chrome&#xff0c;毕竟确实好用。但是基于 Chromium 的新版 Microsoft Edge 已于 2020 年 1 月 15 日发布。 Edge 目前的使用基本跟 Chrome 差不多了&#xff0c;但显然&#xff0c;Edge 团队不仅仅想当 Chrome 的备用。他们也提供了一些特有…

Matlab中实现对一幅图上的局部区域进行放大

大家好&#xff0c;我是带我去滑雪&#xff01; 局部放大图可以展示图像中的细节信息&#xff0c;使图像更加直观和精美&#xff0c;此次使用magnify工具实现对绘制的figure选择区域绘制&#xff0c;图像效果如下&#xff1a; 1、基本图像绘制 这里选择绘制一个散点图&#xff…

jar 命令实践

jar -h非法选项: h 用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ... 选项:-c 创建新档案-t 列出档案目录-x 从档案中提取指定的 (或所有) 文件-u 更新现有档案-v 在标准输出中生成详细输出-f 指定档案文件名-m 包含指定清单文…

JAVA SE -- 第十天

&#xff08;全部来自“韩顺平教育”&#xff09; 一、枚举&#xff08;enumeration&#xff0c;简写enum&#xff09; 枚举是一组常量的集合 1、实现方式 a.自定义类实现枚举 b.使用enum关键字实现枚举 二、自定义类实现枚举 1、注意事项 ①不需要提供setXxx方法&#xff…

EMA:指数移动平均

Exponential Moving Average 目的&#xff1a;使得参数变化更加顺滑 设原参数为 param_updates [0.1, 0.2, -0.1, 0.3, -0.2] 使用ema进行变换 param_ema 0 alpha 0.9 for param in params:param_ema alpha * param_ema (1 - alpha) * paramprint(param_ema) 结果为…

【ArcGIS Pro二次开发】(52):布局导出图片(批量)

在ArcGIS Pro中设定好布局后&#xff0c;可以直接导出为各种类型的图片。 这是很基本的功能&#xff0c;但是如果你的布局很多&#xff0c;一张一张导图就有点费劲。 之前有网友提出希望可以批量导图&#xff0c;要实现起来并不难&#xff0c;于是就做了这个工具。 一、要实现…

Flutter系列(3):如何将Flutter项目打包成Android安装包

将Flutter项目打包成Android安装包&#xff0c;主要步骤如下&#xff1a; 一、生成key 进入jdk的bin目录下&#xff1a; keytool -genkey -v -keystore D:\key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 大概会有密码等参数&#xff0c;根据自身需要&#x…

软工导论知识框架(一)软件工程学概述

本贴为B站大连工业大学老师的网课笔记&#xff0c;教材为张海藩第6版&#xff0c;适用于考研和期末复习。 导图比较拥挤&#xff0c;看不清可以单独保存或者放大页面。 一.软件&#xff1a; 软件指的是计算机程序、文档运行程序必须的数据、方法与规则。 方法指的是软件开发…

SpringCloud-Alibaba之Sentinel熔断与限流

一、下载安装运行 http://localhost:8080进行访问 登录账号和密码均为sentinel 二、创建工程&#xff0c;并注册到nacos服务中心 依赖spring-cloud-starter-alibaba-nacos-discovery,spring-cloud-starter-alibaba-sentinel sentine-datasource-nacos (持久化)配置文件 se…

LAXCUS分布式操作系统:人工智能最后一公里

随着人工智能技术的飞速发展&#xff0c;越来越多的应用场景开始涌现。然而&#xff0c;在实际应用中&#xff0c;人工智能技术仍然面临着许多挑战&#xff0c;其中最大的挑战之一就是如何实现人工智能的“最后一公里”。这一问题主要体现在以下几个方面&#xff1a; 计算资源…

【UniApp开发小程序】”我的“界面实现+“信息修改“界面实现+登出账号实现+图片上传组件【基于若依管理系统开发】

文章目录 界面实现界面效果我的修改信息 “我的”界面实现api页面退出账号让自我介绍只显示一行&#xff0c;结尾多余的字使用...代替跳转到信息修改页面 信息修改界面实现api页面动态给对象设置属性名和值修改密码图片上传组件 部分后端代码Controller 界面实现 界面效果 我…

CTF PWN-攻防世界CGfsb格式化字符串漏洞

文章目录 前言格式化字符串漏洞格式化字符串漏洞基本原理简单典型案例 漏洞的危害与利用拒绝服务攻击内存数据读取内存数据覆盖 攻防世界&#xff1a;CGfsg题目思路简析任意地址覆写 总结 前言 距离 2021 年年底短暂接触学习 CTF PWN 相关知识&#xff08;CTF PWN-攻防世界XCT…

Matlab对FS32K144编程--CAN通讯

1、系统运行时间周期-10ms 2、配置CAN通讯初始化---波特率&#xff1a;500k&#xff0c;测试用CAN0 3、设置初始化配置优先级最高 4、清除CAN接受中断标志位初始化--仅运行一次&#xff0c;把要接受的CAN地址都要配置一下&#xff0c;如ID:0X245 5、建立全局变量--从单片机向外…

Android Studio安装和设置SDK、Gradle(国内源)、AVD下载目录详细教程

本机环境&#xff1a;win11家庭版 Android Studio版本&#xff1a;android-studio-2022.2.1.20-windows 文章目录 安装Android Studio官网下载安装Android Studio设置Android Studio的gradle使用的JDK版本设置Android Studio的SDK下载目录设置虚拟设备内存 设置Android Studio…