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

タイトル: メッシュ
SEOタイトル: Unity Mesh コンポーネント完全ガイド

この記事の要点
  • Unity の 3D オブジェクトは Mesh Filter + Mesh Renderer + (必要なら) Mesh Collider の組み合わせ
  • Mesh データは 頂点 (vertices) / 法線 (normals) / UV / トライアングル (triangles) から成る
  • キャラのスキニングには Skinned Mesh Renderer、ボーンに追従する頂点を変形
  • エディタ内モデリングなら ProBuilder、ポリゴン削減なら ProGrids/Mesh Compression
  • 描画コール削減は Combine Meshes / Static Batching / GPU Instancing

Mesh まわりのコンポーネント

コンポーネント役割
Mesh Filter形状データ (頂点・三角形) を保持
Mesh Renderer描画 (マテリアル・影・ライト設定)
Mesh Collider物理判定 (任意形状の Collider)
Skinned Mesh Rendererボーンに追従する変形メッシュ
Mesh (アセット).fbx / .obj / .dae から生成される実データ

Mesh Filter

3D モデルの形状情報を持つコンポーネント。Hierarchy に GameObject を配置し、Mesh Filter のスロットに .fbx 等のメッシュをアサインします。Mesh Filter 単体では何も表示されず、隣に Mesh Renderer が必要です。

Mesh Renderer

Mesh Filter のデータを画面に描画するコンポーネント。マテリアル・ライト設定・影設定を持ちます:

  • Materials: 表面の質感 (シェーダー + テクスチャ)
  • Lighting: Cast Shadows / Receive Shadows / Light Probes
  • Probes: Reflection Probes / Light Probes の利用設定
  • Additional Settings: Motion Vectors / Dynamic Occlusion

Mesh Collider

物理判定用。任意形状の Collider が作れますが、Convex (凸) で無いと Rigidbody と衝突できない制限があります:

// Mesh Collider 設定例
var mc = gameObject.AddComponent();
mc.sharedMesh = GetComponent().sharedMesh;
mc.convex = true;       // Rigidbody と当てたいなら必須
mc.isTrigger = false;

// パフォーマンス目線では Box / Sphere / Capsule Collider のほうが軽い

対応するメッシュファイル形式

拡張子対応備考
.fbx○ (推奨)業界標準、ボーン・アニメ・マテリアル
.objシンプル、ボーン・アニメ不可
.dae (Collada)レガシー
.blend○ (Blender 必要)Blender インストール環境のみ
.max / .ma / .mb○ (DCC ツール必要)3ds Max / Maya がインストール済の場合
.glb / .gltfパッケージで対応 (glTFast)

Mesh のデータ構造

using UnityEngine;

Mesh mesh = GetComponent().mesh;

// 頂点座標 (ローカル空間)
Vector3[] vertices = mesh.vertices;

// 三角形 (頂点インデックス 3 つで 1 ポリゴン)
int[] triangles = mesh.triangles;

// 法線 (ライティング計算用)
Vector3[] normals = mesh.normals;

// UV (テクスチャ座標)
Vector2[] uv = mesh.uv;

// 接線 (ノーマルマップ用)
Vector4[] tangents = mesh.tangents;

// 頂点カラー
Color[] colors = mesh.colors;

// ボーンウェイト (Skinned Mesh)
BoneWeight[] weights = mesh.boneWeights;

Debug.Log($"頂点数: {vertices.Length}, 三角形数: {triangles.Length / 3}");

カスタムメッシュをスクリプトで生成

頂点・三角形配列を直接組むことで、プログラムから任意メッシュを作成できます:

using UnityEngine;

