読者です 読者をやめる 読者になる 読者になる

【Unity】同じMaterialが指定されているかチェックする

Unity エディタ拡張

Rendererに同じMaterialが指定されているかチェックしたいという要件がありまして。

より具体的に言うとFBXとそこから作られたPrefabのMaterialに差分がないかチェックするという感じだったのですけど、ブログに載せる用のFBXファイルを用意するのもアレだなーということで、「ねーよそんな要件」って感じですけどProjectビューで選択された2つのオブジェクトにおけるルートのRendererのMaterialが一致するかチェックするものを書きました。

gist.github.com

Materialの比較は30行目の以下のコードで行っています。

var result = targetMaterials.SequenceEqual (compareMaterials);

SequenceEqualを使えば順序も含め、2つのシーケンスが等しいかどうかをチェックすることができます。
Enumerable.SequenceEqual(TSource) メソッド (IEnumerable(TSource), IEnumerable(TSource)) (System.Linq)

順序は考慮せずにチェックしたい場合、長さチェックをした上でそれぞれの全要素が合致するか見ていってもいいんですが、27-28行目みたいにソートしてしまえばSequenceEqualが使いまわせます。

本題からは逸れますが、MenuItemの第二引数にtrueを指定したboolを返すメソッドを用意することで、指定したメニューを有効にするか無効にするかを判定することができます。

上のコードでいうと、11行目のメソッドで「Assets/CheckSameMaterials」を選択したときの振る舞いを定義し、35行目のメソッドでこのメニューを有効にするか無効にするかを判定するものを定義しています。
具体的には、Projectビューで選択しているオブジェクトが2つであり、かつ両方ともプレハブまたはFBXファイルである場合だけtrueを返しているので、この条件に合致しない場合は「Assets/CheckSameMaterials」がグレーアウトします。

スポンサーリンク