質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1593閲覧

Unity シェーダーのプロパティで追加したテクスチャのみをスクリプトで取得したい

vinvinvidal

総合スコア18

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/08/17 13:58

お世話になっております。

シェーダーのプロパティで複数枚のテクスチャを追加し、スクリプトから動的にテクスチャを切り替える処理を書いています。

スクリプトからテクスチャを取得する場合、nameやidを指定すると思うのですが、
文字を直接打ち込むのはよろしくない気がしたので、まずシェーダーのプロパティからnameやidを取得したいと考えました。

そこでGetTexturePropertyNames()やGetTexturePropertyNameIDs()を使ったのですが、
シェーダーのプロパティで追加したテクスチャ以外の_MainTexや_BumpMapや_EmissionMapなども持ってきてしまいました。
自分でシェーダーのプロパティに追加した物だけを取得したいのですが、どう区別をつければよいでしょうか。
プロパティで宣言する際にタグを仕込めたりしないかと色々と調べてみたのですが、どうにも分かりません。

御教示のほど、何卒よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vinvinvidal

2019/08/18 03:01

御回答ありがとうございます。 御教示頂いた方法で無事に解決することができました。 勉強させて頂いたExceptは今後も色々な場面で使う機会がありそうですし、 本当に学ばせて頂きました。 重ねて御礼申し上げます、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問