はらけんログ

unity触ったりバイクに乗ったり

【Unity】スクリプトからMaterialをオブジェクトごとに変更

Unity触りはじめてしばらくたったが、本当に今更な事に気づいたのでメモ。アタシってほんとバカ。。。

 

いままで、スクリプトからMaterialのColorとかEmissionとかを変更したいとなった時、変更したいMaterialを直接宣言してました。しかし、この方法では同じMaterialのオブジェクトの色がすべて変わってしまいます。

 

かと言って、オブジェクトの個数分Materialを用意するのもスムーズではありません。更にはMaterialの設定を実行中に変更して停止すると変更がもとに戻りません。

 

そこで、オブジェクトのMaterialをオブジェクト1つずつ個別に設定する方法について記載します。

 

1,とりあえずMaterialの色を変えてみる

下の画像のように、スクリプトを貼り付けた空のGameObjectと、自分で作ったMaterialをCubeたちのMaterialに設定し配置しました。

f:id:HarakeN:20180703184038p:plain

 

「ChangeMaterial 」のスクリプトは下記とおり。

public class ChangeMaterial : MonoBehaviour {
 public Material testMat;

 void Start()
 {
  SetMatColor(Color.red);
 }

 void SetMatColor(Color col )
 {
  testMat.color = col; //Materialの色を変える
 }
}

 

 

 実行すると、両方のCubeの色が変わりました。

f:id:HarakeN:20180703184228p:plain

 

 

2,Cubeごとに色を変える

さて、本題です。オブジェクトの色を個別に設定する場合は、Materialを宣言するのではなく設定したいオブジェクトのMeshRendererを宣言します。

スクリプトは下記のように変更してください。

public class ChangeMaterial : MonoBehaviour {
 public MeshRenderer cube1;
 public MeshRenderer cube2;

 void Start()
 {
  SetMatColor(cube1,Color.red);
  SetMatColor(cube2, Color.blue);
 }

 void SetMatColor(MeshRenderer mesh,Color col )
 {
  mesh.material.color = col; //meshのmaterialの色を変える
 }
}

 

下図のようにInspectorでスクリプトにCubeを設定して実行すると、個別に色が変わります。

f:id:HarakeN:20180703190122p:plain

 

 

3、仕組みについて

MaterialはMeshごとにInstanceされます。そのInstanceされたMaterialにアクセスするにはRenderer.materialからアクセスします。

f:id:HarakeN:20180703191506p:plain

 

 

逆にInstanceされる前(ベースとなるMaterial)を変更したいのであればMaterial

から直接アクセスします。(伝われ)

docs.unity3d.com

docs.unity3d.com

 

 

使い所によってどちらが良いか見極めてから実装するほうがいいですね。