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巡逻路径中,使用协程来控制巡逻的间隔和路径点的停留时间。