首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-03-03 16:42
  • 4240
  • 10661
blog.csdn.net

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • QQ群:398291828
  • 小红书
  • 小破站

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

一、前言

【Unity3D框架】SKFramework框架完全教程《全网最全》-专栏文章目录:
http://iyenn.com/rec/1695645.html

二、正文

2-1、介绍

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

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

2-2、使用说明

(1)引用命名空间

using SK.Framework;
using SK.Framework.Actions;
  • 1
  • 2

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

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

2-2-1、普通事件

代码:

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();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

结果:
在这里插入图片描述

2-2-2、Delay延迟事件

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

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();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

运行结果:
在这里插入图片描述

2-2-3、Timer定时事件

代码:

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

结果:
在这里插入图片描述

2-2-4、Until条件事件
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("执行事件");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
2-2-5、While条件事件
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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

运行结果:
在这里插入图片描述

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

代码:

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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

运行结果:
在这里插入图片描述

2-2-7、事件链

Sequence事件链示例代码:

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."));
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

在这里插入图片描述
Timeline事件链:

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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

运行结果:

在这里插入图片描述

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之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。
Unity爱好者社区
微信公众号
分享Unity相关的技术文章、工具资源等。
注:本文转载自blog.csdn.net的恬静的小魔龙的文章"https://itmonon.blog.csdn.net/article/details/143992109"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top