この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:atom
更新日時:2026-06-11 07:07:02

タイトル: Mesh Filter
SEOタイトル: Unity Mesh Filter 完全ガイド(mesh と sharedMesh の違い/動的差し替え/最適化)

この記事の要点
  • Mesh Filter は GameObject に 3D メッシュデータ(頂点/UV/法線/インデックス)をアタッチするコンポーネント
  • 描画には Mesh Renderer または Skinned Mesh Renderer とのセット運用が必須
  • meshsharedMesh の違い: mesh は実体コピー(インスタンス化)でメモリ増、sharedMesh は元データ参照で共有
  • Inspector からドラッグ&ドロップで差し替え/GetComponent().mesh = ... でスクリプトから動的変更
  • 最適化: 静的バッチング / GPU Instancing / Mesh Combine でドローコール削減

Mesh Filter とは

Mesh Filter は Unity の標準コンポーネントで、3D メッシュデータ(頂点・面・UV・法線・接線・カラー)を GameObject に保持させる役割を担います。Mesh Filter 単独では描画されず、Mesh Renderer がそのメッシュをマテリアルで描画することで初めて画面に表示されます。

つまり Unity の 3D オブジェクトは次の三層構造で成り立ちます。

コンポーネント役割必須
Transform位置・回転・スケール常に存在
Mesh Filterメッシュデータ(形状)の保持3D 表示には必須
Mesh Rendererマテリアル適用・描画表示には必須

Inspector での見え方

Hierarchy で 3D Object → Cube を作ると、Mesh Filter が自動付与され、Mesh 欄に Cube がセットされた状態になります。

Inspector 項目意味
Mesh表示するメッシュアセット(.fbx / .obj / .asset)への参照

Project ウィンドウから別の .fbx をドラッグ&ドロップするだけで、形状を差し替えられます。

mesh と sharedMesh の違い(重要)

Unity 初心者がもっとも嵌まるのが meshsharedMesh の挙動差です。両者は名前が似ていますが、メモリと参照の扱いが全く違います

プロパティ挙動用途
mesh初回アクセスで元メッシュをコピーしてインスタンス化。以降は専用インスタンスを返すそのオブジェクト固有に頂点を編集したいとき
sharedMesh元アセットへの参照を直接返す。書き換えると同じアセットを参照する全 GameObject に影響表示メッシュの差し替え/読み取り専用アクセス
using UnityEngine;

public class MeshFilterSample : MonoBehaviour
{
    [SerializeField] private Mesh newMesh;

    void Start()
    {
        var mf = GetComponent();

        // (A) 表示メッシュを別アセットに差し替える(共有参照)
        mf.sharedMesh = newMesh;

        // (B) このオブジェクト固有に頂点を編集する
        Mesh m = mf.mesh;          // 内部でコピー生成(インスタンス化)
        Vector3[] verts = m.vertices;
        for (int i = 0; i < verts.Length; i++) verts[i] *= 1.2f;
        m.vertices = verts;
        m.RecalculateNormals();
        m.RecalculateBounds();

        // 不要になったら破棄してリーク防止
        // Destroy(m);   // OnDestroy 等で
    }
}

よくある事故: sharedMesh を書き換えた

sharedMesh.vertices = ... を書くと、同じ Cube プリミティブを使う全 GameObject の形状が変わります。プロトタイプ全体が変形して原因不明となるので注意してください。

スクリプトから動的に差し替える

// 武器の見た目を切り替える例
public Mesh swordMesh;
public Mesh axeMesh;

public void Equip(string weapon)
{
    var mf = GetComponent();
    mf.sharedMesh = (weapon == "sword") ? swordMesh : axeMesh;
    // マテリアルも切り替える場合は MeshRenderer.sharedMaterial も
}

メッシュをコードで自作する(プロシージャル)

// 三角形 1 枚を動的生成
Mesh mesh = new Mesh();
mesh.vertices = new[] {
    new Vector3(0, 0, 0),
    new Vector3(1, 0, 0),
    new Vector3(0, 1, 0),
};
mesh.triangles = new[] { 0, 1, 2 };
mesh.uv        = new[] { new Vector2(0,0), new Vector2(1,0), new Vector2(0,1) };
mesh.RecalculateNormals();
mesh.RecalculateBounds();

GetComponent().mesh = mesh;

MeshFilter と SkinnedMeshRenderer の違い

用途コンポーネント備考
静的なオブジェクト(壁、岩、武器)Mesh Filter + Mesh Renderer軽量・バッチング可
人型・骨アニメ対象Skinned Mesh Renderer 単体Mesh Filter 不要(内部に sharedMesh を持つ)
布・髪などのソフトボディSkinned Mesh Renderer + Cloth頂点を CPU で計算

Skinned Mesh Renderer は内部でメッシュを持つため、別途 Mesh Filter は付けません。両方付けるとメモリの無駄になります。

メッシュ編集ツール: ProBuilder

外部 DCC ツール(Blender / Maya)を使わずに Unity Editor 内でメッシュ編集したい場合は ProBuilder(Package Manager から無料導入)が便利です。

  • 頂点・辺・面の押し出し、削除、結合
  • UV 編集、マテリアル割り当て
  • 編集結果はそのまま Mesh Filter に反映される
  • レベルデザインのブロックアウトや、簡易プロップ作成に最適

メッシュデータの構成要素

要素説明
verticesVector3[]頂点座標
trianglesint[]頂点インデックス(3 つで 1 三角形)
uv / uv2 / uv3Vector2[]テクスチャ座標。ライトマップ用が uv2
normalsVector3[]法線ベクトル。ライティング計算に必須
tangentsVector4[]ノーマルマップ用の接線
colorsColor[]頂点カラー(シェーダー側で使用)
boundsBoundsカリング判定用 AABB

最適化のポイント

  • Static フラグを ON にして Static Batching を有効化(同じマテリアルのメッシュを 1 ドローコールに統合)
  • GPU Instancing: マテリアルで Instancing を有効化すると、同じメッシュ × 多数表示が高速化
  • Combine Meshes: スクリプトで Mesh.CombineMeshes を使い 1 メッシュへ統合
  • Mesh Compression: Import Settings で Low/Medium/High → 容量削減(精度低下とのトレードオフ)
  • LOD Group: 距離に応じて低ポリメッシュへ自動切替
  • Read/Write Enabled OFF: スクリプトでメッシュを読まないなら OFF にして、メモリ半減

よくあるトラブル

症状原因対処
表示されないMesh Renderer 未付与 or マテリアル None両方を付ける
真っ黒に見える法線が逆/未設定/ライト無しRecalculateNormals() /ライト追加
マゼンタ(ピンク)表示マテリアルのシェーダーがレンダーパイプライン非対応URP/HDRP 用シェーダーに変更
頂点を書き換えてもメモリが減らない古い mesh インスタンスを破棄していないDestroy(oldMesh)
共有メッシュを変えたら他オブジェクトも変わるsharedMesh を編集したmesh 経由でインスタンス化

FAQ

Q: Mesh Filter だけ付けて Mesh Renderer を外すと?
A: 描画されません。データだけ保持された状態。当たり判定(Mesh Collider)に流用するときに使う構成です。

Q: 同じプレハブを大量配置するとドローコールが増えます
A: GPU Instancing 対応のマテリアルにし、Static 設定で Static Batching を有効化してください。

Q: mesh アクセスでメモリリークすると聞きました
A: mesh を呼ぶたびにコピーが作られ、Destroy しないと GC まで残ります。OnDestroyDestroy(meshInstance) を呼ぶ習慣を。

📸 参考画像

※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。

Mesh Filter の Inspector 表示