ビルボード(平面画像)ではない、3Dモデルメッシュパーティクルにおいてアルファカラーフェードを正しく伝搬させる手順です。Unityの「Particle System( Shuriken )」は、平面の画像(ビルボード)だけでなく、3Dモデルのメッシュ(木の葉、岩石、コイン、薬の瓶など)を空間に大量に放出・散布する演出(Mesh 放出モード)を手軽に実装できます。このメッシュパーティクルを使用する際、エフェクトのクオリティを高めるために「Color over Lifetime(寿命に応じた色変化)」モジュールを使って、放出されたメッシュが時間の経過とともに徐々に赤く染まったり、あるいは最後にふわっと透明になって消えていく(アルファ値のフェードアウト)演出を設定することが一般的です。しかし、インスペクター上で綺麗なグラデーションカラーを設定しているにもかかわらず、「ゲーム画面ではメッシュの色が全く変わらず、マテリアルのベタ塗りの質感のまま硬直して落下する」「透明になるはずのメッシュが、最後のフレームでパッと唐突に非表示になり不自然である」という頂点カラー非反映バグに悩まされたことはないでしょうか。本記事では、この不具合の根本的な原因を、「白色彫刻とプロジェクター」の例え話を交えて解説し、グラフィックス設定(Custom Vertex Streams)とシェーダーのバインド手順を詳細に解説します。
1. 例え話で理解する:『白い石膏彫刻と、投影を弾く特殊なプロジェクター』
このメッシュパーティクルで色が反映されないバグを直感的に理解するために、『美術館のステージで、白い石膏の彫刻(3Dメッシュ)に、プロジェクター(Particle Systemのカラーモジュール)でカラフルな映像を投影しようとしている演出』を想像してみましょう。
あなたは演出家(開発者)として、ステージに放出された白い彫刻が、時間が経つにつれて徐々に夕日の色に染まるように演出したいと考え、プロジェクターのスイッチをONにしました。しかし、彫刻はいくら光を当てても、真っ白な石膏のままでビクともしません。調べてみると、3つの問題が起きていました。
1つ目の問題は、彫刻(メッシュアセット)の表面素材が「光を吸収して反射する性質(頂点カラーCOLORチャネル)」をそもそも持っておらず、光をすべて透過・無効化してしまっていること。
2つ目の問題は、プロジェクターから色データを送るための「接続ケーブル(Custom Vertex Streams)」が外れており、プロジェクター自体がただの真っ白な光(デフォルト値)しか出力していないこと。
3つ目の問題は、彫刻に塗られた塗料(シェーダー)が、プロジェクターの光と混ざり合う(カラー乗算)ように設計されておらず、塗料独自の色しか反射しない仕様になっていたことです。
これが、メッシュパーティクルにおける『カラー反映失敗バグ』の正体です。3Dモデル自体にカラー情報を受ける「器」を用意し、パーティクルシステムから「色データ」をGPUに送るケーブルを接続し、シェーダーでその色をマテリアルカラーに乗算してあげるという、3つの連携が揃って初めて色が反映されるのです。
2. データストリームの未バインドとシェーダー非対応
ビルボード(平面の板ポリゴン)でパーティクルを出す場合、Unityは自動で頂点カラー情報(`COLOR` セマンティクス)をGPUにバインドします。しかし、外部の3Dモデル(FBX等)を放出するメッシュモードの場合、メモリ節約のため、デフォルト設定ではパーティクルシステムからメッシュに対してカラーデータを転送する処理がカット(非アクティブ化)されます。技術的な原因は以下の3つです。
原因①:Custom Vertex Streams で「COLOR」が未登録
Particle SystemのRendererモジュール内にある `Custom Vertex Streams` 設定は、GPUにどの頂点情報(座標、法線、カラー、UV等)を転送するかを定義します。初期状態では、メッシュの元の頂点座標とUVだけが送られ、`Color` 情報はストリーム(転送バッファ)に含まれていないため、シェーダー側でいくら頂点カラーをサンプリングしようとしても、値が常に `(1, 1, 1, 1)`(白)のままになってしまいます。
原因②:メッシュアセットに頂点カラー(Vertex Color)チャネルが存在しない
Blenderなどの3Dモデリングソフトでメッシュを作成した際、モデル自体に「頂点カラーレイヤー」を1つ以上追加した状態で書き出しているか確認してください。モデル自体にカラーバッファがない場合、Unity側でメッシュの頂点データ自体にカラーのバッファが確保されず、転送されたカラーを受け取ることができなくなります。
原因③:マテリアルのシェーダーが頂点カラー(Vertex Color)を乗算していない
メッシュに適用されているマテリアルのシェーダー(カスタムシェーダーやShader Graph等)が、テクスチャの元のカラー(Albedo)に対して、頂点から送られてきた `Vertex Color` を掛け合わせる(`Color * VertexColor`)処理を内部で実行していない場合、当然ながら色はマテリアル固有のまま変化しません。
3. 解決のためのステップ・バイ・ステップ手順
ステップ①:Particle Systemの Renderer モジュールでのストリームバインド
- 対象の Particle System のゲームオブジェクトを選択します。
- インスペクターの最下部にある Renderer モジュールを開きます。
- **`Custom Vertex Streams`** チェックボックスを有効化します。
- ストリームリストに **`Color (COLOR)`** を `[+]` ボタンから追加します。
☑ Custom Vertex Streams
- Position (POSITION)
- Color (COLOR) <-- これを追加!
ステップ②:Shader Graphでの頂点カラー乗算ノードの追加
メッシュ用の自作マテリアルに Shader Graph を使用している場合は、以下の接続を行ってください。
- Shader Graph エディタを開きます。
- 『Vertex Color』ノードを新規作成します。
- 『Sample Texture 2D』等のメインカラー出力と、『Vertex Color』の出力を接続する『Multiply(乗算)』ノードを作成します。
- 乗算した結果を、マスタースタックの Base Color(およびアルファ透過エフェクトの場合は Alpha)に接続します。
4. メッシュパーティクルカラー設定のチェックリスト
| 確認するレイヤー | チェック項目 | 対応アクション |
|---|---|---|
| 1. 3Dモデル (DCCツール) | メッシュの頂点カラーバッファの有無 | Blenderなどの書き出し設定で『Vertex Colors』を含めてエクスポートする。 |
| 2. Particle System | Custom Vertex Streams | Rendererモジュールで `Color (COLOR)` を明示的にバインドする。 |
| 3. Shader / Material | 頂点カラーの乗算ロジック | シェーダー内で `VertexColor` をサンプリングし、ベースカラーとアルファに乗算する。 |