如何在 DOTween 中实现异步?

How to implement async in DOTween?

我正在制作一个使用 DOTween 弹出弹出屏幕的动画。

private void OnEnable()
{
  dialogueBoxTransform.localScale = new Vector3(0.7f, 0.7f, 0.7f);
  dialogueBoxTransform.DOScale(new Vector3(1.2f, 1.2f, 1.2f), 0.2f);
  dialogueBoxTransform.DOScale(Vector3.one, 0.1f);
}

上面代码的问题是 DOScale() 方法之一被忽略了。

所以我正在尝试使用 async-await 来实现它。

但是,当我使用Task.Run()时它抛出异常,因为它不是主线程。所以,不使用Task.Run(),你应该解决它。

为此,我需要创建一个 returns 任务的方法,但我不知道该怎么做。

private async void OnEnable()
{
  dialogueBoxTransform.localScale = new Vector3(0.7f, 0.7f, 0.7f);

  await Test();
      
  dialogueBoxTransform.DOScale(Vector3.one, 0.1f);
}

private Task Test()
{
  dialogueBoxTransform.DOScale(new Vector3(1.2f, 1.2f, 1.2f), 0.2f);
  return ???
}

如果能帮助我做什么,我将不胜感激。

使用 DOTween 的 sequence feature。第二个 DOScale-command 被忽略,因为第一个还没有完成。

正如@rbcode 提到的,您应该使用序列。这是一个强大的工具,可让您组合补间、添加回调等。

在你的情况下它应该是这样的:

dialogueBoxTransform.localScale = new Vector3(0.7f, 0.7f, 0.7f);

var sequence = DOTween.Sequence();
sequence.Append(dialogueBoxTransform.DOScale(new Vector3(1.2f, 1.2f, 1.2f), 0.2f));
sequence.Append(dialogueBoxTransform.DOScale(Vector3.one, 0.1f));

sequence.Play();

如果你想在序列完成后执行代码,你可以在调用之前添加一个回调Play:

sequence.AppendCallback(() => {
   //Insert your logic here.
});

sequence.Play();

作为选项,您可以将 https://github.com/Cysharp/UniTask#external-assets 用于 DoTween 异步。它免费且易于使用。