记录Dotween中Sequence频繁创建和关闭时出现的问题

问题描述

问题出现在Unity的Button点击事件中,对同一个Sequence引用,频繁使用OnPointerDown和OnPointerUp事件来控制其创建和Kill() 时,会因处理速度问题导致出现其中某次的Sequence没有被正确关闭:

首先全局声明一个 sequence 引用:

Sequence sequence = DOTween.Sequence();

然后在两个连续快速触发的函数中分别创建,Kill该sequence:

    // 鼠标按下时,用引用sequence创建一个新的序列
    public override void OnPointerDown(PointerEventData eventData)
    {
        sequence = DOTween.Sequence();
        // infinite循环执行调用一个函数 MassiveFunctionA
        sequence.AppendCallback(MassiveFunctionA).SetDelay(0.1).SetLoops(-1);
    }

    // 鼠标抬起时,将当前的sequence引用下的序列kill掉; 但在此之前执行了一段很重的
    // 代码 MassiveFunctionB
    public override void OnPointerUp(PointerEventData eventData)
    {
        MassiveFunctionB()
        sequence.Kill();
        sequence = null;
    }

按设计上的思路,上述代码会在按下时循环执行MassiveFunctionA,在抬起时中止循环,再次按下时再循环执行MassiveFunctionA,再抬起再中止循环;

问题分析:

然而实际情况时当极快速的连续点击(down-up-down)时, 当第二次down执行到 sequence = DOTween.Sequence()时, OnPointerUp中的MassiveFunctionB()仍未处理完,故在sequence.Kill()未被执行时,就执行了一遍第二次down中的 DOTween.Sequence(),此时如果OnPointerUp继续执行下去会关闭第二次down时生成的 sequence(猜想是第一次down时生成的sequence因为引用丢失可能已经无法关闭了,该循环会在后台一直执行)

解决方案:

解决方案如下,需要保证内存中只有一份叫做sequence的动画序列在执行,所以每次生成新序列之前需要把该引用sequence下的实际内存关闭掉:

    // 解决方案:在生成新sequence前执行一遍 Kill 和 null 操作, 防止OnPointerUp没有正确关闭仍在运行中的sequence
    public override void OnPointerDown(PointerEventData eventData)
    {
        if (sequnce != null) 
        {
            sequence.Kill();
            sequence = null;
        }
        sequence = DOTween.Sequence();
        // infinite循环执行调用一个函数 MassiveFunctionA
        sequence.AppendCallback(MassiveFunctionA).SetDelay(0.1).SetLoops(-1);
    }

    public override void OnPointerUp(PointerEventData eventData)
    {
        MassiveFunctionB()
        if (sequnce != null) 
        {
            sequence.Kill();
            sequence = null;
        }
    }

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值