问题描述
问题出现在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因为引用丢失可能已经无法关闭了,该循环会在后台一直执行)文章来源:https://www.toymoban.com/news/detail-515167.html
解决方案:
解决方案如下,需要保证内存中只有一份叫做sequence的动画序列在执行,所以每次生成新序列之前需要把该引用sequence下的实际内存关闭掉:文章来源地址https://www.toymoban.com/news/detail-515167.html
// 解决方案:在生成新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;
}
}
到了这里,关于记录Dotween中Sequence频繁创建和关闭时出现的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!