(この記事の使用環境: Unity 2018.1.0b9 Personal、Visual Studio Community 2017, Windows10)

前書き

前回記事を受けて。

前回記事で紹介したとおり、Layer Layer Collision Matrix を適切に設定することにはさまざまな利点があります。前回記事では Layer Collision Matrix のチェックをいったんすべて外して、必要なものだけチェックを入れ直した画面を紹介しました。しかし、たくさんのチェックボックスを手作業でひとつずつポチポチと押していくのはけっこう面倒ですね。

そこで見つけたのがこちらの記事 ↓ です。チェックをまとめて外すことができるエディター拡張のスクリプトです。すごく便利!

実際これ ↑ をそのまま使わせてもらえば解決なんですけどね。

お勉強を兼ねてエディター拡張のスクリプトをいじってみた

上記リンク先の記事で紹介されているエディター拡張のスクリプトがどういう処理内容になっているのかお勉強するためと、Physics 用Physics2D 用をひとつにまとめたい、実行前に警告メッセージを出したい、などと思い、編集してみました。

こんな感じになった

こんな感じ。
// ClearLayerCollisionMatrix.cs

using UnityEngine;
using UnityEditor;
using static UnityEditorInternal.InternalEditorUtility; // using static は C#6 以降で使用可能
using static UnityEngine.LayerMask;                     // 同上

/// <summary>
/// [エディター拡張] Layer Collision Matrix のチェックをすべてクリアする (Physics / Physics2D)
/// </summary>
public class ClearLayerCollisionMatrix : MonoBehaviour
{
    [MenuItem ( "Tools/Clear_LayerCollisionMatrix" )]
    private static void Clear3D () => ClearMatrix ( false );	// C#6-


    [MenuItem ( "Tools/Clear_LayerCollisionMatrix2D" )]
    private static void Clear2D () => ClearMatrix ( true );	// C#6-
    

    private static void ClearMatrix ( bool isPhysics2d )
    {
        if ( !Confirm ( isPhysics2d ) ) return;

        foreach ( var layer1 in layers )
            foreach ( var layer2 in layers )
                if ( isPhysics2d )
                    Physics2D.IgnoreLayerCollision ( NameToLayer ( layer1 ), NameToLayer ( layer2 ), true );
                else
                    Physics.IgnoreLayerCollision ( NameToLayer ( layer1 ), NameToLayer ( layer2 ), true );
    }

    private static bool Confirm ( bool isPhysics2d )
    {
        var type = isPhysics2d ? "Physics 2D" : "Physics";

        return EditorUtility.DisplayDialog ( "Warning!",
            type + "\nLayerCollisionMatrixの設定をすべてクリアします" +
            "\n※実行後は元に戻せません", "OK", "Cancel" );
    }
}

この記事に書いたような C#6 の記法を積極的に使ってみています。

エディター拡張の参考資料はこちら

どうやらエディター拡張に使う UnityEditorInternal 以下のクラスについてはUnity公式ドキュメントが公開されていないようです。上記スクリプトの編集にあたってはこちら ↓ を参考にさせてもらいました。

エディター拡張についてのまとまった資料は こちら ↓ でしょうか。Unityまとめ を運営されている @kyusyukeigo さんの著書ですね。なんとWeb版は無料公開中。大感謝!


使い方

さて話を戻して、エディター拡張スクリプトの使い方です。
  1. Unityのプロジェクトで、Projectビューの Assets フォルダ直下に Editor フォルダを作り、その中にこのスクリプトを置く
    png
  2. Unityエディター上部の Tools メニュー以下に  Clear_LayerCollisionMatrix  と Clear_LayerCollisionMatrix2D という2つの項目が表示されるので、3Dプロジェクトなら前者、2Dなら後者を選ぶ
    png
  3. 警告メッセージが出る。OKを押せば実行される。キャンセルなら実行されない(実行後は元に戻せないので注意!
    png
  4. 実行すると Layer Collision Matrix のチェックがすべて外れる
    png

まとめ

今回は資料を強く参考にさせてもらいつつ、初めてエディター拡張を編集してみました。エディター拡張まわりは公式ドキュメントが公開されていないらしいのでそこが難点ですが、ネットの情報を頼りにすれば簡単なものは作れそうです。今回作ったものは自分で欲しかったものなので、今後Unityの新規プロジェクトを作るたびに使っていきたいと思います。

今回は以上です。