タイトル: メッシュ
SEOタイトル: Unity Mesh コンポーネント完全ガイド
| この記事の要点 |
|
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 内で組めるので、プロトタイピングに最適:
- Package Manager で ProBuilder をインストール
- Tools → ProBuilder → ProBuilder Window
- Cube / Stairs / Cylinder などのプリミティブを配置
- 頂点・辺・面を選択して押し出し・分割・マテリアル設定
描画コールの最適化
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 の順で導入を検討。