質問: mat2.mainTexture;//マテリアルのテクスチャにマテリアル2のテクスチャを入れる Debug.Log("mat is : " + mat);//デバックで表示 } } } } } このコードでやると、ボタンを押す前からビルらしくないテクスチャが貼られています。よく見ると、ビルの各部位のテクスチャは、もともとゼンリンさんが用意しているテクスチャの大本のデータがあり、その一部をビルの一階のテナントの看板など、細かい部分に適用させているようで、その大本のテクスチャが壁面全面に貼られておかしくなってしまっています。そしてボタンを押しても無反応です。 これを改善するためにはどうすればよいでしょうか? 自分ひとりで考えていてもなかなか分からないのでご助言頂けると幸いです。 よろしくお願いします。
回答: まず、マテリアルとテクスチャについて、もう一度勉強してみてください。 前提知識として・・・ 誤解を恐れずに言うと、マテリアルは「質感」、テクスチャは「模様」を表現します(他の利用方法もあります)。 物体の描画には必ずマテリアル(質感)が必要で、テクスチャ(模様)はなくてもよいものです。 また、テクスチャの情報はマテリアルに格納されます。 ※ 十分な説明ではないので、これから改めて勉強してみてください。 また、一つのゲームオブジェクトには複数のマテリアルが適用されていることがあります。 ビルであれば、壁面、ガラス、看板、などなど。。 これらのマテリアルに(ない場合もありますが)それぞれテクスチャが存在します。 ここで一番最初のコードを見てみてください。 ``` // Use this for initialization void Start() { image = GetComponent().material.GetTexture("_MainTex"); //問題の行 } // Update is called once per frame void Update() { Material[] mats = GetComponent().materials; if (Input.GetKey(KeyCode.Joystick1Button5)) { foreach (Material mat in mats) { mat.mainTexture = image2; } } ~~~ ``` Start関数で image に保存したのは、このゲームオブジェクトのレンダラに割り当てられている最初のマテリアルのテクスチャのみです。その後、キーが押された際に foreach ですべてのマテリアルのテクスチャに対して image を割り当てていますね?これが原因です。 まずは Material[] mats と同じように、テクスチャも Texture[] images のように配列を用意しておき Start関数ですべてのマテリアルのテクスチャを保存しておきましょう。