ゲーム内で必殺技の魔法エフェクト、キャラクターの足元から出る砂埃、あるいはフィールド上の燃え盛る篝火などを作る際、Unity標準の「Particle System( Shuriken )」は欠かせないツールです。開発が進むと、キャラクターの巨大化に合わせてエフェクト全体を大きくしたり、あるいは背景アセットとして篝火のプレハブを配置する際に、TransformのScale(スケール)を縮小してサイズを合わせたりすることが頻繁に行われます。しかし、親となるゲームオブジェクトの Transform Scale を2倍や0.5倍に変更したにもかかわらず、「放出される炎のサイズや煙の拡散範囲が全く変化せず、オリジナルの大きさのまま放出され続けてしまう」という表示の問題に直面したことはないでしょうか。本記事では、このパーティクルのスケール不整合の根本原因を、「箱と打ち上げ花火」の例え話を交えて解説し、正しい設定手順と各種 Scaling Mode の違いについて詳しく解説します。

1. 例え話で理解する:『巨大な梱包ダンボールと手のひらサイズの花火セット』

このパーティクルが親のスケールを無視して描画されるバグを直感的に理解するために、『巨大なダンボール箱の中に、手のひらサイズのおもちゃの花火セットを入れた状態』を想像してみましょう。

あなたがイベントの演出家(開発者)で、ステージに巨大な炎のエフェクトを置くために、アセットが入った「ダンボール箱(親オブジェクト)」を用意し、それを10倍の大きさに引き伸ばしました。そして、その巨大な箱を開けて中からエフェクト(パーティクルシステム)を起動します。しかし、箱の大きさ(Transform Scale)をどれだけ巨大化させても、中の花火そのものの設計図(Local設定)が「半径50cmで火花を出す」という固定ルールのままであった場合、花火は巨大な箱の真ん中で、ちっちゃくチョロチョロと元のサイズのまま火花を噴き出し続けます。観客から見れば、10倍のサイズの炎を期待したのに、ただ大きな空箱が置かれ、その中心で小規模なエフェクトが縮こまっている極めて格好悪い状態です。

これが、Particle Systemにおける『スケール不追従バグ』の正体です。パーティクルシステムに対して、「自分自身のサイズは、親の箱のサイズと掛け算して連動して変化(Hierarchy設定)してください」と明確に設定指示を出さない限り、エフェクトは親のTransformの変化を完全に無視して自分勝手なスケールで動作を続けてしまうのです。

2. 根本的な原因:Scaling Modeの設定による影響

Particle Systemのインスペクターの最上部にある基本モジュールには、`Scaling Mode` という設定項目が存在します。これがパーティクルの大きさを決定する計算式を定義しています。設定値には以下の3つがあり、初期設定(Local)のままであることが不具合の原因です。

① Local(ローカルスケールのみ適用・デフォルト)

パーティクル自身のゲームオブジェクトに設定されている Transform Scale のみを参照し、ヒエラルキーの親オブジェクトの Scale 変化はすべて無視します。プレハブ化して他のオブジェクトの子にした場合に、スケールが狂う原因になります。

② Hierarchy(親のスケールを完全伝搬・推奨)

親、そのまた親のTransformを含めた、すべての親オブジェクトの Scale 変化を掛け合わせて自身のパーティクルサイズ(放出サイズ、初期速度、重力影響、シェイプの大きさなど)を完全に連動・スケールさせます。演出用プレハブをシーン内に配置してサイズ調整する際には、この設定が必須となります。

③ Shape(シェイプの放出形状のスケールのみ適用)

パーティクルの放出範囲(Shapeモジュールのコーンやボックスのサイズ)には親のスケールを適用しますが、放出された後の個々のパーティクル画像自体の大きさは一切拡大縮小させません。エフェクト全体の密度や広がりだけを広げたい場合に使用する特殊なモードです。

3. 解決のためのステップ・バイ・ステップ手順

ステップ①:Scaling Mode を Hierarchy に切り替える

  1. 対象となる Particle System をアタッチしているゲームオブジェクトを選択します。
  2. インスペクターの最上部にある Particle System のメイン(基本)モジュールを展開します。
  3. Scaling Mode プロパティのドロップダウンをクリックし、デフォルトの `Local` から Hierarchy に変更します。

ステップ②:メッシュ(Mesh)パーティクルが拡大されない場合の追加対策

パーティクルが画像(ビルボード)ではなく、3Dモデルメッシュを放出する設定(Renderer -> Render Mode = Mesh)になっている場合、`Scaling Mode` を `Hierarchy` にするだけではメッシュのスケールが正しく追従しないことがあります。その場合は、Rendererモジュールの Mesh Scale プロパティが `(1, 1, 1)` になっているか、また頂点ストリームが適切に設定されているかを確認します。

// スケール変更をスクリプトから行う場合のC#コード例
using UnityEngine;

public class EffectScaler : MonoBehaviour
{
    public float targetScale = 2.5f;

    void Start()
    {
        // 親のTransformスケールを変更
        transform.localScale = Vector3.one * targetScale;

        // 子にある全てのParticleSystemのScalingModeがHierarchyになっていれば
        // 自動で全体が綺麗に2.5倍に拡大されます
    }
}

4. Scaling Modeの適用比較テーブル

モード名 親のScale変更への反応 放出形状(Shape)の連動 推奨されるユースケース
Local 反応しない(自身のスケールのみ) 連動しない UI用のエフェクトや、ヒエラルキーに依存せず常に一定サイズで表示したいエフェクト。
Hierarchy 完全に連動してスケールする 連動する ゲーム中に動的に拡大縮小するキャラクターの演出、ステージ配置用の炎やライティングプレハブ。
Shape 放出される粒子のサイズは変わらない 連動する 広い範囲に雨や雪を降らせるエフェクトで、降雨エリアだけを広げて雨粒の大きさは維持したい場合。