[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class QuadMaker : MonoBehaviour {
    void Start() {
        Mesh mesh = new Mesh();
        mesh.name = "MyQuad";

        // 4 頂点 (四角形)
        mesh.vertices = new Vector3[] {
            new Vector3(0, 0, 0),
            new Vector3(1, 0, 0),
            new Vector3(0, 1, 0),
            new Vector3(1, 1, 0),
        };

        // 2 トライアングル (CCW 表面)
        mesh.triangles = new int[] {
            0, 2, 1,   // 左下三角
            2, 3, 1,   // 右上三角
        };

        // UV
        mesh.uv = new Vector2[] {
            new Vector2(0, 0),
            new Vector2(1, 0),
            new Vector2(0, 1),
            new Vector2(1, 1),
        };

        mesh.RecalculateNormals();
        mesh.RecalculateBounds();

        GetComponent().mesh = mesh;
    }
}

Skinned Mesh Renderer (キャラクター)

キャラクターやアニメーションするモデルは、ボーンに追従する頂点変形が必要なので Skinned Mesh Renderer を使います。Mesh Filter + Mesh Renderer の組み合わせとは別物:

  • 各頂点がボーンと重み (BoneWeight) を持つ
  • Mecanim / Animation Controller でボーンを動かすと頂点が追従
  • Blend Shape (Morph Target) で表情アニメ可能
  • CPU スキニング (デフォルト) と GPU スキニング (Project Settings → Player)

ProBuilder (エディタ内モデリング)

Unity 公式のエディタ内 3D モデラー。簡単な箱・床・壁を Unity 内で組めるので、プロトタイピングに最適:

  1. Package Manager で ProBuilder をインストール
  2. Tools → ProBuilder → ProBuilder Window
  3. Cube / Stairs / Cylinder などのプリミティブを配置
  4. 頂点・辺・面を選択して押し出し・分割・マテリアル設定

描画コールの最適化

Static Batching

静的なメッシュは Inspector で Static にチェック → Player 設定で Static Batching ON → ビルド時に自動結合されドローコールが減ります。

Dynamic Batching

頂点数 300 以下のメッシュは同マテリアルなら自動でバッチ化。条件は厳しいが効果大。

GPU Instancing

同じメッシュを大量に描画する場合 (草・木・パーティクル) は、マテリアルで Enable GPU Instancing をチェックすると 1 ドローコールに統合できます。

// 100 個の同じメッシュを高速描画
using UnityEngine;

public class GrassRenderer : MonoBehaviour {
    public Mesh grassMesh;
    public Material grassMat;
    Matrix4x4[] matrices = new Matrix4x4[1023];

    void Start() {
        for (int i = 0; i < matrices.Length; i++) {
            matrices[i] = Matrix4x4.TRS(
                new Vector3(Random.value * 100, 0, Random.value * 100),
                Quaternion.identity,
                Vector3.one);
        }
    }

    void Update() {
        // 1 ドローコールで 1023 個描画
        Graphics.DrawMeshInstanced(grassMesh, 0, grassMat, matrices);
    }
}

Combine Meshes

using UnityEngine;

[RequireComponent(typeof(MeshFilter))]
public class MeshCombiner : MonoBehaviour {
    void Start() {
        MeshFilter[] meshFilters = GetComponentsInChildren();
        CombineInstance[] combine = new CombineInstance[meshFilters.Length];

        for (int i = 0; i < meshFilters.Length; i++) {
            combine[i].mesh = meshFilters[i].sharedMesh;
            combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
            meshFilters[i].gameObject.SetActive(false);
        }

        var mesh = new Mesh();
        mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
        mesh.CombineMeshes(combine);

        GetComponent().mesh = mesh;
        gameObject.SetActive(true);
    }
}

Mesh Compression

FBX をインポートしたとき、Inspector の Mesh Compression を設定するとファイルサイズが減ります (Off / Low / Medium / High)。ただし座標精度が落ちるので、大きいモデルでは見た目崩れに注意。

Optimize Mesh

Inspector の Optimize Mesh をチェックすると、GPU が効率良く扱える頂点順に並べ替えられます。デフォルト ON 推奨。

FAQ

Q: 表示されない
A: Mesh Filter にメッシュがアサインされていない、Mesh Renderer のマテリアルが未設定、法線が逆向き、カメラの Far Clip より遠い等を順に確認。

Q: 衝突しない
A: Mesh Collider 未追加 or convex 未チェック (Rigidbody との衝突は convex 必須)。

Q: ドローコールを減らしたい
A: Static Batching → GPU Instancing → Combine Meshes → LOD Group の順で導入を検討。