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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

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

Q&A

解決済

1回答

1466閲覧

sharedMaterialを見たい。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2017/11/20 16:41

###前提・実現したいこと
sharedMaterialが使われているかどうかの確認方法について教えていただきたいです。
インスペクタで見ても、sharedMaterialが使われている様子がないのですが、インスペクタで確認することってできますか?
もしくはコードで確認する方法はあるのでしょうか?

###該当のソースコード
イメージ説明

球に作成したマテリアルをアタッチしてプレハブ化しました。
インスペクタでは、普通のmaterialの方が使われているように見えます。
Resources.Loadで生成して実行しても、同じようなインスペクタでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

インスペクタでMaterialの設定欄を見た時に「(Instance)」と付いていなかったらsharedMaterialです。
(画像の例だと、MeshRendererのMaterialsのElement 0が「New Material」だったらsharedMaterialである、「New Material (Instance)」だったらsharedMaterialではない)

質問主さんの言う「普通のマテリアル」とはsharedMaterialのことです。


そもそもMaterialの仕様は、

  • エディタ上でオブジェクトをコピーしたり、動作中にInstantiateしただけではsharedMaterialのまま。
  • 動作中にスクリプトからRendererコンポーネント内の**"material"**の内容を変更した場合、インスタンス化される(=「(Instance)」が付き、sharedMaterialではなくなる)。
  • 動作中にスクリプトからRendererコンポーネント内の**"sharedMaterial"**の内容を変更すると、sharedMaterialのまま変更される(=同じマテリアルが付いたオブジェクトは同じ表示になる)。

となります。

試しにシーン上に同じマテリアルを持ったオブジェクトを3つ並べて、
GameObject.Find("Shpere (1)").GetComponent<Renderer> ().material.color = Color.blue;
GameObject.Find("Shpere (2)").GetComponent<Renderer> ().sharedMaterial.color = Color.red;
このコードを実行してみてください。どう動くか分かると思います。

投稿2017/11/21 04:49

sakura_hana

総合スコア11427

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

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

退会済みユーザー

退会済みユーザー

2017/11/21 12:52

ご回答ありがとうございます。 検証してみました。 ご回答者様のおっしゃった「普通のマテリアルとはsharedMaterialのこと」という意味が理解できました。 ちなみに、Resources.Loadで生成したものに関しては、materialプロパティは設定できないのでしょうか? 下記コードで試した所、コメントが書かれている行をコメントにしないとsp2が生成されませんでした。 プレハブ自体がダメなのかと思いきや、シーン上に配置してあるFindで取得したプレハブのmaterialプロパティは変更することができました。 シーン上に元々あるプレハブインスタンスは、materialプロパティが設定可能で、 Resources.Loadで生成したプレハブインスタンスは、materialプロパティが設定不可能な理由をご存知でしたら教えていただけませんか? GameObject sp1 = Resources.Load ("Sphere") as GameObject; sp1.GetComponent<Renderer> ().sharedMaterial.color = Color.green; sp1.name = "sp1"; Instantiate (sp1); GameObject sp2 = Resources.Load ("Sphere") as GameObject; sp2.GetComponent<Renderer> ().material.color = Color.blue; //ここをコメントにしないと生成されない。 sp2.name = "sp2"; Instantiate (sp2);
sakura_hana

2017/11/22 02:00 編集

GameObject sp2 = Resources.Load ("Sphere") as GameObject; この時点ではまだGameObjectが生成されていません。(Resources内からオブジェクトの情報を取得しただけ) Instantiate (sp2); この時点でGameObjectが生成(インスタンス)されます。(マテリアルも同タイミングで生成されます) つまりこのコードだと、マテリアルを生成する前にマテリアルの操作をしていることになります。 sharedMaterialは「大元のマテリアル」なので生成されなくても操作出来ます。 一方、material(Instance)は「生成後のマテリアル」なので生成されないと操作出来ません。 下記のように書くと動くと思います。 GameObject prefab = Resources.Load ("Sphere") as GameObject; GameObject sp2 = Instantiate (prefab) as GameObject; sp2.GetComponent<Renderer> ().material.color = Color.blue; sp2.name = "sp2"; ちなみにシーン上に配置してあるオブジェクトは、そのシーンが開始された時点で生成されるので、そのままmaterialも操作可能です。 「Resources.Loadと生成は別物(生成するのはInstantiateメソッド)」と理解するとしっくりくると思います。
退会済みユーザー

退会済みユーザー

2017/11/22 15:06

ご回答ありがとうございます。 検証できました。 Resources.LoadとInstantiateメソッドの関係がわかってなかったので、勉強になりました。 マテリアルはゲームオブジェクト生成後でないと、操作できないのですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問