当前位置: 首页 > news >正文

QFramework框架学习

主要学习内容

  1. TypeEventSystem

  1. ActionKit

  1. Timer类

1、TypeEventSystem-适用于一个条件触发,多个组件响应的情况

例如:动物园系统中,点击肉食动物按钮,动物园中有肉食属性的动物都进行显示。

步骤:

1、动物自身脚本上进行判断是否有肉食属性,有则注册事件

2、事件发送方:按钮点击,发送通知事件

3、事件接收方:动物,执行处理事件的操作

①单事件触发

代码学习

using System;
using System.Collections;
using System.Collections.Generic;
using QFramework;
using UnityEngine;// namespace QFramework.Example//在类的外面嵌套上命名空间
// {public class TypeEventSystemController : MonoBehaviour{//用结构体定义一个事件,适合一对多的情况,一触发,多响应public struct EventA{//参数public int Count;}//在start中监听事件void Start(){//注册并回调,简单写法TypeEventSystem.Global.Register<EventA>(e => //输入e点击Tab{Debug.Log(e.Count);}).UnRegisterWhenGameObjectDestroyed(gameObject);//注销,与当前的gameobject进行关联//传统事件机制的用法①②③//①TypeEventSystem.Global.Register<EventA>(onEventA);}//②//void onEventA(Event e)//{//}//③销毁//private void OnDestroy()//{//    TypeEventSystem.Global.UnRegister<EventA>(onEventA);// }// Update is called once per framevoid Update(){//发送事件if (Input.GetMouseButtonDown(0)){//第一种写法:自动new一个A,但是无法传参//TypeEventSystem.Global.Send<EventA>();//第二种写法TypeEventSystem.Global.Send(new EventA(){Count = 10});}}}
// }

②多事件触发

using System.Collections;
using System.Collections.Generic;
using QFramework;
using SnakeGame;
using Unity.VisualScripting;
using UnityEngine;public class MutiEvent : MonoBehaviour//添加// IOnEvent<MutiEvent.IEventA>, //     IOnEvent<MutiEvent.EventB>//报错可进行点击自动生成代码
{public interface IEventA//接口形式{public abstract void Function();}public struct EventB: IEventA{public void Function(){print("从管道B中流出");}}public struct EventC: IEventA{public void Function(){print("从管道C中流出");}}void Start(){TypeEventSystem.Global.Register<IEventA>(a => {Debug.Log(a.GetType().Name);}).UnRegisterWhenGameObjectDestroyed(gameObject); //输出名字}// Update is called once per framevoid Update(){if (Input.GetMouseButtonDown(0)){TypeEventSystem.Global.Send<IEventA>(new EventB());}if (Input.GetMouseButtonDown(1)){TypeEventSystem.Global.Send<IEventA>(new EventC());}}}

2、ActionKit

①单独使用时

1)延时功能
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;
using QFramework;public class ActionKitExample : MonoBehaviour
{void Start(){//调用延时功能DelayTime();}/// <summary>/// 实现延时功能/// </summary>void DelayTime(){print("开始时间 "+Time.time);ActionKit.Delay(1.0f, () =>{print("延迟时间:" + Time.time);}).Start(this);//底层使用的是MonoBehaviour中的东西,所以需要关联一下gameObject}}

运行结果:大约延迟1s

 /// <summary>/// 序列和完成回调/// </summary>void SequenceAndCallBack(){print("序列开始:"+Time.time);ActionKit.Sequence().Callback(() => print("DelayStart延时开始:"+Time.time))//回调函数.Delay(1.0f)//延时一秒.Callback(()=>Debug.Log("Delay Finish延时结束:"+Time.time)).Start(this,_=>{print("Sequence Finish序列结束:"+Time.time);});}

运行结果:sequence从上到下执行

  /// <summary>/// 帧延时/// </summary>void DelayFrameExample(){//延时一帧后回调print("帧延时开始帧率数"+Time.frameCount);ActionKit.DelayFrame(1, () =>{print("帧延时结束帧率数" + Time.frameCount);}).Start(this);//序列延时10帧后回调ActionKit.Sequence().DelayFrame(10).Callback(() => print("序列延时帧率数" + Time.frameCount)).Start(this);//下一帧做什么ActionKit.NextFrame(() => { }).Start(this);}

运行结果

   /// <summary>/// 支持协程的方式/// </summary>void CoroutineExample(){//第一种:普通//ActionKit.Coroutine(() => SomeCoroutine()).Start(this);//ActionKit.Coroutine(SomeCoroutine).Start(this);//第二种:将协程转换为动作//SomeCoroutine().ToAction().Start(this);//第三种:序列的方式执行ActionKit.Sequence().Coroutine(()=>SomeCoroutine()).Callback(()=>print("结束"))//如果是多个:使用delegte.Start(this);}IEnumerator SomeCoroutine(){yield  return new WaitForSeconds(1.0f);print("你好"+Time.time);}

运行结果:我感觉跟上面序列完成回调的Delay(1.0f)方法是一样的,且不如上面的简单,这个方法可以弃用了

2)条件执行
    /// <summary>/// 条件执行(仅执行一次)/// </summary>void ConditionExample(){ActionKit.Sequence().Callback(() => print("条件发生之前")).Condition(() => Input.GetMouseButtonDown(0))//每帧调用后面的委托,直到委托返回为true,执行下一步.Callback(() => print("鼠标点击")).Start(this);}

运行结果:一直在等待条件的执行

   /// <summary>/// 重复执行/// </summary>void RepeatExample(){print("点击五次鼠标右键,输出信息");ActionKit.Repeat(5)//改为关键字repeat.Condition(() => Input.GetMouseButtonDown(1))//每帧调用后面的委托,直到委托返回为true,执行下一步.Callback(() => print("鼠标点击")).Start(this, () =>{print("5次右键点击完成");});}

运行结果:条件重复5次后输出

  /// <summary>/// 并行执行,同时执行动作,动作全部完成执行最后finish函数/// </summary>void ParallelExample(){print("并行开始");ActionKit.Parallel().Delay(1.0f, () => { print(Time.time); }).Delay(2.0f, () => { print(Time.time); }).Delay(3.0f, () => { print(Time.time); }).Start(this, () =>{print("并行结束" + Time.time);});}

运行结果

3)自定义动作执行
    /// <summary>///自定义动作/// </summary>void CutomExample(){ActionKit.Custom(a =>{a.OnStart(() => { print("OnStart"); }).OnExecute(dt =>{print("OnExecute");if (Time.frameCount > 5){a.Finish();//注意这里是Finish}}).OnFinish(() => { print("OnFinish"); });}).Start(this);}

