DOTween が "This Tween has been killed and is now invalid" と警告してきた

f:id:Gigacee:20191012211701p:plain

DOTween の警告

ある日のこと。

DOTween を使っていたら、特に動作に問題はないけどなぜか警告を吐いてきました。

DOTWEEN ► This Tween has been killed and is now invalid

「あなたが操作しようとしたトゥイーンはすでに無効になってますよ~」とのこと。

該当のコードはこんな感じ:

if (tweener != null && tweener.IsPlaying())
{
    tweener.Complete();
}

トゥイーンが再生中だったら即完了にするよっていう処理です。

何の変哲もないコードだと思うけどなぁ……。null チェックもちゃんとしてるし、何がいけないんだろう🤔

調査

似たようなメソッドを並べてみて、片っ端から調べてみました(雑……!)。

if (tweener != null)
{
    Debug.Log(tweener.fullPosition);
    Debug.Log(tweener.CompletedLoops());
    Debug.Log(tweener.Delay());
    Debug.Log(tweener.Duration());
    Debug.Log(tweener.Elapsed());
    Debug.Log(tweener.ElapsedDirectionalPercentage());
    Debug.Log(tweener.ElapsedPercentage());
    Debug.Log(tweener.IsActive());
    Debug.Log(tweener.IsBackwards());
    Debug.Log(tweener.IsComplete());
    Debug.Log(tweener.IsInitialized());
    Debug.Log(tweener.IsPlaying());
    Debug.Log(tweener.Loops());
}

上記のコードを実行してみたところ、なんとtweener.IsActive()のみ警告が発生しないという結果に! どうやら、再生し終わったトゥイーンに対しては、有効かどうか以外を調べるのは非推奨のようです。tweener.IsPlaying()と書けば一応 false を返してくれるけど、そもそも tweener 自体がもう無効になっているからそんなこと聞いてくるな、ということか。

解決

ということで、以下のように書き換えると、無事警告は出なくなりました。*1

if (tweener != null && tweener.IsActive() && tweener.IsPlaying())
{
    tweener.Complete();
}

*1:この if 文中の tweener.IsPlaying() が警告されないのは、直前の tweener.IsActive() が false だったらその時点で式の評価が終了するからですね(短絡評価)。

The coloring of this site is Dracula PRO🧛🏻‍♂️
This website uses the FontAwesome icons licensed under CC BY 4.0.

2020 GIGA CREATION