「毎フレーム動いてほしいから、とりあえずEvent Tickに繋ぐ」。これで動きます。ただ、その習慣のまま敵を100体並べた日に、フレームレートは静かに崩れ始めます。
Event Tickの怖さは、1つ1つが軽くても 数を掛け算した瞬間に牙をむく ことです。この記事では、「常に見張る」から「起きたときだけ動く」へ切り替える Tick-less(ティックレス)設計 を、3つの代替手段とあわせて解説します。実践では、Tickまみれの見張りAIを「完全に眠れるAI」へ建て直します。
この記事でわかること
- Tickのコストは 60回/秒 × 体数 で爆発する
- 脱Tickの合言葉は 「見張るのをやめて、教えてもらう」(イベント駆動)
- 3つの代替手段: Timer・Event Dispatcher・Collision Events
- どうしてもTickが要るときの Tick Interval と ON/OFF切り替え
- 実践:見張りAIを 「完全に眠れる」設計 に建て直す
Event Tickのコストと問題点
Event Tickは、Actorがアクティブな限り 毎フレーム 実行されます。60FPSなら1秒に60回。ここまでは知っているとおりで、問題はその先の掛け算です。

100体の敵がそれぞれTickで距離チェックをすれば、 毎秒6000回 の処理になります。BlueprintはC++より実行が遅いため、この数の暴力はフレームレートに直撃します。
そして初心者が最もやりがちなTickの使い方が ポーリング(Polling) 、つまり「変化していないか、毎フレーム確認しに行く」やり方です。
やりがちな例:毎フレーム の距離チェック
Event Tick → Get Distance To(プレイヤー) → Branch(500未満?) → 何かする
プレイヤーが遠くにいる99%の時間も、無駄な距離計算が走り続けます。 見張り続けるのではなく、教えてもらう 。これがTick-less設計の核心です。

Tick-less設計:3つの代替手段
「何かが起こった時だけ実行する」イベント駆動への切り替えは、この3つの道具で実現します。

手段1:周期処理は「Timer」
毎フレームは不要でも定期的に走らせたい処理(毒のスリップダメージ、AIのターゲット再検索など)は、Set Timer by Event に任せま す。
Event BeginPlay → Set Timer by Event(Time: 0.5, Looping: True)
Event ピン ← Custom Event: HealOverTime
HealOverTime → Health に +1 して Set
60FPSのTickなら1秒に60回のところ、0.5秒Timerなら 2回 。処理回数が30分の1になります。
手段2:状態変化の監視は「Event Dispatcher」
「ドアが開いたか毎フレーム確認する」のではなく、 ドアが開いた瞬間に向こうから教えてもらいます 。ドア側は開いた時に OnDoorOpened をCallするだけ、聴きたい側はBindしておくだけです。詳しい実装の型はEvent Dispatcherの記事で扱ったとおりです。
手段3:接近・接触の検出は「Collision Events」
冒頭の「距離を毎フレーム測る」問題の正解がこれです。Sphere CollisionやBoxのトリガーを置けば、 On Component Begin Overlap が「入った瞬間」に1回だけ 呼ばれます。距離計算は物理エンジンが最適化された形で肩代わりしてくれます。
On Component Begin Overlap(検知範囲のSphere) → プレイヤー判定 → 追跡開始
On Component End Overlap → 追跡終了
Tickが必要な場合の最適化
滑らかな移動やカメラ制御など、本当に毎フレームが必要な処理もあります。そのときは「使い方」を最適化します。
- Tick Interval で頻度を下げる: Actorの詳細パネルで
Tick Intervalを設定(既定0.0=毎フレーム)。索敵のように多少の遅延が許される処理なら0.1(毎秒10回)で十分なことが多いです - Tickを状態でON/OFFする:
Set Actor Tick Enabledで、必要な間だけTickを生かします。「追跡中はON、待機中はOFF」という形です。次の実践でこのスイッチを組みます

実践:見張りAIを「完全に眠れる」設計に建て直す
仕上げに、3つの道具とTickスイッチを1体のAIに統合します。題材はステルスゲームの見張り、サバイバルの徘徊モンスター、タワーディフェンスの迎撃塔——「近づくまで何もしなくていい敵」です。