运行结果:事件开始,执行,结束

  //传数据的自定义事件public class ActionData{public  int FrameCount;//公有,其他函数可以访问}/// <summary>///自定义动作,含参数/// </summary>void CutomExampleWithParameter(){ActionKit.Custom<ActionData>(a =>//传一个自定义的数据类型{a.OnStart(() =>{a.Data = new ActionData(){FrameCount=0};print("OnStart");}).OnExecute(dt =>{print("OnExecute");a.Data.FrameCount++;if (a.Data.FrameCount > 5){a.Finish();//注意这里是Finish}}).OnFinish(() => { print("OnFinish"); });}).Start(this);}

运行结果:开始的时候定义参数值,执行时进行判断,符合条件结束

②与DoTween插件集成

集成步骤:

查找-双击-导入

代码

    /// <summary>/// DoTween的集成,Dotween和ActionKit组合使用/// </summary>void DotweenExample(){ActionKit.Sequence().DOTween(() => transform.DOMoveX(5, 1)).Start(this);}

运行结果:挂在脚本的物体在一秒钟,x变为5

3、Timer计时器

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using QFramework;
using QFramework.TimeExtend;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
using Timer = QFramework.TimeExtend.Timer;public class Test : MonoBehaviour
{private Timer timer1;private Timer timer2;public Text timeText;void Start(){ActionKit.Sequence().Callback(() => print("按下F1新建一个计时器")).Condition(() => Input.GetKey(KeyCode.F1)) .Callback(() => timer1 = Timer.AddTimer(10, "Timer1", false, true).OnUpdated(a =>{timeText.text = ((1 - a) * 10).ToString();}).OnCompleted(() => //十秒完成后{print("Timer1计时10秒结束");})).Condition(()=> Input.GetKey(KeyCode.D)).Callback(delegate{Timer.DelTimer("Timer1");print("删除-计时器1");}).Condition(()=>  Input.GetKey(KeyCode.A)).Callback(delegate{if (!Timer.Exist(timer2)){timer2 = Timer.AddTimer(10, "Timer2", false, true).OnUpdated(a =>{timeText.text = (a*10).ToString();}).OnCompleted(()=>//十秒完成后{print("Timer2计时10秒结束");});print("新建-计时器2");}})   .Condition(() => Input.GetKey(KeyCode.S)) .Callback(delegate{if (Timer.Exist(timer2)){Timer.Pause(timer2);print("暂停-计时器2");}})   .Condition(() => Input.GetKey(KeyCode.F)) .Callback(delegate{if (Timer.Exist(timer2)){Timer.Resum(timer2);print("计时器恢复");}})   .Start(this);}}
}

相关文章:

QFramework框架学习

主要学习内容TypeEventSystemActionKitTimer类1、TypeEventSystem-适用于一个条件触发&#xff0c;多个组件响应的情况例如&#xff1a;动物园系统中&#xff0c;点击肉食动物按钮&#xff0c;动物园中有肉食属性的动物都进行显示。步骤&#xff1a;1、动物自身脚本上进行判断是…...

移动OA系统,联动企业协作让办公高效无间断

移动oa系统&#xff0c;近年来随着企业办公节奏的变化及人们个性化办公需求的增加迎来了快速发展。一方面&#xff0c;它兼具OA系统诸多优势&#xff0c;既凝聚了企业基础管理工作&#xff0c;联动了企业协作、沟通交流&#xff0c;又进一步提高了企业的综合实力与市场竞争力。…...

结构体熟练掌握--实现通讯录

魔王的介绍&#xff1a;&#x1f636;‍&#x1f32b;️一名双非本科大一小白。魔王的目标&#xff1a;&#x1f92f;努力赶上周围卷王的脚步。魔王的主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王.&#x1f525;&#x1f525;&#x1f525; ❤️‍&#x1…...

腾讯云CVM服务器购买流程手把手方法教程攻略

​购买腾讯云服务器有两种方式。一种是在官方活动中&#xff0c;简单方便&#xff0c;但ECS配置相对固定&#xff1b;另一种是在ECS页面定制购买。配置选项丰富&#xff0c;但地理可用性区域、计费模式、CPU内存实例规格、映像系统、存储系统磁盘、网络带宽和安全组的选择更为复…...

九龙证券|“春季躁动”行情要来?1月新增投资者数大增

新增投资者数量在上一年12月触及多年新低后&#xff0c;2023年1月份开端呈现反弹。 在新增投资者数量之外&#xff0c;近段时刻以来&#xff0c;包含A股商场股票成交额、北向资金净买入额、两融资金规划及成交额在内多个商场目标也呈现回暖的特征&#xff0c;目前A股商场交投氛…...

C语言(按位运算符和位移运算符)

目录 ​编辑 一.按位运算符 1.二进制反码或按位取反&#xff1a;~ 2.按位与&#xff1a;& 3.按位或&#xff1a;| 4.按位异或&#xff1a;^ 二.位移运算符 1.左移&#xff1a; << 2.右移&#xff1a; >> 一.按位运算符 C有四个按位逻辑运算符都用于整…...

删掉的照片怎么恢复?

每一张照片都是生活&#xff0c;留住每一个人的回忆。而这些有意义的照片&#xff0c;我们都会把它保存在我们的手机或电脑上&#xff0c;始终伴随着我们。但无论是手机还是电脑&#xff0c;都是需要时不时清理一下的。如果是清理垃圾图片时&#xff0c;不小心删除了需要的图片…...

【java】40 个 SpringBoot 常用注解(建议收藏)

本文目录一、Spring Web MVC 注解Spring Web MVC 注解RequestMappingRequestBodyGetMappingPostMappingPutMappingDeleteMappingPatchMappingControllerAdviceResponseBodyExceptionHandlerResponseStatusPathVariableRequestParamControllerRestControllerModelAttributeCross…...

【JMC】SMILES‑based deep generative scafold decorator for de‑novo drug design

SMILES-based deep generative scaffold decorator for de-novo drug design 基于SMILES的利用Fragment的分子生成模型 https://github.com/undeadpixel/reinvent-scaffold-decorator 1.背景 深度生成模型因其可以从有限的数量中生成新数据&#xff0c;目前已成功应用于生成…...

全链路异步,让你的 SpringCloud 性能优化10倍+

背景 随着业务的发展&#xff0c;微服务应用的流量越来越大&#xff0c;使用到的资源也越来越多。 在微服务架构下&#xff0c;大量的应用都是 SpringCloud 分布式架构&#xff0c;这种架构&#xff0c;总体是全链路同步模式。 同步编程模式不仅造成了资源的极大浪费&#x…...

131.《router v 5 与 react-router v 6》

文章目录1.什么是路由2.路由分类3.react-router-dom的理解4. react-router-dom相关API5.其他6. react-router5 路由基本使用1.效果2.代码App.js一级路由home.js下的二级路由7.路由传参的三种方式8.react-router6 基本使用1.一级路由2.二级路由3.hooksuseRoutesuseParamsuseSear…...

2023第十届北京老年产业博览会/中国养老护理人才培育计划

CBIAIE北京老博会&#xff0c;打造2023年度唯具参展价值的老年行业盛会&#xff1b; 北京老博会&#xff1a;2011年&#xff0c;我国首场以“老年产业”为主题&#xff0c;一场专注于老年福祉、健康的国际型行业发展盛会&#xff0c;中国&#xff08;北京&#xff09;国际老年…...

STM32F407VET6 / BLACK_F407VE开发板间隔0.5秒不断重启

有一块 STM32F407VET6 的故障开发板, 之前的问题是经常无法烧录, 必须reset之后才能连接, 具体查看这篇 STM32F407VET6烧录出现flash download failed target dll has been cancelled. 并且程序运行一段时间后会halt. 这块开发板后来一直搁箱底吃灰了几年. 最近打算把这片 STM…...

什么是圈复杂度

圈复杂度是一种软件度量指标&#xff0c;用于度量程序中的控制流程的复杂性。它是通过计算程序中独立路径的数量来确定的。简单来说&#xff0c;圈复杂度是指在一个函数或模块中有多少个独立的路径&#xff0c;也就是说&#xff0c;有多少个不同的输入序列可以导致不同的执行路…...

Hbase 数据迁移

Hbase 数据迁移 可选方案对比 l 已验证方案操作说明&#xff1a; n Export&import u 导出命令及示例 hbase org.apache.hadoop.hbase.mapreduce.Export “表名” 文件路径 导出至本地文件系统&#xff1a; ./bin/hbase org.apache.hadoop.hbase.mapreduce.Export ‘defa…...

Docker consul的容器服务更新与发现

一、Consul概述&#xff08;1&#xff09;什么是服务注册与发现服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分…...

数据库关系模型

关系模型简述 形象地说&#xff0c;一个关系就是一个table。 关系模型就是处理table的&#xff0c;它由三个部分组成&#xff1a; 描述DB各种数据的基本结构形式&#xff1b;描述table与table之间所可能发生的各种操作&#xff1b;描述这些操作所应遵循的约束条件&#xff1…...

你是真的“C”——详解指针知识

你是真的“C”——详解指针知识&#x1f60e;前言&#x1f64c;1、 指针是什么&#xff1f;&#x1f64c;2、指针和指针类型&#x1f64c;2 、1指针-整数2 、 2指针的解引用3、 野指针&#x1f64c;3、 1野指针成因3、 2如何规避野指针4、指针运算&#x1f64c;4、1 指针-整数4…...

React/ReactNative面试攻略(偏RN)

useMemo Vs useCallBackuseMemo第一个参数返回的是值&#xff0c;useCallBack返回的是函数useMemo和useCallBack第二个参数都是依赖项useMemo避免组件非依赖项更新时参数的计算useCallback避免父组件非依赖项更新时造成子组件的重复渲染React.memo 使用场景纯prue组件&#xff…...

Leetcode-每日一题1234. 替换子串得到平衡字符串(滑动窗口 + 哈希表)

题目链接&#xff1a;https://leetcode.cn/problems/replace-the-substring-for-balanced-string/description/ 思路 题目意思 这题意思是一个只含有[Q, W, E, R] 四个字符的字符串s且长度一定是 4的倍数&#xff0c; 需要你通过替换子串&#xff0c;使他变成一个「平衡字符…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...