Unity 技術資料:Renderer.material と Renderer.sharedMaterial の違い
目次
概要
Unityの Renderer
コンポーネントには、オブジェクトの外観を設定するための material
と sharedMaterial
のプロパティが存在します。これらのプロパティは、どちらもマテリアルを操作する際に使用されますが、変更が適用される範囲やパフォーマンスへの影響が異なります。本資料では、それぞれのプロパティの特徴や推奨される使用方法について解説します。
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 | 同じマテリアルを共有するすべてのオブジェクト | 効率が良い | 全体変更、パフォーマンス重視 |
注意点
Renderer.material
の多用は避ける:頻繁にインスタンスが生成されるため、特に多くのオブジェクトに対して使用するとパフォーマンス低下の原因となります。- エディターでの注意:
sharedMaterial
の変更は保存され、エディターの再生モードを終了しても元に戻らないことがあるため、開発中は注意が必要です。
まとめ
Unityでマテリアルを変更する際は、material
と sharedMaterial
の違いを理解して、適切なプロパティを使用することが大切です。個別のオブジェクトに影響を与えたい場合は material
を、全体的な変更やパフォーマンスを重視する場合は sharedMaterial
を選びましょう。
ディスカッション
コメント一覧
まだ、コメントがありません