「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の後ろの変数名」は任意に付けられますので、

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

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

TypeScriptで「文字列」を「数値」に「変換」する方法

TypeScriptで文字列→数値に変換

文字列を数値にする変換する方法のメモ。
基本的にNumber()メソッドに文字列を渡せばOK。
let num:number = Number("12345")

GitHub登録時のメール認証時に「What!?」エラーが出る

経緯


GitHubに、メインアカウントとは別のアカウントを用意しました。

登録自体は正常に終了し、メール認証してね画面まで進んだところ・・ 


謎のエラーに遭遇

認証メールからGitHubにログインするとエラーが出て入れません。 

 What‽ Your browser did something unexpected. Please try again. If the error continues, try disabling all browser extensions or using a different browser. Please contact us if the problem persists.


解決方法

Chromeで開いていたのを、シークレットモードからログインすればなんなく進みました。

シークレットじゃない状態でも開けるようにするには、

おそらく複数アカウントを持っていると出るので、

一度、普通にログイン済みのアカウントをログアウトかつ、

ブラウザのキャッシュなどをクリアしないと解決しないと思われます。

Unityの「instantiate is null」エラーを解決する

問題点

インスペクタに正しく参照を設定しているにも関わらず、

ArgumentException: The Object you want to instantiate is null. UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) 

がコンソールに出ました。

なぜか未実行時にも出て、実行時にも当然出るのでおかしいなと思っていたのですが、
ステップ実行したら一瞬で原因がわかりました。

原因


- 「Awake」ではなく「クラスコンストラクタ」でInstantiateしていました。
- もともとピュアクラスだったものをビヘイビアに変えたときにコンストラクタをAwakeにするのを忘れていました。
- 「コンストラクタ」をやめて「Awake」内に入れて解決しました。

NG例:

public class YourClass : MonoBehaviour
{
    public YourClass() {
        var dest = Instantiate( sourcePrefab );
    }
}

OK例:

public class YourClass : MonoBehaviour
{
    private void Awake() {
        var dest = Instantiate( sourcePrefab );
    }
}


まとめ


クラスコンストラクタをAwakeに書き直してみましょう!