【uGUI】自作shaderのマテリアルをオブジェクト個別に作成して別の値を適応させる

起きた事象

uGUIのImageに自作のshaderを適応させようとした際に、
マテリアルの値を更新すると適応した全てのImageオブジェクトの反映されてしまいました。
期待値は変更した1つのImageオブジェクトにだけ変更した値が適応されたいです。

【環境】
unity2021.3.3f1

対処法

これは複数のImageオブジェクトで使用しているマテリアルが同一インスタンスのために発生しています。
なので、別のインスタンスを生成してセットしてあげればよいだけです。

Material baseMat = this.image.material;
this.image.material = new Material(baseMat.shader); //new して新しいインスタンスを作って設定する

this.image.material.SetFloat("_Alpha", alpha); //適応したい変更を新しく作ったマテリアルに適応する

これで、変更したいImageオブジェクトだけに変更を適応できるようになりました!

補足

マテリアルの値を変えるとそのたびにマテリアルが複製される。という有名な話がありますが、それはuGUIには当てはまりません。
※3Dオブジェクト等のUI以外のマテリアルを操作した際には発生するのでその時はMaterialPropertyBlock等を使って対処する必要があります。

試しに先程のコードに以下のようなログを仕込んでみると
変更前後で同じインスタンスIDがかえってきているので、これで複製されていない事が分かります。

Debug.Log("before:" + this.image.material.GetInstanceID());
this.image.material.SetFloat("_Alpha", alpha); //適応したい変更を新しく作ったマテリアルに適応する
Debug.Log("after:" + this.image.material.GetInstanceID());