「DOTween」の警告を解消する

警告が出た

DOTweenを使用してロジックを組んでいた所、以下の警告が出て気になりました。

DOTWEEN ► This Tween has been killed and is now invalid

原因

すでにTweenの再生が終了しているものに対して、DOTween APIを使用すると発生するようです。

if (tween != null && tween.IsPlaying()) // ここで警告が出ている
{
    tween.Complete();
}

上記のような場合、tweenがもう再生済みでKillされているにも関わらず

「IsPlaying()」がコールされた事で警告が発生します。

対策

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

というように「IsActive()」を追加する事で警告なしでTweenがすでに無効化されているかを確認できます。

公式ドキュメントにも、以下のように記載されているので、意図した挙動となっています。

Returns FALSE if the tween has been killed.

「C#」で「拡張メソッド」を作ろう

C#の拡張メソッドとは?

例えば、

"なにがし".IsNullOrEmpty()

で、引数の文字列が「nullまたは空」なら「true」を返すというメソッドがありますが、

都度、 「string.IsNullOrEmpty」 と記述されるのは長ったらしいので、

"なにがし".IsNullOrEmpty()  

といった書き方でも同様の処理ができるようにしたい時、拡張メソッドで実現可能です。

上記のように「既存の型」に対して、「新しい機能を追加」できる概念を「拡張メソッド」といいます。

実例

string a = "123";
string b = null;
Console.WriteLine( $"{a.IsNullOrEmpty()}/{b.IsNullOrEmpty()}" ); 
```shell > false/true

こんな感じで、文字列の後ろにメソッドを書く感じにします。

やりかた

基本的に 「public staticなクラス」 の中に

「public staticなメソッド」 を作って

「最初の引数の頭にthisというキーワードをつける」 だけでOKです。

実際に書いてみます。

public static class StringUtility
{
    public static bool IsNullOrEmpty( this string str )
    {
        return string.IsNullOrEmpty(str)
    }
}

これだけです。

追加した拡張メソッドを使って処理を書くと、以下のようになります。

Console.WriteLine( $"{"ABC".IsNullOrEmpty()} ); // false

string test = null;
Console.WriteLine( $"{test.IsNullOrEmpty()} ); // true

“ABC” も文字列リテラルのstring扱いなので、

(今回のメソッドでは、ほぼ無意味ですが)そのまま拡張メソッドを使用可能です。

まとめ

  • 適当な名前の「public static class」を追加
  • 「public static」なメソッドに「bool」を返してほしいので、戻り値に「bool」
  • 「最初の引数の頭にthis」というキーワードをつける
  • あとは、処理を書くだけ

こうする事で、「thisを付けた型」の変数の後ろに「ドット 拡張メソッド名」の形式で呼べるようになります。

ちなみに、「クラス名」「メソッド名」「thisの後ろの型」「thisの後ろの変数名」は任意に付けられますので、

必ず上記サンプルの名前でなくてはならないという事ではない点は、抑えておきましょう。

色々、応用が聞くので自分なりの拡張メソッドで開発を効率化しましょう!