質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1955閲覧

【Unityスクリプト】マウス左クリックしたときに複数のオブジェクトマテリアルの色を変更(追記)

DY2peace

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/08/22 02:26

前提・実現したいこと

たびたび申し訳ございません。
FBXデータにて、一部品に複数のマテリアル色が備わっているモデルを左クリックで選択したときにすべてのマテリアルを赤色に変更することはできたのですが、今度は最初に設定されていた色に全部もとに戻す方法を調べております。

↓複数のマテリアルが設定。
イメージ説明

↓オブジェクトを左クリックで選んだとき
イメージ説明
↓マテリアルすべてが赤くなったことを確認
イメージ説明

発生している問題・エラーメッセージ

 オブジェクトがないところ、もしくは別のオブジェクトを選択したとき、一番上にマテリアル設定されている色に全部同色になってしまう問題があります。
イメージ説明

該当のソースコード

 複数マテリアルを赤くする方法は以下のように設定しました。

C#

1 public bool beRay; 2 public Color default_color; 3 public Color select_color; 4 public Material mat; 5 6 7void Start() 8 { 9 beRay = false; 10 default_color = GetComponent<Renderer>().material.color; 11 select_color = Color.red; 12 mat = this.gameObject.GetComponent<Renderer>().material; 13 } 14 15void Update() 16 {if(Input.GetMouseButtonDown(0)) 17 {RayCheck();} 18 if (Input.GetMouseButtonUp(0))//マウス左クリックを押してないとき⇒役立っている? 19 {beRay = false;} 20 21private void RayCheck() 22 { 23 this.gameObject.GetComponent<Collider>().enabled = true; 24 25 Material [] mats = this.gameObject.GetComponent<Renderer>().materials; 26 foreach (Material mat in mats) { 27 mat.color = default_color; 28 } 29 Ray ray = new Ray(); 30 RaycastHit hit = new RaycastHit(); 31 ray = Camera.main.ScreenPointToRay(Input.mousePosition); 32 33 if (Physics.Raycast(ray.origin, ray.direction, out hit, Mathf.Infinity) 34 && hit.collider == gameObject.GetComponent<Collider>() 35 ) 36 ) 37 { 38    beRay = true; 39   foreach (Material mat in mats) { 40 mat.color = select_color; 41 } 42 } 43 44 else 45 { 46  this.gameObject.GetComponent<Collider>().enabled = false; 47 48   beRay = false; 49  hit.collider.gameObject.GetComponent<ChangeColor>(); 50 51 foreach (Material mat in mats) { 52 mat.color = default_color; 53 } 54 } 55 }

試したこと

 『default_color』を初期マテリアル色として考えています。void start のところで、前質問で教えていただいた
foreachを使って、default_color = 初期複数マテリアル色の取得とやりたかったのですが、やり方がよくわかりませんでした。

たびたびご迷惑をおかけいたしますが、どなたかご教示いただけると幸いです。

以上です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

前回回答した者です。マテリアルカラーだけ戻せれば良いでしょうか。
以下の様な手順を踏めば、初期のカラーに戻せる様になるかと思いますがいかがでしょうか。

1、初期のマテリアルカラーを保持する変数(List)の宣言を追加する

C#

1private List<Color> defaultColors = new List<Color>();

2、実行時に、初期のマテリアルカラーをListに格納・保持する

C#

1void Start() 2{ 3 // Defaultのマテリアルを、Listに保持 4 Material[] mats = obj.GetComponent<Renderer>().materials; 5 foreach (Material mat in mats) { 6 defaultColors.Add(mat.color); 7 } 8}

3、マテリアルカラーを戻したいタイミングで、保持していたListの値を設定する

C#

1// 保持していたカラーに戻す 2int i = 0; 3Material[] mats = obj.GetComponent<Renderer>().materials; 4foreach (Material mat in mats) 5{ 6 mat.color = defaultColors[i]; 7 i++; 8}

サンプルの全文
※マテリアル設定、リセットのメソッドを用意して試したもの。

C#

1using System.Collections.Generic; 2using UnityEngine; 3 4public class ChangeMaterials : MonoBehaviour 5{ 6 // マテリアル変更対象のGameObject格納用 7 public GameObject obj; 8 9 // 初期のマテリアルカラー保持用 10 private List<Color> defaultColors = new List<Color>(); 11 12 // Start is called before the first frame update 13 void Start() 14 { 15 // Defaultのマテリアルを、Listに保持 16 Material[] mats = obj.GetComponent<Renderer>().materials; 17 foreach (Material mat in mats) { 18 defaultColors.Add(mat.color); 19 } 20 } 21 22 23 // カラー設定処理 24 public void SetMaterialColor() 25 { 26 // マテリアルカラーを、全て赤色に変更 27 Material[] mats = obj.GetComponent<Renderer>().materials; 28 foreach (Material mat in mats) 29 { 30 mat.color = Color.red; 31 } 32 } 33 34 35 // カラーリセット処理 36 public void ResetMaterialColor() 37 { 38 // 保持していたカラーに戻す 39 int i = 0; 40 Material[] mats = obj.GetComponent<Renderer>().materials; 41 foreach (Material mat in mats) 42 { 43 mat.color = defaultColors[i]; 44 i++; 45 } 46 } 47} 48

動作結果サンプル(ベスト部分のカラー変更)
サンプル

投稿2020/08/22 15:47

tsuki01

総合スコア1751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DY2peace

2020/08/23 22:32

ご回答いただきありがとうございました。またまとめて質問できず申し訳ございません。無事問題解決できました。すごくわかりやすいご回答で大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問