【SKFramework框架核心模块】3-1、事件链模块

推荐阅读

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

【Unity3D框架】SKFramework框架完全教程《全网最全》-专栏文章目录:
https://blog.csdn.net/q764424567/article/details/143926557

二、正文

2-1、介绍

事件链模块,框架内置了八种类型的事件:

  • Simple普通事件:普通事件可以理解为一个简单的Action回调函数。
  • Delay延迟事件:延迟事件需要指定一个时长,在经过该时长后执行指定的回调函数。
  • Timer定时事件:定时事件可以理解为定时器,分为正计时和倒计时,通过参数isReverse指定,事件为Action<float>类型,通过已经计时时长或剩余的时长调用执行。
  • Until条件事件:条件事件,需要指定Func<bool>条件,直到条件满足后,调用回调函数,事件结束。
  • While条件事件:While事件同样需要指定Func<bool>提交,与Until事件不同的是,While条件事件中设置的回调函数在条件成立时会一直调用,不成立时,事件结束。
  • Animate动画事件:Animate动画事件,是指在Animator播放动画后,事件结束。
  • Timeline时间轴事件:时间轴事件需要指定事件的开始时间和事件执行的时长,需要配合Timeline.ActionChain时间轴事件链使用。

2-2、使用说明

(1)引用命名空间

csharp 复制代码
using SK.Framework;
using SK.Framework.Actions;

(2)使用某个类型的事件,就新建这个类型的事件类,然后传入Action,最后在合适的位置调用即可。

(3)根据不同的需求,使用不同的事件。

2-2-1、普通事件

代码:

csharp 复制代码
using UnityEngine;
using SK.Framework;
using SK.Framework.Actions;

public class UseActionTest : MonoBehaviour
{
    private SimpleAction simple;
    void Start()
    {
        simple = new SimpleAction(()=> Debug.Log("普通事件"));
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            simple.Invoke();
        }
    }
}

结果:

2-2-2、Delay延迟事件

Invoke后,还需要等待3秒才执行:

csharp 复制代码
using UnityEngine;
using SK.Framework;
using SK.Framework.Actions;

public class UseActionTest : MonoBehaviour
{
    private DelayAction deAction;
    void Start()
    {
        deAction = new DelayAction(3,()=>Debug.Log("延迟事件"));
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            deAction.Invoke();
        }
    }
}

运行结果:

2-2-3、Timer定时事件

代码:

csharp 复制代码
using UnityEngine;
using SK.Framework;
using SK.Framework.Actions;

public class UseActionTest : MonoBehaviour
{
    private TimerAction timeAction;

    void Start()
    {
        // 参数:时间、倒计时还是正计时、回调事件
        timeAction = new TimerAction(3, true ,(value)=> TimeValueShow(value));
        timeAction.Invoke();
    }

    private void TimeValueShow(float timeValue)
    {
        Debug.Log("延迟事件" + timeValue);
    }
}

结果:

2-2-4、Until条件事件
csharp 复制代码
using UnityEngine;
using SK.Framework;
using SK.Framework.Actions;

public class UseActionTest : MonoBehaviour
{
    private UntilAction m_Action;

    void Start()
    {
        // 直到鼠标右键按下才会继续执行
        m_Action = new UntilAction(() => { return Input.GetMouseButtonDown(1); }, ActionEvent);
        m_Action.Invoke();
    }

    private void ActionEvent()
    {
        Debug.Log("执行事件");
    }
}
2-2-5、While条件事件
csharp 复制代码
using UnityEngine;
using SK.Framework;
using SK.Framework.Actions;
using DG.Tweening;

public class UseActionTest : MonoBehaviour
{
    private WhileAction m_Action;

    void Start()
    {
        m_Action = new WhileAction(()=>Input.GetKeyDown(KeyCode.W),()=>Debug.Log("执行事件"));
        m_Action.Invoke();
    }
}

运行结果:

2-2-6、Timeline时间轴事件

代码:

csharp 复制代码
using UnityEngine;
using SK.Framework;
using SK.Framework.Actions;
using DG.Tweening;

public class UseActionTest : MonoBehaviour
{
    private TimelineAction m_Action;

    void Start()
    {
        m_Action = new TimelineAction(0, 5, (value) => Debug.Log(value));
        m_Action.Invoke();
    }
}

运行结果:

2-2-7、事件链

Sequence事件链示例代码:

csharp 复制代码
using UnityEngine;
using SK.Framework;
using SK.Framework.Actions;

