Unity3d シェーダー シェーダーのブールスイッチ変数 [Toggle] コンポーネント C# スクリプト コントロールが無効な問題の解決策

質問

モデルのエフェクト シェーダはシーン エフェクトで呼び出され、プログラムはシェーダの属性を動的に変更する必要があります。属性は次のとおりです。

[Toggle(_USELINE_ON)] _UseLine("Use Line", Float) = 0

私の以前の理解によれば、Float の値を 1 または 0 に直接変更しても問題ないはずです。

//关闭
 AniMat2.SetFloat("_UseLine", 0);
 
//打开
 AniMat2.SetFloat("_UseLine", 1);

しかしうまくいかず、Webページを長時間検索しても結果が見つからず、ついにシェーダーが生成したコードに突破口が見つかりました。

解決

シェーダー コードで同様のスニペットを多数参照してください。

#ifdef _USELINE_ON
...
#else
...
#endif

[Toggle(_USELINE_ON)] は _USELINE_ON に関連付けられています。
これはマクロ定義であり、マクロ定義を動的に変更してコントロールを完成させることができます

これを行う方法は次のとおりです = 動的変更マクロの定義 =
このマテリアルのローカル シェーダー キーワードを無効にします。Material.DisableKeyword メソッド:

ここに画像の説明を挿入
このマテリアルのローカル シェーダ キーワードを有効にします。Material.EnableKeyword メソッド:

ここに画像の説明を挿入
このようにして、シェーダのトグル効果を制御できます

//关闭
  AniMat2.DisableKeyword("_USELINE_ON");
//打开
  AniMat2.EnableKeyword("_USELINE_ON");

梱包後は無効

パッケージング後にこの機能が無効になる問題は、https://www.jianshu.com/p/32f6e8a217d6で解決しました。

方法3でShader - multi_compileを修正することで解決しました。

おすすめ

転載: blog.csdn.net/weixin_43149049/article/details/127352662