Unityの Visual Effect Graph (VFX Graph) は、GPU の並列処理能力をフルに活かして数十万〜数百万個のパーティクルを美しく滑らかに描画できる非常に強力なツールです。近年では、3D ゲームのメインエフェクト構築において Shuriken (従来の Particle System) に代わる選択肢として標準的に使用されています。
しかし、開発PCやハイエンド端末では華麗に動いていたエフェクトが、一部のミドル〜ローエンド Android 端末、古いスマートフォン、あるいは WebGL 向けビルドにおいて「エフェクトが一切表示されない(透明になる)」「描画されない」という致命的な問題に直面することが頻繁にあります。
本記事では、VFX Graph が表示されない根本原因である Compute Shader (コンピュートシェーダー) の動作要件を解説し、グラフィックスAPIの正しい設定、および C# スクリプトで動的に対応非対応を検出し Shuriken へ切り替える「フォールバックシステム」の実装手順を解説します。
1. 根本原因:VFX Graph の Compute Shader 依存と動作要件
従来の Shuriken (Particle System) は、パーティクルの生成・移動・寿命計算などの挙動シミュレーションを CPU 上で実行し、描画データのみを GPU に送信する仕組み(CPUシミュレーション)でした。そのため、GPU 性能が低くても動作自体は可能でした。
これに対し、VFX Graph はパーティクルの挙動計算から色の変化、衝突判定まで、すべてのシミュレーション処理を GPU 上で実行します。この GPU シミュレーションを実現するために、VFX Graph は内部で Compute Shader をフル活用しています。
【Shuriken (従来)】 CPUで位置・寿命を計算 ──(毎フレーム頂点更新)──> GPU (通常の描画パス) ※どんな端末でも動くが、CPU負荷が高く、数千個が限界 【VFX Graph】 CPUは起動命令のみ ──> GPU Compute Shader (位置・寿命を高速並列計算) ──> GPU 描画 ※数万個の粒子も動くが、「Compute Shader」非対応の端末では動作しない!
図:CPUシミュレーション(Shuriken)とGPUシミュレーション(VFX Graph)の処理フローの違い
Compute Shader を利用するには、OS やハードウェア、グラフィックスAPIがこれをサポートしている必要があります。VFX Graph が動作しない(表示されない)主なプラットフォームと要件は以下の通りです。
- Android (ローエンド端末): Android で Compute Shader を動作させるには Vulkan または OpenGL ES 3.1 以上 のグラフィックスAPIが必要です。OpenGL ES 3.0 以前の古い端末や、一部の安価な端末(GPUドライバが OpenGL ES 3.1 を完全サポートしていないもの)では、VFX Graph のシェーダーコンパイルが失敗し、エフェクトが透明になります。
- WebGL (標準環境): WebGL 1.0 はもちろん、標準的な WebGL 2.0 も Compute Shader に対応していません。UnityでWebGL向けにVFX Graphを使用するには、実験的な「WebGL 2.0 Compute (一部のブラウザのみ)」か、次世代規格の「WebGPU」をターゲットにする必要があります。一般的な WebGL 配信(スマホブラウザ含む)では、VFX Graph は原則として使用できません。
- iOS (iPhone/iPad): iOS は Metal API が標準であり、Metal は Compute Shader をサポートしているため、基本的には動作します。ただし、極めて古い端末(iPhone 5s以前など)では制限を受ける場合があります。
2. 対策1:Graphics API の適切な設定(Player Settings)
意図しない API での起動を防ぐために、Unity のビルド設定(Player Settings)で対応APIを固定します。デフォルトの「Auto Graphics API」のままだと、Compute Shader 非対応の API が自動選択されるリスクがあります。
Android の設定変更手順
- Edit > Project Settings > Player を開きます。
- Other Settings 内の Graphics APIs セクションを探します。
- Auto Graphics API のチェックを オフ (False) にします。
- リストから OpenGLES3 (OpenGL ES 3.0を指す) を削除し、Vulkan と OpenGLES3 (3.1以上) のみに制限します。
※OpenGL ES 3.0を除外することで、ビルドされたアプリは必ず Compute Shader 対応APIで起動するようになり、起動時の自動クラッシュや描画バグを防げます。
3. 対策2:C# による Compute Shader サポート判定と動的フォールバック
対象デバイスの幅を狭めたくない(OpenGL ES 3.0 端末もサポートしたい)場合や、WebGL とマルチプラットフォーム展開する場合は、「Compute Shader 対応端末には VFX Graph を、非対応端末には Shuriken (Particle System) を表示する」 という動的なフォールバックの実装が必須です。
Unity では、実行環境が Compute Shader に対応しているかを SystemInfo.supportsComputeShaders プロパティから 1 行で判定できます。
VFXFallbackLauncher (フォールバック制御スクリプト)
using UnityEngine;
/// <summary>
/// 端末のCompute Shaderサポート状況を検出し、
/// VFX GraphプレハブとShurikenパーティプレハブを動的に切り替えて生成するランチャー。
/// </summary>
public class VFXFallbackLauncher : MonoBehaviour
{
[Header("High-end Target (Compute Shader Support Required)")]
[SerializeField] private GameObject vfxPrefab;
[Header("Low-end / WebGL Fallback (Shuriken Particle System)")]
[SerializeField] private GameObject shurikenPrefab;
[Header("Spawn Settings")]
[SerializeField] private bool playOnAwake = true;
private GameObject spawnedEffect;
private void Start()
{
if (playOnAwake)
{
SpawnEffect();
}
}
/// <summary>
/// 端末の動作環境に応じて適切なエフェクトプレハブを生成します。
/// </summary>
public void SpawnEffect()
{
// 既に生成済みの場合は一度破棄
if (spawnedEffect != null)
{
Destroy(spawnedEffect);
}
// 実行環境がCompute Shaderに対応しているか判定
if (SystemInfo.supportsComputeShaders)
{
// 対応している場合はVFX Graph版を生成
if (vfxPrefab != null)
{
spawnedEffect = Instantiate(vfxPrefab, transform.position, transform.rotation, transform);
Debug.Log("[VFXLauncher] Spawned GPU VFX Graph.");
}
}
else
{
// 非対応の場合はShuriken (Particle System) 版を生成
if (shurikenPrefab != null)
{
spawnedEffect = Instantiate(shurikenPrefab, transform.position, transform.rotation, transform);
Debug.LogWarning("[VFXLauncher] Compute Shader is not supported. Fallback to CPU Shuriken Particle System.");
}
else
{
Debug.LogError("[VFXLauncher] Fallback Shuriken prefab is not assigned.");
}
}
}
}
実装のステップ:
- エフェクトを制御したい箇所(キャラクターの足元、魔法の発射ポイントなど)に空の GameObject を配置し、
VFXFallbackLauncherをアタッチします。 - VFX Graph で制作したリッチなエフェクト(
vfxPrefab)と、それを Shuriken (Particle System) で再現した軽量・フォールバック用のエフェクト(shurikenPrefab)の両方を作成し、インスペクターにアサインします。 - アプリ起動時、自動的に端末の機能が検知され、最適なエフェクトが再生されます。これにより、ローエンド端末でもエフェクトが「全く見えない」という最悪の状況を回避できます。
4. フォールバック用 Shuriken エフェクト制作のコツ
VFX Graph と Shuriken は構造や表現力が異なるため、完全に同じエフェクトを再現するのは困難ですが、以下のポイントを意識することで違和感のないフォールバックエフェクトを構築できます。
- パーティクル数の削減: VFX Graph で 10,000 個の粒子を飛ばしていた場合、Shuriken では 100〜300 個程度に抑え、代わりに 1 粒子あたりのサイズを少し大きくしたり、テクスチャの密度を高めたりして見栄えを調整します。
- テクスチャとマテリアルの共通化: VFX Graph と Shuriken で使用するテクスチャ(ノイズ、フレアなど)やパーティクルマテリアルを極力共通にすることで、アセット容量の増加を防ぎ、統一感を維持します。
- シミュレーション空間の統一: VFX Graph はローカル/ワールド空間の計算が柔軟ですが、Shuriken の
Simulation SpaceをWorldまたはLocalで適切に合わせておくことで、親オブジェクトが移動した際の挙動乖離を防ぎます。
5. まとめ
- VFX Graph は GPU (Compute Shader) 必須: 低スペックな Android 端末や WebGL などの非対応環境では、VFX Graph は描画されず透明になります。
- Player Settings で非対応 API を除外する: Android では OpenGL ES 3.0 をターゲットから除外し、Vulkan / OpenGL ES 3.1 以上に強制します。
SystemInfo.supportsComputeShadersで動的判定: C# スクリプトを用いて、実行時に Compute Shader の対応有無をスマートに判断します。- Shuriken によるフォールバックを組み込む: 低スペックデバイス向けに、デザインを簡略化した Particle System 版プレハブを用意し、動的に差し替える設計がマルチプラットフォーム開発におけるベストプラクティスです。