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 が動作しない(表示されない)主なプラットフォームと要件は以下の通りです。

  1. Android (ローエンド端末): Android で Compute Shader を動作させるには Vulkan または OpenGL ES 3.1 以上 のグラフィックスAPIが必要です。OpenGL ES 3.0 以前の古い端末や、一部の安価な端末(GPUドライバが OpenGL ES 3.1 を完全サポートしていないもの)では、VFX Graph のシェーダーコンパイルが失敗し、エフェクトが透明になります。
  2. WebGL (標準環境): WebGL 1.0 はもちろん、標準的な WebGL 2.0 も Compute Shader に対応していません。UnityでWebGL向けにVFX Graphを使用するには、実験的な「WebGL 2.0 Compute (一部のブラウザのみ)」か、次世代規格の「WebGPU」をターゲットにする必要があります。一般的な WebGL 配信(スマホブラウザ含む)では、VFX Graph は原則として使用できません。
  3. 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 の設定変更手順

  1. Edit > Project Settings > Player を開きます。
  2. Other Settings 内の Graphics APIs セクションを探します。
  3. Auto Graphics API のチェックを オフ (False) にします。
  4. リストから 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.");
            }
        }
    }
}

実装のステップ:

  1. エフェクトを制御したい箇所(キャラクターの足元、魔法の発射ポイントなど)に空の GameObject を配置し、VFXFallbackLauncher をアタッチします。
  2. VFX Graph で制作したリッチなエフェクト(vfxPrefab)と、それを Shuriken (Particle System) で再現した軽量・フォールバック用のエフェクト(shurikenPrefab)の両方を作成し、インスペクターにアサインします。
  3. アプリ起動時、自動的に端末の機能が検知され、最適なエフェクトが再生されます。これにより、ローエンド端末でもエフェクトが「全く見えない」という最悪の状況を回避できます。

4. フォールバック用 Shuriken エフェクト制作のコツ

VFX Graph と Shuriken は構造や表現力が異なるため、完全に同じエフェクトを再現するのは困難ですが、以下のポイントを意識することで違和感のないフォールバックエフェクトを構築できます。

  • パーティクル数の削減: VFX Graph で 10,000 個の粒子を飛ばしていた場合、Shuriken では 100〜300 個程度に抑え、代わりに 1 粒子あたりのサイズを少し大きくしたり、テクスチャの密度を高めたりして見栄えを調整します。
  • テクスチャとマテリアルの共通化: VFX Graph と Shuriken で使用するテクスチャ(ノイズ、フレアなど)やパーティクルマテリアルを極力共通にすることで、アセット容量の増加を防ぎ、統一感を維持します。
  • シミュレーション空間の統一: VFX Graph はローカル/ワールド空間の計算が柔軟ですが、Shuriken の Simulation Space を World または Local で適切に合わせておくことで、親オブジェクトが移動した際の挙動乖離を防ぎます。

5. まとめ

  1. VFX Graph は GPU (Compute Shader) 必須: 低スペックな Android 端末や WebGL などの非対応環境では、VFX Graph は描画されず透明になります。
  2. Player Settings で非対応 API を除外する: Android では OpenGL ES 3.0 をターゲットから除外し、Vulkan / OpenGL ES 3.1 以上に強制します。
  3. SystemInfo.supportsComputeShaders で動的判定: C# スクリプトを用いて、実行時に Compute Shader の対応有無をスマートに判断します。
  4. Shuriken によるフォールバックを組み込む: 低スペックデバイス向けに、デザインを簡略化した Particle System 版プレハブを用意し、動的に差し替える設計がマルチプラットフォーム開発におけるベストプラクティスです。