public class UseActionTest : MonoBehaviour
{
    private SequenceActionChain m_Action;

    void Start()
    {
        m_Action = (SequenceActionChain)new SequenceActionChain()
            .Event(() => Debug.Log("Begin"))
            //嵌套一个并发事件链
            .Append(new ConcurrentActionChain()
                .Delay(1f, () => Debug.Log("1f"))
                .Delay(2f, () => Debug.Log("2f"))
                .Delay(3f, () => Debug.Log("3f"))
                as IAction)
            //并发事件链执行完成后 继续执行序列事件链
            .Until(() => Input.GetKeyDown(KeyCode.A))
            .Event(() => Debug.Log("A Pressed."))
            .Timer(3f, false, s => Debug.Log(s))
            .Begin()
            .OnStop(() => Debug.Log("Completed."));
    }
}

Timeline事件链:

csharp 复制代码
using UnityEngine;
using SK.Framework;
using SK.Framework.Actions;

public class UseActionTest : MonoBehaviour
{
    [SerializeField] private GameObject cube;
    [SerializeField] private GameObject sphere;

    private TimelineActionChain timeline;

    private void Start()
    {
        timeline = new TimelineActionChain()
            //通过Append添加时间轴事件
            //第一个参数表示该事件开始的时间节点
            //第二个参数表示该事件的时长
            .Append(0f, 5f, s => cube.transform.position = Vector3.Lerp(Vector3.zero, new Vector3(0, 0, 5f), s))
            .Append(2f, 4f, s => sphere.transform.position = Vector3.Lerp(Vector3.zero, Vector3.up * 2f, s))
            .Begin() as TimelineActionChain;

        //2倍速
        timeline.speed = 2f;
    }

    private void OnGUI()
    {
        GUILayout.BeginHorizontal();
        GUILayout.Label("时间轴");
        //通过Slider调整CurrentTime 实现从指定的时间节点执行
        timeline.currentTime = GUILayout.HorizontalSlider(timeline.currentTime, 0f, 6f, GUILayout.Width(300f), GUILayout.Height(50f));
        GUILayout.EndHorizontal();
    }
}

运行结果:

2-3、实现及代码分析

首先,分析一下普通事件,是如何实现的。

这个是Action接口,包含最基础的Invoke和Reset函数。

抽象事件类:

应付简单的Action,如果是复杂的Action,就调用实现类的的OnOnvoke。

传进去Action,Invoke就完事了。

复杂的Action,比如延迟Delay事件:

就实现自己的Invoke事件,非常精妙。


事件链包含三种类型,分别是Timeline时间轴事件链、Sequence序列事件链和Concurrent并发事件链,均继承自IActionChain接口,包含Begin启动、Pause暂停、Resume恢复、Stop终止函数。

时间轴事件链中包含的核心变量如下:

(1).currentTime 当前执行的时间节点

(2).speed 执行的速度

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏 方向 简介
GameFramework框架 框架 Unity之GameFramework框架快速应用、使用说明、源码分析等文章合集。
Unity3D开发小游戏 小游戏开发教程 分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶 入门 从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUI UGUI Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据 文件读取 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合 数据集合 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发 虚拟仿真 总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件 插件 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发 日常记录 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG 日常记录 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。
相关推荐
Cici_ovo14 分钟前
godot游戏引擎_瓦片集和瓦片地图介绍
游戏引擎·godot
Unity_RAIN2 小时前
Unity Lua方向的面试真题详解
unity·面试·lua
政安晨6 小时前
政安晨【零基础玩转各类开源AI项目】探索Cursor-AI Coder的应用实例
vscode·编辑器·ai编程·cursor·ai产品经理·ai开发·aicoder
思考的橙子7 小时前
CSS之3D转换
前端·css·3d
耐心的等待52838 小时前
调大Vscode资源管理器字体
ide·vscode·编辑器
tealcwu10 小时前
【Unity踩坑】Unity中父对象是非均匀缩放时出现倾斜或剪切现象
unity·游戏引擎
Little丶Seven11 小时前
Unity UGUI原理剖析
ui·unity·图形渲染
你疯了抱抱我14 小时前
【VRChat 改模】开发环境搭建:VCC、VRChat SDK、Unity 等环境配置
unity·游戏引擎·vr·vrchat
狮子座的男孩15 小时前
VSCode 使用教程:项目使用配置、使用哪些插件、Live Server使用问题及解决方案(你想要的,都在这里)
经验分享·vscode·编辑器·配置·插件·live server·问题解决方案