読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

マテリアルのプロパティをスクリプトから変更【Unity】

Unity

このエントリーをはてなブックマークに追加

Unity 5.1.0f3 Personal

プロパティをスクリプトから変更

例えばマテリアルの色を変える場合、以下のコードで行えます。

GetComponent<Renderer>().material.color = Color.red;


ただしこれは、_Color という名前でプロパティが設定されているシェーダにのみ有効です。


_Colorという名前以外の色を変える場合は以下のように行います

GetComponent<Renderer>().material.SetColor("_TintColor", Color.red);


第一引数にPropertiesの名前を指定しています。

同様にSetFloatSetVectorなどを使う事で他のプロパティも変更できます。


プロパティの確認

プロパティは、マテリアル右上の歯車からSelect Shaderを選択し、


f:id:kan_kikuchi:20150820063804p:plain


下の方にあるPropertiesから確認できます。


f:id:kan_kikuchi:20150820064004j:plain


左側がプロパティの名前、右側が型になります。


プロパティが存在するか

プロパティの存在確認を行いたい場合はHasPropertyを使います。

if(GetComponent<Renderer>().material.HasProperty("_TintColor")){
  GetComponent<Renderer>().material.SetColor("_TintColor", Color.red);
}


上記の例では_TintColorというプロパティが設定されていれば、そのプロパティを変更しています。


sharedMaterial

ここまでやってきたように、Renderer.materialを変更すると新たにマテリアルをコピーし、

その値を変更するため、他のオブジェクトのマテリアルは変更されてません。


同じマテリアルを使用しているもの全てについて

設定を変更したい場合は、sharedMaterialを使います。

GetComponent<Renderer>().sharedMaterial.color = Color.red;


同じマテリアルを使用したCubeを配置し、中央のマテリアルを変更した例が以下の通りです。


Renderer.materialを変更した場合

f:id:kan_kikuchi:20150820065420p:plain


Renderer.sharedMaterialを変更した場合

f:id:kan_kikuchi:20150820065427p:plain


sharedMaterialはマテリアル自体の設定を変更しているため、

シーンの実行を終了しても元に戻らない点に注意が必要です。


またsharedMaterialを使わないとマテリアルのコピーが発生し、使用するマテリアルが増えるため

Unity4だとDraw Calls、Unity5だとSetPass callsが増える点にも注意が必要です。