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

Unity——QFramework工具 AciontKit时序动作执行系统

AciontKit 是一个时序动作执行系统。

游戏中,动画的播放、延时、资源的异步加载、网络请求等,这些全部都是时序任务,而 ActionKit,可以把这些任务全部整合在一起,使用统一的 API,来对他们的执行进行计划

延时回调

using UnityEngine;namespace QFramework.Example
{public class DelayExample : MonoBehaviour{void Start(){Debug.Log("Start Time:" + Time.time);ActionKit.Delay(1.0f, () =>{Debug.Log("End Time:" + Time.time);}).Start(this);}}
}// 输出结果
// Start Time: 0
// End Time: 1.00781

作用:在指定的时间后执行一个回调函数。

场景:在游戏中,你可能需要在一段时间后触发某个事件,比如在玩家完成某个任务后,1秒后显示奖励信息。 

序列和完成回调

using UnityEngine;namespace QFramework.Example
{public class SequenceAndCallback : MonoBehaviour{void Start(){Debug.Log("Sequence Start:" + Time.time);ActionKit.Sequence().Callback(() => Debug.Log("Delay Start:" + Time.time)).Delay(1.0f).Callback(() => Debug.Log("Delay Finish:" + Time.time)).Start(this, _ => { Debug.Log("Sequence Finish:" + Time.time); });}}
}
// 输出结果
// Sequence Start:0
// Delay Start:0
// Delay Finish:1.00537
// Sequence Finish:1.00537

作用:按顺序执行一系列动作,并在序列完成后执行一个回调。

场景:在游戏的开场动画中,你可能需要先播放一段动画,然后等待1秒,最后显示游戏标题。

 帧延时

