Unity 技術資料:Renderer.material と Renderer.sharedMaterial の違い

概要

Unityの Renderer コンポーネントには、オブジェクトの外観を設定するための materialsharedMaterial のプロパティが存在します。これらのプロパティは、どちらもマテリアルを操作する際に使用されますが、変更が適用される範囲やパフォーマンスへの影響が異なります。本資料では、それぞれのプロパティの特徴や推奨される使用方法について解説します。


1. Renderer.material

特徴

  • インスタンス用のマテリアルmaterial プロパティにアクセスすると、指定されたオブジェクトの専用マテリアルインスタンスが生成されます。
  • 変更の影響範囲:そのオブジェクトにのみ影響があり、他のオブジェクトには変更が反映されません。
  • 自動インスタンス化Renderer.material にアクセスすると、Unityが内部で新しいインスタンスを作成します。そのため、変更前の共有マテリアルが複数のオブジェクトに適用されている場合でも、インスタンスが作成され、他のオブジェクトには影響がありません。

パフォーマンスへの影響

  • material プロパティを頻繁に使用すると、都度新しいマテリアルのインスタンスが生成されるため、メモリ消費が増え、パフォーマンスに影響する可能性があります。インスタンス生成が頻繁に発生しないよう注意が必要です。

推奨用途

  • 個別の変更が必要な場合:たとえば、同じマテリアルを使用している複数のオブジェクトの中で、特定のオブジェクトのみに色やテクスチャなどの変化を加えたい場合。
  • 動的に変化する要素:ゲーム中で一時的に色を変更する必要がある場合など、特定のオブジェクトが頻繁に変わるケースに適しています。

使用例

Renderer renderer = GetComponent<Renderer>();
renderer.material.color = Color.red;  // このオブジェクト専用のマテリアルが生成され、赤色に変更される

2. Renderer.sharedMaterial

特徴

  • 共有マテリアルsharedMaterial プロパティは、オブジェクト間で共有されているマテリアルを参照し、新たなインスタンスを生成しません。
  • 変更の影響範囲:同じマテリアルを共有しているすべてのオブジェクトに変更が反映されます。
  • 非インスタンス化:このプロパティを使用してもインスタンスは生成されないため、複数のオブジェクトに共通の変更が行われます。

パフォーマンスへの影響

  • sharedMaterial を使用するとインスタンス生成が行われないため、頻繁にアクセスしてもパフォーマンスに影響を与えません。特に多くのオブジェクトが同一のマテリアルを使用している場合は、こちらの方がパフォーマンス効率が良くなります。

推奨用途

  • 全体的な変更が必要な場合:たとえば、全オブジェクトの色やテクスチャを一括で変更したい場合。
  • パフォーマンス重視:インスタンスを生成せず、変更を共有したい場面や、パフォーマンスが重要視される場面に適しています。

使用例

Renderer renderer = GetComponent<Renderer>();
renderer.sharedMaterial.color = Color.blue;  // このオブジェクトと同じマテリアルを共有している他のオブジェクト全てが青色に変更される

比較表

プロパティ変更の影響範囲パフォーマンス主な用途
Renderer.materialインスタンスを持つ個別のオブジェクトメモリ消費が多い可能性個別の変更
Renderer.sharedMaterial同じマテリアルを共有するすべてのオブジェクト効率が良い全体変更、パフォーマンス重視

注意点

  1. Renderer.material の多用は避ける:頻繁にインスタンスが生成されるため、特に多くのオブジェクトに対して使用するとパフォーマンス低下の原因となります。
  2. エディターでの注意sharedMaterial の変更は保存され、エディターの再生モードを終了しても元に戻らないことがあるため、開発中は注意が必要です。

まとめ

Unityでマテリアルを変更する際は、materialsharedMaterial の違いを理解して、適切なプロパティを使用することが大切です。個別のオブジェクトに影響を与えたい場合は material を、全体的な変更やパフォーマンスを重視する場合は sharedMaterial を選びましょう。


Unity

Posted by hidepon