概要
FXに粒子の発生源(エミッター)を追加するノードです。どこから・ どれだけ・どの向きに・どんな速さで粒子が出るかを決めます。 炎なら「下から上向きに少しずつ」、爆発なら「中心から全方向に一斉に」。
使い方のポイント
- エフェクトの性格は
rate(継続的に出る=炎・煙)とburst(最初に一斉=爆発・着弾)の使い分けでほぼ決まる maskに画像をつなぐと「キャラのシルエットから発火」のような 形指定の発生ができる(mask は発生範囲であって粒子の見た目ではない)- エミッターは複数直列にできる: 「炎の芯+周囲の火の粉」のような 多層FXは emitter を2つ重ねる
関連ノード
fx_domain_2d— 前段(土台)fx_force— 発生後の動きの制御fx_rasterize— 粒子の見た目(stamp)はこちら側path_mask— 発生範囲マスクの作成
主なパラメータ
| グループ | パラメータ | 役割 |
|---|---|---|
| 位置 | position_x, position_y |
発生中心です |
| 範囲 | shape, radius_x, radius_y |
点から出すか、円範囲から出すかです |
| マスク | mask_threshold |
発生マスクのどのアルファ値以上を有効領域とみなすかです |
| 時間 | start_frame, end_frame |
何フレーム目から何フレーム目まで出すかです |
| 発生量 | rate, burst |
毎フレームの発生量と、開始時の一括発生量です |
| 方向 | direction_deg, spread_deg |
基本方向と広がり角です |
| 初速 | speed_min, speed_max |
出た直後の速度範囲です |
| 寿命 | life_min, life_max |
何フレーム生きるかです |
| 見た目 | size_min, size_max, alpha_min, alpha_max |
粒子サイズと濃さの範囲です。サイズは FxRasterize 側の size_scale と組み合わせて最終見た目が決まります |
| 速度の乱れ | jitter |
粒子ごとの初速 X/Y に加える揺らぎです。発生位置の広がりは Circle と radius_x/y で指定します |
まず大事なこと
FxEmitter2Dは 画像を描くノードではありません- ここで決めているのは「どこから、どれくらい、どの向きへ出るか」です
- 実際の見た目は
FxRasterizeで決まります - 発生位置を画像で制御したい時は
maskを使います
mask の役割
maskは 粒子そのものの見た目 ではありませんmaskは どこから粒子を出してよいか を決める画像です- 白や不透明のピクセルでは発生できます
- 透明ピクセルでは発生できません
mask_thresholdは「どのアルファ値以上を有効にするか」ですmask_threshold = 0でも、完全透明なピクセルは常に発生不可です
つまり、
- 発生位置の形を画像で決めたい
FxEmitter2D.mask
- 粒子の見た目の形を画像で決めたい
FxRasterize.stamp
です。
どういう時に使うか
- 炎の根元を 1 箇所作りたい時
- 煙の発生源を複数置きたい時
- 飛沫や spark を burst 中心で出したい時
一番基本の使い方
FxDomain2D -> FxEmitter2D -> FxRasterize
まずは 1 emitter だけで十分です。
炎なら、次のような設定が分かりやすいです。
shape = circleposition = 16, 24radius = 2, 1rate = 2burst = 1direction = -90spread = 40speed = 0.5..1.5life = 3..6
マスクを使う基本レーン
PathMask / PixelCanvas / 画像ロード
-> FxEmitter2D.mask
たとえば、
- 文字の形から煙を出す
- 地面の割れ目から火花を出す
- 白い部分からだけ飛沫を出す
のような用途に向いています。
例: マスク付き emitter
{
"shape": "circle",
"position": [16, 24],
"radius": [6, 3],
"mask_threshold": 0.5,
"rate": 3.0,
"burst": 0
}
この場合、
- まず円範囲で候補位置を作り
- その位置が
maskの白い部分なら発生 - 透明なら発生しません
例
32x32 の炎っぽい設定例です。
{
"name": "Flame Base",
"shape": "circle",
"position": [16, 24],
"radius": [2, 1],
"start_frame": 0,
"end_frame": 7,
"rate": 2.0,
"burst": 1,
"direction_deg": -90.0,
"spread_deg": 40.0,
"speed_min": 0.5,
"speed_max": 1.5,
"life_min": 3.0,
"life_max": 6.0,
"size_min": 1.0,
"size_max": 2.0,
"alpha_min": 0.5,
"alpha_max": 1.0,
"jitter": 0.4
}
使い所
- 炎: 下側に 1〜2 個置く
- 煙:
directionを弱め、lifeを長くする - 飛沫:
burstを大きくしてlifeを短くする
密度とサイズを変えたい時
- 密度を上げる
rateを上げるburstを増やすlife_maxを伸ばして画面内に残る数を増やすradius_x / radius_yやspread_degを小さくして同じ範囲に詰める
- 粒子を大きくする
size_min / size_maxを上げる- さらに
FxRasterize.size_scaleで全体倍率を掛ける
例:
size_min = 1, size_max = 1- 小さい粒子だけ出ます
size_min = 2, size_max = 4- 粒子ごとに 2〜4 の大きさの差が出ます
注意
end_frame = -1は「最後まで」です- emitter を増やすほど粒子数は増えます
- 重くなりすぎる前に
rate,life,sizeを小さく抑えるのが P11 向きです maskをつないでも、完全に透明な領域からは粒子は出ませんshape = pointの時は 1 点だけ判定するので、maskに外れるとその粒子は出ませんspeed/life/size/alphaの最小値が最大値を超える場合は、 評価時に入れ替え、Inspector に警告を出しますstart_frame/end_frameが FX の範囲外、または終了が開始より前の場合は、 有効な発生区間へ補正し、Inspector に警告を出します