using UnityEngine;namespace QFramework.Example
{public class DelayFrameExample : MonoBehaviour{void Start(){Debug.Log("Delay Frame Start FrameCount:" + Time.frameCount);ActionKit.DelayFrame(1, () => { Debug.Log("Delay Frame Finish FrameCount:" + Time.frameCount); }).Start(this);ActionKit.Sequence().DelayFrame(10).Callback(() => Debug.Log("Sequence Delay FrameCount:" + Time.frameCount)).Start(this);// ActionKit.Sequence()//      .NextFrame()//      .Start(this);ActionKit.NextFrame(() => { }).Start(this);}}
}// 输出结果
// Delay Frame Start FrameCount:1
// Delay Frame Finish FrameCount:2
// Sequence Delay FrameCount:11

作用:在指定的帧数后执行一个回调。

场景:在需要与游戏帧率同步的任务中使用,比如在每一帧更新UI元素的位置,或者在特定帧数时触发动画。

条件执行

using UnityEngine;namespace QFramework.Example
{public class ConditionExample : MonoBehaviour{private void Start(){ActionKit.Sequence().Callback(() => Debug.Log("Before Condition")).Condition(() => Input.GetMouseButtonDown(0)).Callback(() => Debug.Log("Mouse Clicked")).Start(this);}}
}// 输出结果
// Before Condition
// 鼠标左键按下后
// Mouse Clicked

作用:在满足特定条件时执行一个动作。

场景:在玩家输入响应中使用,比如只有当玩家按下鼠标左键时,才执行攻击动作。

重复执行

using UnityEngine;namespace QFramework.Example
{public class RepeatExample : MonoBehaviour{private void Start(){ActionKit.Repeat().Condition(() => Input.GetMouseButtonDown(0)).Callback(() => Debug.Log("Mouse Clicked")).Start(this);ActionKit.Repeat(5).Condition(() => Input.GetMouseButtonDown(1)).Callback(() => Debug.Log("Mouse right clicked")).Start(this, () =>{Debug.Log("Right click finished");});}}
}// 输出结果
// 每次点击鼠标左键都会输出:Mouse Clicked 
// 点击鼠标右键,只会输出五次:Mouse right clicked,第五次输出  Right click finished
// 

作用:重复执行某个动作,直到满足某个条件或达到指定次数。

场景:在游戏中实现连续点击得分的机制,或者在玩家持续按住某个键时重复执行某个动作。

并行执行

using UnityEngine;namespace QFramework.Example
{public class ParallelExample : MonoBehaviour{void Start(){Debug.Log("Parallel Start:" + Time.time);ActionKit.Parallel().Delay(1.0f, () => { Debug.Log(Time.time); }).Delay(2.0f, () => { Debug.Log(Time.time); }).Delay(3.0f, () => { Debug.Log(Time.time); }).Start(this, () =>{Debug.Log("Parallel Finish:" + Time.time);});}}
}// 输出结果
// Parallel Start:0
// 1.030884
// 2.025135
// 3.018883
// Parallel Finish:3.018883

作用:同时执行多个动作,并在所有动作完成后执行一个回调。

场景:在游戏加载时,可能需要同时加载多个资源,比如音乐、纹理和模型,并在所有资源加载完成后开始游戏。

自定义动作

using UnityEngine;namespace QFramework.Example
{public class CustomExample : MonoBehaviour{class SomeData{public int ExecuteCount = 0;}private void Start(){ActionKit.Custom(a =>{a.OnStart(() => { Debug.Log("OnStart"); }).OnExecute(dt =>{Debug.Log("OnExecute");a.Finish();}).OnFinish(() => { Debug.Log("OnFinish"); });}).Start(this);// OnStart// OnExecute// OnFinishActionKit.Custom<SomeData>(a =>{a.OnStart(() =>{a.Data = new SomeData(){ExecuteCount = 0};}).OnExecute(dt =>{Debug.Log(a.Data.ExecuteCount);a.Data.ExecuteCount++;if (a.Data.ExecuteCount >= 5){a.Finish();}}).OnFinish(() => { Debug.Log("Finished"); });}).Start(this);// 0// 1// 2// 3// 4// Finished// 还支持 Sequence、Repeat、Spawn 等// Also support sequence repeat spawn// ActionKit.Sequence()//     .Custom(c =>//     {//         c.OnStart(() => c.Finish());//     }).Start(this);}}
}

作用:允许用户创建自定义的动作序列,可以包含开始、执行和完成的回调。

场景:在需要实现复杂逻辑的动作序列时使用,比如一个技能的施放过程,可能包含开始施法、持续施法和施法完成的动画和效果。

协程支持

using System.Collections;
using UnityEngine;namespace QFramework.Example
{public class CoroutineExample : MonoBehaviour{private void Start(){ActionKit.Coroutine(SomeCoroutine).Start(this);SomeCoroutine().ToAction().Start(this);ActionKit.Sequence().Coroutine(SomeCoroutine).Start(this);}IEnumerator SomeCoroutine(){yield return new WaitForSeconds(1.0f);Debug.Log("Hello:" + Time.time);}}
}// 输出结果
// Hello:1.002077
// Hello:1.002077
// Hello:1.002077

作用:支持将Unity协程转换为ActionKit动作,以便在ActionKit中使用协程。

场景:在需要使用协程来实现延时或等待某些条件满足时,比如在NPC巡逻路径中,使用协程来控制巡逻的间隔和路径点的停留时间。 

相关文章:

Unity——QFramework工具 AciontKit时序动作执行系统

AciontKit 是一个时序动作执行系统。 游戏中&#xff0c;动画的播放、延时、资源的异步加载、网络请求等&#xff0c;这些全部都是时序任务&#xff0c;而 ActionKit&#xff0c;可以把这些任务全部整合在一起&#xff0c;使用统一的 API&#xff0c;来对他们的执行进行计划。…...

【Doris基础】Doris中的Replica详解:Replica原理、架构

目录 1 Replica基础概念 1.1 什么是Replica 1.2 Doris中的副本类型 2 Doris副本架构设计 2.1 副本分布机制 2.2 副本一致性模型 3 副本生命周期管理 3.1 副本创建流程 3.2 副本恢复机制 4 副本读写流程详解 4.1 写入流程与副本同步 4.2 查询流程与副本选择 5 副本…...

【中国·广州】第三届信号处理与智能计算国际学术会议 (SPIC2025) 即将开启

第三届信号处理与智能计算国际学术会议 (SPIC2025) 即将开启 在信息技术飞速发展的当下&#xff0c;信号处理与智能计算作为前沿科技领域&#xff0c;正深刻改变着我们的生活与产业格局。为汇聚全球顶尖智慧&#xff0c;推动该领域进一步突破&#xff0c;第三届信号处理与智能…...

Android12 Launcher3显示所有应用列表

Android12 Launcher3显示所有应用列表 1.前言&#xff1a; 最近在Android12Rom定制时需要显示所有桌面应用的图标&#xff0c;并且不能去掉抽屉&#xff0c;在手机上面抽屉和所有应该列表是两种不同模式&#xff0c;用户基可以自行选择&#xff0c;但是在自定义的launcher中这…...

24.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--认证微服务

SP.IdentityService 项目为微服务架构中的核心认证中心&#xff0c;采用 OpenIddict 框架实现 OAuth2.0 和 OpenID Connect 协议&#xff0c;提供完整的身份认证和授权解决方案。项目集成了 ASP.NET Core Identity 框架&#xff0c;实现了用户管理、角色权限控制等基础功能&…...

基于React Native开发鸿蒙新闻类应用的实战开发笔记

以下为基于React Native开发鸿蒙新闻资讯类应用的实战开发笔记&#xff0c;结合架构特性与踩坑经验&#xff0c;重点记录关键实现方案和技术决策&#xff1a; 一、环境搭建与工程初始化&#xff08;关键步骤复盘&#xff09; ​​Node.js版本锁定​​ 必须使用​​Node 18​​&…...

[Java 基础]运算符,将盒子套起来

在 Java 中&#xff0c;运算符&#xff08;Operator&#xff09;用于执行特定的操作&#xff0c;例如数学计算、赋值、比较等。运算符是 Java 语言的重要组成部分&#xff0c;能够帮助我们高效地操作数据。 1. 算术运算符 运算符说明示例结果加法5 38-减法5 - 32*乘法5 * 31…...

智能快递地址解析接口如何用PHP调用?

一、什么是智能快递地址解析接口 随着互联网技术的普及和电子商务的迅猛发展&#xff0c;网购已成为现代人日常生活的重要组成部分。然而&#xff0c;在这个便捷的背后&#xff0c;一个看似不起眼却影响深远的问题正悄然浮现——用户填写的快递地址格式混乱、信息不全甚至错漏…...

华为OD机试真题——模拟消息队列(2025B卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 B卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《模拟消息队列》: 目录 题…...

c# 显示正在运行的线程数

在 C# 中&#xff0c;若想获取当前进程正在运行的线程数&#xff0c;可以使用 System.Diagnostics 命名空间中的 Process 类来实现。该方法适用于 Windows 平台&#xff0c;并能够获取当前进程的线程信息&#xff0c;包括线程总数和运行中的线程数量。 ✅ 方法一&#xff1a;使…...

MySQL 日志数据同步的详细教程

以下是 MySQL 日志数据同步的详细教程&#xff0c;主要介绍基于二进制日志&#xff08;binlog&#xff09;的主从复制和基于 GTID 的高级同步方案&#xff1a; 一、MySQL 二进制日志&#xff08;binlog&#xff09;同步基础 1. 二进制日志原理 binlog 是 MySQL 的事务性日志&am…...

2025 Java面试大全技术文章(面试题1)

数据类型与包装类 问题&#xff1a;Java中基本数据类型与包装类的区别是什么&#xff1f;自动装箱与拆箱的底层原理&#xff1f; 答案&#xff1a; 基本数据类型&#xff08;如int、double&#xff09;直接存储值&#xff0c;包装类&#xff08;如Integer、Double&#xff09;…...

docker 中 什么是「卷」?(Volume)

&#x1f5c3;️ 什么是「卷」&#xff1f;&#xff08;Volume&#xff09; 「卷」就是 Docker 里用来“保存数据”的一块空间&#xff0c;就像是一个外接硬盘&#xff0c;或者一个 USB 闪存。 容器本身是临时的&#xff0c;你一删它&#xff0c;它的数据也跟着没了。但卷是用…...

三维可视化和实时数据处理对前端性能要求以及优化渲染效率

在三维可视化&#xff08;如 Three.js 场景&#xff09;和实时数据处理&#xff08;如每秒数百条设备状态更新&#xff09;场景中&#xff0c;前端性能优化是确保用户体验的核心挑战。以下结合技术原理与行业实践&#xff0c;详细说明Web Workers和虚拟 DOM的优化机制&#xff…...

基于VU37P的高性能采集板卡

基于VU37P的高性能采集板卡是一款最大可提供20路ADC接收通道的高性能采集板卡。每路A/D通道支持1GS/s的采样率&#xff0c;分辨率为14bit&#xff0c;模拟输入带宽可达500MHz&#xff0c;交流耦合&#xff0c;输入阻抗50欧姆。 产品简介 可提供20路ADC接收通道的高性能采集板…...

2025-05-31 Python深度学习10——模型训练流程

文章目录 1 数据准备1.1 下载与预处理1.2 数据加载 2 模型构建2.1 自定义 CNN 模型2.2 GPU加速 3 训练配置3.1 损失函数3.2 优化器3.3 训练参数 4 训练循环4.1 训练模式 (model.train())4.2 评估模式 (model.eval()) 5 模型验证 本文环境&#xff1a; Pycharm 2025.1Python 3.1…...

卷积神经网络(CNN)、YOLO和人脸识别之间的关系

核心关系图解 TEXT 摄像头图像 → [YOLO&#xff1a;人脸检测] → 定位人脸位置 → [CNN&#xff1a;特征提取] → 人脸特征向量 → [人脸识别系统] → 身份匹配 通俗比喻 想象你在一个拥挤的火车站找人&#xff1a; YOLO 是你的"快速扫描眼"&#xff1a; 一眼扫…...

K8S StatefulSet 快速开始

其实这篇文章的梗概已经写了很久了&#xff0c;中间我小孩出生了&#xff0c;从此人间多了一份牵挂。抽出一些时间去办理新生儿相关手续。初为人父确实艰辛&#xff0c;就像学技术一样&#xff0c;都需要有极大的耐心&#xff0c;付出很多的时间。 一、引子 1.1、独立的存储 …...

重新测试deepseek Jakarta EE 10编程能力

听说deepseek做了一个小更新&#xff0c;我重新测试了一下Jakarta EE 10编程能力&#xff1b;有点进步&#xff0c;遗漏的功能比以前少了。 采用Jakarta EE 10 编写员工信息表维护表&#xff0c;包括员工查询与搜索、员工列表、新增员工、删除员工&#xff0c;修改员工&#xf…...

nav2笔记-250603

合作背景&#xff1a; AMD与Open Navigation在过去几个月里进行了合作&#xff0c;旨在向ROS 2社区展示AMD强大的Ryzen AI、Embedded和Kria能力。 演示内容&#xff1a; 帖子提到&#xff0c;他们已经开始展示如何使用Ryzen AI为自主机器人产品提供动力&#xff0c;在各种现实世…...

指纹识别+精准化POC攻击

开发目的 解决漏洞扫描器的痛点 第一就是扫描量太大&#xff0c;对一个站点扫描了大量的无用 POC&#xff0c;浪费时间 指纹识别后还需要根据对应的指纹去进行 payload 扫描&#xff0c;非常的麻烦 开发思路 我们的思路分为大体分为指纹POC扫描 所以思路大概从这几个方面…...

LeetCode[404]左叶子之和

思路&#xff1a; 题目要求求出左叶子的和&#xff0c;左叶子的条件是左右节点为空且是左子树的叶子节点才叫左叶子节点&#xff0c;那么右子树的左叶子节点的和是什么呢&#xff1f;这样想就引出了递归的顺序&#xff0c;后序遍历&#xff0c;求出左右子树的节点和&#xff0c…...

mac环境下的python、pycharm和pip安装使用

Python安装 Mac环境下的python安装 下载地址&#xff1a;https://www.jetbrains.com.cn/pycharm/ 一直点击下一步即可完成 在应用程序中会多了两个图标 IDLE 和 Python launcher IDLE支持在窗口中直接敲python命令并立即执行&#xff0c;双击即可打开 Python launcher双击打…...

C语言多级指针深度解析:从一级到三级的奥秘

资料合集下载链接: ​​https://pan.quark.cn/s/472bbdfcd014​​ 在C语言中,指针是理解内存和进行底层编程的关键。我们知道,一个一级指针存储的是一个变量的内存地址。但C语言的强大之处在于,指针本身也可以有自己的地址,而存储这个指针的地址的变量,就是一个更高层次…...

uni-app学习笔记十九--pages.json全局样式globalStyle设置

pages.json 页面路由 pages.json 文件用来对 uni-app 进行全局配置&#xff0c;决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。 导航栏高度为 44px (不含状态栏)&#xff0c;tabBar 高度为 50px (不含安全区)。 它类似微信小程序中app.json的页面管理部…...

BUUCTF[极客大挑战 2019]Havefun 1题解

BUUCTF[极客大挑战 2019]Havefun 1题解 题目分析解题理解代码逻辑&#xff1a;构造Payload&#xff1a; 总结 题目分析 生成靶机&#xff0c;进入网址&#xff1a; 首页几乎没有任何信息&#xff0c;公式化F12打开源码&#xff0c;发现一段被注释的源码&#xff1a; 下面我们…...

【基础】Unity中Camera组件知识点

一、投影模式 (Projection) 1. 透视模式 (Perspective) 原理&#xff1a;模拟人眼&#xff0c;近大远小&#xff08;锥形体视锥&#xff09; 核心参数&#xff1a; Field of View (FOV)&#xff1a;垂直视场角 典型值&#xff1a;第一人称 60-90&#xff0c;驾驶舱 30-45 特…...

Tomcat优化篇

目录 一、Tomcat自身配置 1.Tomcat管理页面 2. 禁用AJP服务 3.Executor优化 4.三种运行模式 5.web.xml 6.Host标签 7.Context标签 8.启动速度优化 9.其他方面 二、JMeter测试 笔者推荐 一、Tomcat自身配置 1.Tomcat管理页面 我们可以打开Tomcat的管理页面&#xff…...

Temporal Fusion Transformer(TFT)扩散模型时间序列预测模型

1. TFT 简介 Temporal Fusion Transformer&#xff08;TFT&#xff09;模型是一种专为时间序列预测设计的高级深度学习模型。它结合了神经网络的多种机制处理时间序列数据中的复杂关系。TFT 由 Lim et al. 于 2019年提出&#xff0c;旨在处理时间序列中的不确定性和多尺度的依…...

【LangServe部署流程】5 分钟部署你的 AI 服务

目录 一、LangServe简介 二、环境准备 1. 安装必要依赖 2. 编写一个 LangChain 可运行链&#xff08;Runnable&#xff09; 3. 启动 LangServe 服务 4. 启动服务 5. 使用 API 进行调用 三、可选&#xff1a;访问交互式 Swagger 文档 四、基于 LangServe 的 RAG 应用部…...