お世話になっております。
シェーダーのプロパティで複数枚のテクスチャを追加し、スクリプトから動的にテクスチャを切り替える処理を書いています。
スクリプトからテクスチャを取得する場合、nameやidを指定すると思うのですが、
文字を直接打ち込むのはよろしくない気がしたので、まずシェーダーのプロパティからnameやidを取得したいと考えました。
そこでGetTexturePropertyNames()やGetTexturePropertyNameIDs()を使ったのですが、
シェーダーのプロパティで追加したテクスチャ以外の_MainTexや_BumpMapや_EmissionMapなども持ってきてしまいました。
自分でシェーダーのプロパティに追加した物だけを取得したいのですが、どう区別をつければよいでしょうか。
プロパティで宣言する際にタグを仕込めたりしないかと色々と調べてみたのですが、どうにも分かりません。
御教示のほど、何卒よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
ビルトインのコードに含まれているものも追加したものもプロパティとしては対等だろうと思いますので、区別することはできないんじゃないかと思います...
何か比較対象となるシェーダー(たとえばStandard)からもプロパティ名を取得して、Exceptで差を取るというのはどうでしょうか?
一例として、下記のようなStandardシェーダーからDetail関連プロパティを削除、_AdditionalTexを追加したシェーダーを...
ShaderLab
1Shader "Custom/CustomStandard" 2{ 3 Properties 4 { 5 _Color("Color", Color) = (1,1,1,1) 6 _MainTex("Albedo", 2D) = "white" {} 7 8 _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5 9 10 _Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5 11 _GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0 12 [Enum(Metallic Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel ("Smoothness texture channel", Float) = 0 13 14 [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0 15 _MetallicGlossMap("Metallic", 2D) = "white" {} 16 17 [ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0 18 [ToggleOff] _GlossyReflections("Glossy Reflections", Float) = 1.0 19 20 _BumpScale("Scale", Float) = 1.0 21 [Normal] _BumpMap("Normal Map", 2D) = "bump" {} 22 23 _Parallax ("Height Scale", Range (0.005, 0.08)) = 0.02 24 _ParallaxMap ("Height Map", 2D) = "black" {} 25 26 _OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0 27 _OcclusionMap("Occlusion", 2D) = "white" {} 28 29 _EmissionColor("Color", Color) = (0,0,0) 30 _EmissionMap("Emission", 2D) = "white" {} 31 32 [Enum(UV0,0,UV1,1)] _UVSec ("UV Set for secondary textures", Float) = 0 33 34 // Blending state 35 [HideInInspector] _Mode ("__mode", Float) = 0.0 36 [HideInInspector] _SrcBlend ("__src", Float) = 1.0 37 [HideInInspector] _DstBlend ("__dst", Float) = 0.0 38 [HideInInspector] _ZWrite ("__zw", Float) = 1.0 39 40 _AdditionalTex("Additional Texture", 2D) = "white" {} 41 } 42 43 // 省略 44}
下記スクリプトでStandardシェーダーと比較してみたところ...
C#
1using System.Linq; 2using UnityEngine; 3 4public class CustomPropertyFinder : MonoBehaviour 5{ 6 private void Start() 7 { 8 var matA = new Material(Shader.Find("Standard")); 9 var texNamesA = matA.GetTexturePropertyNames(); 10 Debug.Log($"Texture properties of {matA.shader.name}:"); 11 foreach (var textureName in texNamesA) 12 { 13 Debug.Log($"\t{textureName}"); 14 } 15 16 var matB = new Material(Shader.Find("Custom/CustomStandard")); 17 var texNamesB = matB.GetTexturePropertyNames(); 18 Debug.Log($"Texture properties of {matB.shader.name}:"); 19 foreach (var textureName in texNamesB) 20 { 21 Debug.Log($"\t{textureName}"); 22 } 23 24 var matAOnlyTexNames = texNamesA.Except(texNamesB); 25 Debug.Log($"Texture properties that {matA.shader.name} has but {matB.shader.name} doesn't have:"); 26 foreach (var textureName in matAOnlyTexNames) 27 { 28 Debug.Log($"\t{textureName}"); 29 } 30 31 var matBOnlyTexNames = texNamesB.Except(texNamesA); 32 Debug.Log($"Texture properties that {matB.shader.name} has but {matA.shader.name} doesn't have:"); 33 foreach (var textureName in matBOnlyTexNames) 34 { 35 Debug.Log($"\t{textureName}"); 36 } 37 } 38}
下図のように一方だけが持つテクスチャ名を抜き出すことができました。
投稿2019/08/17 22:02
総合スコア10807
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/18 03:01