SpriteStudioPlayerForGodot で最高のパフォーマンスを引き出し、高度な再生制御を行うための設定や Tips を紹介します。
モバイル端末や多数のキャラクターを表示するシーンなど、描画負荷が高い環境で有効な設定です。
SpriteStudioPlayer2D の Skip Frames Enabled プロパティを有効にすると、描画処理が遅延した場合に中間の描画をスキップし、アニメーションの再生速度(ゲーム内での時間進行)を優先して維持します。
高リフレッシュレート(144Hz など)のモニターでの描画や、Godot 側でスローモーション演出を行う場合に非常に効果的です。
通常のアニメーションは設定された FPS (例: 30FPS や 60FPS) に従ってカクカクとコマ送りされますが、Sub Frame Enabled を有効にすると、現在の時間に基づいてキーフレーム間が自動的に補間計算され、非常に滑らかなアニメーションが実現できます。
Animation Process Mode を Manual にすると、ノードは自分でアニメーションを進めなくなります。スクリプトから advance(delta) を呼ぶまで何も動きません。
@onready var ss_player: SpriteStudioPlayer2D = $SpriteStudioPlayer2D
func _ready() -> void:
ss_player.set_animation_process_mode(SpriteStudioPlayer2D.ANIMATION_PROCESS_MANUAL)
func _process(delta: float) -> void:
# Engine.time_scale やノードの speed_scale とは独立した、
# 自前のスローモーショングループ。
ss_player.advance(delta * _bullet_time)advance() は自動更新とまったく同じ処理を行います(frame_updated の発行も含むため、SpriteStudioPartAttachment2D の子ノードなど、このシグナルで駆動されるものも同じフレームで追従します)。独自のポーズグループ、決定論的なステップ実行(リプレイ・テスト・フレームキャプチャ)、エンジン側の時間スケールに影響されない時間軸などに使います。
Note
Manual ではエディタプレビューが動きません。 SpriteStudio ボトムパネルが操作するのは再生状態であって時間ではないため、ノード自身が更新しない状態では、再生ボタンを押しても誰も進めない再生が始まるだけです。作業中は Idle のままにし、スクリプトから Manual に切り替えてください。
Note
Manual が止めるのは アニメーション であって、再生中のサウンドは止まりません。サウンドは撃ちっぱなしのため、アニメーションを一時停止した場合と同様に鳴り続けます。サウンド再生 を参照してください。
Tip
単純なスローモーションには speed_scale、シークには frame プロパティが適しています。Manual は 時間の供給源そのもの を自分で持つ必要がある場合のためのものです。
画面外のプレイヤーも、毎フレーム全パーツの評価を続けています。レンダラがカリングするのは 描画 だけで CPU 側の評価は止まらないため、群衆シーンでは誰にも見えていないキャラクターの分まで払うことになります。
これに使えるノードは Godot 側に既にあります。VisibleOnScreenEnabler2D は、自身の矩形が画面外にある間、対象ノードの process_mode を DISABLED にします。このノードだけでは分からないのがアニメーションの大きさで、それに答えるのが get_canvas_rect() です。
プレイヤーの子として VisibleOnScreenEnabler2D を追加し(既定の enable_node_path が .. なので親を指しています)、矩形を渡します。
extends SpriteStudioPlayer2D
@onready var _enabler: VisibleOnScreenEnabler2D = $VisibleOnScreenEnabler2D
func _ready() -> void:
animation_changed.connect(func(_name: String) -> void: _refresh_cull_rect())
_refresh_cull_rect()
func _refresh_cull_rect() -> void:
_enabler.rect = get_canvas_rect()対象を無効化した後も enabler 自体は動き続けます。可視判定を報告するのは _process のティックではなくレンダリングサーバなので、矩形が視界に戻った時点でプレイヤーも復帰します。
Important
animation_changed で矩形を読み直してください。 キャンバスはアニメーション単位でオーサリングされるため、アニメーションごとにサイズが違うパック(Ringo は大半が 800 x 600 なのに dead だけ 1300 x 600)では、一度設定したきりにすると大きい方の表示が遅れます。
Note
キャンバスは作者が絵を構成した枠であって、描画を測った輪郭ではありません。パーツはキャンバスの外にも描けるので、キャンバスから大きくはみ出すアニメーションがある場合は矩形を広げてください。上の値に Rect2.grow() を掛けるだけです。
Note
無効化されたプレイヤーは、裏で再生を続けるのではなく停止し、止まったフレームから再開します。待機ループには正しい挙動ですが、シーンの他の要素と歩調を合わせる必要があるものには向きません。既に鳴っているサウンドは影響を受けません(オーディオは撃ちっぱなしです)。
SpriteStudio でパーツに設定できる アドオンシェーダ は、そのままネイティブに再現されます。設定もマテリアルの割り当ても不要です。シェーダ ID は .ssab に含まれており、プラグインは初回使用時に Godot シェーダをコンパイルし、(シェーダ, ブレンドモード) の組み合わせごとにキャッシュします。
SS6 のリファレンス実装から移植された 13 種類が利用できます。
| ID | 効果 | パラメータ |
|---|---|---|
ss-sepia |
セピア / グレースケール | 強度(符号付き) |
ss-hsb |
色相 / 彩度 / 明度シフト | 色相・彩度・明度 |
ss-step |
明度によるポスタリゼーション | しきい値(符号付き)・段数・モノクロ↔着色の混合 |
ss-outline |
4 近傍のアルファエッジによる輪郭線 | しきい値(符号付き) |
ss-bmask |
明度しきい値マスク(上または下を破棄) | しきい値(符号付き) |
ss-blur |
9 タップのボックスブラー | フォーカスシフト |
ss-move |
方向性のあるスメア / モーションブラー | 距離・方向・強度 |
ss-wave |
サイン波による水平方向の歪み | 幅・高さ・位相 |
ss-noise |
テクセル単位の疑似ランダムノイズ重畳 | 強度・色・位相 |
ss-pix |
UV 量子化によるモザイク | ブロックサイズ |
ss-scatter |
セル単位の方向性 UV 散乱 | 強度・比率・位相 |
ss-circle |
セル矩形の極座標展開 | — |
ss-spot |
放射状のスポットライトグラデーション | — |
この一覧に無いシェーダ ID を持つパーツは、描画に失敗するのではなくデフォルトシェーダにフォールバックします。未知のアドオンが設定されていても、そのパーツは効果なしで表示されます。
Important
アドオンを持つパーツはドローコールを 1 つ消費します。 通常のパーツはバッチにまとめられますが、アドオンシェーダを持つパーツは固有のユニフォームを必要とするため、専用のキャンバスアイテムとマテリアルで描画されます(どちらもプールされてフレーム間で再利用されるため、コストはドローコールであってアロケーションではありません)。したがってエフェクトは「少数のパーツに使うと安く、全体に使うと高い」という、一般的なオブジェクト単位マテリアルと同じトレードオフになります。
Note
ss-circle は展開のためにパーツの元矩形を必要とします。元矩形を持たないパーツ種別(Shape パーツなど)では何も描画されません。
Godot へインポートされたアニメーションバイナリには、2つの種類があります。
- SSAB (Animation Binary)
- 通常のアニメーションデータです。基本的にはこちらを使用します。
- SSQB (Sequence Binary)
- 複数のアニメーション(例:
歩き→走り→ジャンプ)を SpriteStudio 側で「シーケンス」としてタイムライン上に連結したものです。 - プログラム(GDScript)側で複雑な状態遷移を書かずとも、デザイナーが SpriteStudio 上で設定した通りの連続再生を Godot 上でそのまま再現したい場合に使用します。
- 注意 (現状):
SSQBResourceへの読み込みには対応していますが、シーケンス再生は現時点では未提供です(今後対応予定 — ロードマップ Phase 3 の state machine への内包、または Player 側 prototype)。当面の連続再生はanimation_finishedシグナルで GDScript 側から次アニメに切り替えて実現してください。
- 複数のアニメーション(例: