当前位置: 首页 > 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;使他变成一个「平衡字符…...

BMS工程师必看:实测案例解析50-108MHz频段超标如何整改(滤波/接地/屏蔽实战)

BMS工程师实战指南&#xff1a;50-108MHz频段EMC超标问题深度解析与整改方案 当你在实验室看到传导骚扰测试曲线在50-108MHz频段持续突破GB/T18655-2010三级限值时&#xff0c;那种焦虑感每个BMS工程师都深有体会。这不是简单的测试失败&#xff0c;而是产品设计中隐藏的高频噪…...

为OpenClaw智能体工作流配置Taotoken作为统一的模型调用后端

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为OpenClaw智能体工作流配置Taotoken作为统一的模型调用后端 对于使用OpenClaw框架构建AI智能体的开发者而言&#xff0c;一个稳定…...

LyricsX:一站式macOS歌词同步解决方案,让音乐体验更智能

LyricsX&#xff1a;一站式macOS歌词同步解决方案&#xff0c;让音乐体验更智能 【免费下载链接】LyricsX &#x1f3b6; Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX LyricsX是macOS平台上功能最全面的歌词同步工具&#xff…...

深度重构黑苹果系统架构:OpenCore实战解析与性能优化

深度重构黑苹果系统架构&#xff1a;OpenCore实战解析与性能优化 【免费下载链接】Hackintosh 国光的黑苹果安装教程&#xff1a;手把手教你配置 OpenCore 项目地址: https://gitcode.com/gh_mirrors/hac/Hackintosh 在传统PC硬件与macOS系统兼容性的技术探索中&#xf…...

【PHP】编写php扩展

【PHP】编写php扩展 第一步 下载PHP的源代码&#xff0c;如php-5.4.16。解压后进入php-5.4.16/ext目录。输入 ./ext/_skel –extnamemyext&#xff0c;myext就是扩展的名称&#xff0c;执行后生成myext目录。 ext/_skel是PHP官方提供的用于生成php扩展骨架代码的工具。 cd myex…...

管式土壤墒情监测站:深埋地下测湿度,云端上报助灌溉

管式土壤墒情监测站采用土壤介电常数检测原理&#xff0c;结合专业数学模型算法&#xff0c;搭配独创螺旋式测量电极结构开展高精度土壤含水率监测。土壤介电常数与土壤含水量存在稳定且精准的对应关系&#xff0c;设备通过传感器高频感知土层介电参数变化&#xff0c;经内置算…...

2026 AI大模型API加速网站推荐

在AI开发领域&#xff0c;一个现实问题始终困扰着开发者&#xff1a;如何接入模型厂商的官方API&#xff1f;在海外&#xff0c;注册、绑卡、调用这三个步骤就能轻松解决。然而&#xff0c;国内开发者面临着跨境网络波动、外币支付门槛、发票合规需求以及多厂商Key碎片化管理等…...

AI和大模型——拟合

一、拟合 Fitting,中文翻译成拟合&#xff0c;这个翻译还是比较贴切的。怎么理解拟合呢&#xff1f;其实非常好理解&#xff0c;如果接受过九年义务教育&#xff0c;基本都有极限或微积分的概念。有没有想起过积分中用高低不等的小矩形来拼凑出曲线面的面积&#xff0c;那个过程…...

FPGA LVDS输入作为模拟比较器的原理、设计与工程实践

1. 项目概述&#xff1a;当LVDS输入遇上模拟电压 最近几年&#xff0c;各大FPGA厂商都在力推自家的“模拟-数字转换器&#xff08;ADC&#xff09;IP核”&#xff0c;宣传其如何集成便利、性能优越。这让我这个老工程师不禁琢磨&#xff0c;这些IP核的底层原理究竟是什么&#…...

使用 llama.cpp + MTP 分支实现 1.5 倍 Token 输出加速实战指南

使用 llama.cpp MTP 分支实现 1.5 倍 Token 输出加速实战指南 摘要&#xff1a;本文详细介绍如何通过 llama.cpp 的 MTP&#xff08;Multi-Token Prediction&#xff09;PR 分支&#xff0c;配合 Qwen3.6-27B-MTP GGUF 量化模型&#xff0c;实现推理时每秒输出 token 数量翻倍…...