fc2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »マテリアル
このページの記事一覧

【Unity】マテリアルで使用しているシェーダを調べる  


 わりと何でもない事だけど、意外とググってもあまり出てこなかったので、メモ。

 簡単に言うと、判別はシェーダの名前(文字列)で判別するのが簡単。名前はインスペクタで Material をクリックしたときに出る情報の一番上にある「Shader」の文字列だね。Standard シェーダを使っていれば「Standard」、MToon シェーダを使ってるなら「VRM/MToon」となってるあれだ。正確に判別するなら、スラッシュ('/')を含めたフルパスにすれば良いし、バリエーション[Standard (Specular setup) 等]を含めるなら一部を判別するのも良い。

(※) Unity 2020.3.34f1 / Windows11(x64) で確認

 そう考えるとコードにするのは簡単だ。例えば以下のような感じで判別すれば良いだろう。

●マテリアルに Standard Shader が当てられていたら、メッセージを出す
Material material;  //何かのマテリアルがセットされているとする

if (material.shader.name.Equals("Standard", StringComparison.Ordinal))
{
Debug.Log("This material uses Standard Shader.");
}

 Eqauls に StringComparison.Ordinal オプションを付けてるのは、以前記事にした「StartsWith, EndsWith が遅いのなら、Equals も遅いのか?」のときの知見から。"==" 演算子でも良いが、参照比較と紛らわしいので(文字列の場合はおおよそ大丈夫だが)、最近は Ordinal オプション付きで比較することが多い(実行速度も速い)。Unity マニュアルにも文字列比較の遅さが指摘されているが、私が実験した所、Ordinal オプション(単純な文字列の並びだけで比較)さえ付けていれば、実行速度が極度に遅くなることは無かった(100文字程度なら全然変わらない)。C# のバージョンにもよるかもだが、覚えておくと役に立つこともあるだろう。

 以上の事が理解できたなら、よく使うものは拡張メソッドにしておくのが簡単だ。例えば Stanard, MToon 判別なら、以下のように作るのも良い。

●Material に Standard Shader 系/MToon 系が使われているか?(バリエーションも含む)
using System;
using UnityEngine;

/// <summary>
/// Material に Standard Shader 系が使われているか?(バリエーションも含む)
/// 2022/11/30 Fantom
/// http://fantom1x.blog130.fc2.com/blog-entry-421.html
/// </summary>
/// <param name="material">調べる Material</param>
/// <returns>true のとき Standard (バリエーション含む)</returns>
public static bool IsAnyStandardShader(this Material material)
{
if (material == null)
return false;

return material.shader.name.StartsWith("Standard", StringComparison.Ordinal);
}

/// <summary>
/// Material に MToon Shader 系が使われているか?(バリエーションも含む)
/// ※"VRM/MToon" だが、UniVRM 0.89時点なので注意(1.0以降は"VRM10/MToon10")
/// 2022/11/30 Fantom
/// http://fantom1x.blog130.fc2.com/blog-entry-421.html
/// </summary>
/// <param name="material">調べる Material</param>
/// <returns>true のとき MTonn (MToon10 等含む)</returns>
public static bool IsAnyMToonShader(this Material material)
{
if (material == null)
return false;

return material.shader.name.Contains("MToon");
}

 実際にはプロジェクトに何のシェーダが含まれているかで真になる範囲は異なってしまうので、厳密にしたければ、Equals(name, StringComparison.Ordinal) でフルパス完全一致にするのも良いだろう。その辺は好きにやって欲しい。

 問題は文字列判別なので、「Autodesk Interactive」のように名前が変わったもの(Unity2017 以前は「Standard (Roughness setup)」となっていた)は注意が必要だけどね。厳密にするならプリプロセッサ(#if~)で Unity バージョン分けした方が良いかも知れない。






 最近は VRM Live Viewer でもシェーダを使う機能が多くなってきた。実はなるべく Unity の標準機能で作った方が後バージョンの互換性が高いので、以前は避けていた感あるが、Unity は既にこれまでの Standard Shader 等を使う BRP(Built-in Render Pipeline) はレガシーとしているので、いずれ SRP(Scriptable Render Pipeline) に移行しなくてはならないのがわかってるんだよね。

 問題はシェーダを使った機能は互換性が全く無くなってしまうこと。しかし現行の Unity製アプリやサービス(特に2020年以前からあるもの)は BRP を前提として作られているので、なかなか移行タイミングが難しい。全てを捨てて移行するならともかく、過去の大量の資産(対応素材)も捨てることになるからね。なので Asset Store でも「SRPとの互換性」が表示されていたり、BRP/SRP 両方の .unitypackage が含まれているものも出てきている。まぁ、有料アセットはサポートあるもの多いけど、無料アセットはほぼ絶望的だね。まず移行できるものは少ない。なので少し諦めがついたという所かな。こうなれば SRP に移行する直前まで、BRP でできることを何でも入れてしまえ、みたいな(笑)。まぁ、結果できることは増えているよ。しかし本当に SRP に移行するときには、ほぼ全て作り直し(内部的には別物)しなくちゃならないけどね。

 実際、無料アプリって報酬0だから、システム的な仕様変更・移行はめちゃくちゃしんどい。それに現代は「アプリは無料で作って貰えるのが当たり前」って風潮が強いので「あれ欲しい・これ欲しい。次は〇〇あったらいいな」と延々と言われ続ける。企業なら先行投資としていずれ利益になるから良いかもだが、個人ではただ単に知らない人にタカられてるだけに過ぎないからね。超有名なソフトの開発者が通常表に出て来ず、雲隠れしてしまう気持ちが何となくわかる。無名な私ですら年間100件ほど来るのだ。有名なら1000件は下らないだろう(有名なクリエーターが年間700件[=1日2件]でも大量に時間を取られる事に気づき、仕方なく有料にした話もある)。

 よく考えてみればわかるが、個人に対する要求はその人の貴重な活動時間を奪い、他人のために無償で時間を使え、と言われてるようなものだ。これはその人がやりたい活動や予定を阻害してるのと同義となる。逆に自分が何かやろうと思っていたときに、他人の都合で邪魔されたら嫌だろう?特に個人で活動・配布してくれてる人には気をつけて欲しいかな。要求だけ突きつけて、規約も守らず、いい加減に使われていたら、やる気を無くす人も多い(パッタリやめてしまう人も少なくない)。いつでも「自分が逆の立場だったらどう感じるか?」を考えて欲しいね。そういうお互いの理解が無いとずっとは続けられない(だいたい1~2年が最初の山、3年超えると安定し、5年で世の中の状況が変わり進退を決める時が来る。10年超えはもう活動もその人の一部となる。そこまで行ったら沢山の出会いと別れを経験する[=もう活動やめてしまった人の方が圧倒的に多くなる]。結局他人の思いつきでタダ働きさせられた事実だけが残る)。あと5年経ったら今活動している人どれくらい残ってるかな…?ちなみに私は20年はとっくに超えている(昔はSNS自体が存在しなかっただけ)。もうそうなると知識×経験の掛け合わせで、無限にアイデアは浮かぶようになる(現に VRM Live Viewer は4年を超えてるがアイデアは尽きたことなく、今なお増え続けている)。時間はいくらあっても足りないくらいにね(笑)。






(関連記事)
【Unity】【C#】StartsWith, EndsWith が遅いのなら、Equals も遅いのか?
【Unity】ガンマ(Gamma, sRGB) - リニア(Linear) 値の相互変換
【Unity】Quality (グラフィック品質) を文字列で取得/設定する


関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityリファレンス  マテリアル  シェーダ 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop