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を指す) を削除し、VulkanOpenGLES3 (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 SpaceWorld または 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 版プレハブを用意し、動的に差し替える設計がマルチプラットフォーム開発におけるベストプラクティスです。