ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
この記事の要点
- UE5 で「毎秒実行」は Set Timer by Event / Set Timer by Function Name で実装
- パラメータ:
Time = 1.0,Looping = trueで 1 秒間隔ループ - FTimerHandle を保持して Clear Timer で停止
- 毎フレーム実行は Tick、DeltaSeconds で時間正規化
- 1 フレーム後の遅延実行は Set Timer for Next Tick(Latent ノード)
1UE5 でタイマーを使う 3 つの方法
| 方法 | 用途 | 負荷 |
|---|---|---|
| Set Timer by Event / Function Name | 一定間隔で実行 (1 秒毎、5 秒毎) | 軽い |
| Event Tick | 毎フレーム実行 (60〜120 回/秒) | 重い(軽い処理に限定) |
| Delay ノード (Latent) | 一回だけ N 秒後実行 | 軽い |
2方法1: Set Timer by Event (Blueprint 推奨)
もっとも一般的。1 秒ごとにイベントを呼びたい場合:
Event BeginPlay
→ Set Timer by Event
Event: [Custom Event "OnSecondTick"]
Time: 1.0
Looping: true
→ 戻り値の Handle 変数を保存
カスタムイベントを定義
Custom Event: OnSecondTick
→ Print String: "1 秒経過"
→ Stamina -= 1
→ Update HUD
3方法2: Set Timer by Function Name (C++ 主流)
C++ では UWorld::GetTimerManager から取得する FTimerManager 経由で設定:
// MyCharacter.h
private:
FTimerHandle SecondTickHandle;
UFUNCTION()
void OnSecondTick();
// MyCharacter.cpp
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
// 1 秒ごとに OnSecondTick() を呼ぶ
GetWorld()->GetTimerManager().SetTimer(
SecondTickHandle,
this,
&AMyCharacter::OnSecondTick,
1.0f, // 間隔 (秒)
true // ループ
);
}
void AMyCharacter::OnSecondTick()
{
UE_LOG(LogTemp, Log, TEXT("Tick at %.2f"), GetWorld()->GetTimeSeconds());
Stamina = FMath::Max(0.0f, Stamina - 1.0f);
}
void AMyCharacter::EndPlay(const EEndPlayReason::Type Reason)
{
// タイマー解除(リーク防止)
if (UWorld* W = GetWorld())
{
W->GetTimerManager().ClearTimer(SecondTickHandle);
}
Super::EndPlay(Reason);
}
4方法3: Set Timer for Next Tick
「1 フレームだけ遅延して実行」したい場合(次フレームに値を見たい等):
GetWorld()->GetTimerManager().SetTimerForNextTick(
[this]()
{
// 次フレームで実行される
UE_LOG(LogTemp, Log, TEXT("Next tick"));
}
);
5Tick イベント (毎フレーム実行)
1 秒に何度も実行したいなら Timer ではなく Tick。DeltaSeconds で正規化が必須:
void AMyActor::Tick(float DeltaSeconds)
{
Super::Tick(DeltaSeconds);
// ❌ 悪い例 (フレームレートで速度が変わる)
// Position.X += 1.0f;
// ✅ 良い例 (秒速で正規化)
Position.X += Speed * DeltaSeconds;
SetActorLocation(Position);
}
// Actor の Tick を有効化(コンストラクタで)
AMyActor::AMyActor()
{
PrimaryActorTick.bCanEverTick = true;
PrimaryActorTick.TickInterval = 0.0f; // 0 = 毎フレ
}
// 任意間隔の Tick (Timer 代替)
AMyActor::AMyActor()
{
PrimaryActorTick.bCanEverTick = true;
PrimaryActorTick.TickInterval = 0.5f; // 0.5 秒ごと
}
6Timer の主要 API
| 関数 | 説明 |
|---|---|
SetTimer(Handle, Obj, Func, Rate, bLoop, FirstDelay) | タイマー開始 |
SetTimerForNextTick(Func) | 次フレーム実行 |
ClearTimer(Handle) | 停止 |
PauseTimer(Handle) | 一時停止 |
UnPauseTimer(Handle) | 再開 |
IsTimerActive(Handle) | 動作中か |
GetTimerRemaining(Handle) | 残り時間 |
GetTimerElapsed(Handle) | 経過時間 |
GetTimerRate(Handle) | 設定間隔 |
7具体的なユースケース
HP リジェネレーション
// 5 秒間ダメージを受けないと、1 秒ごとに +5 HP
void AMyCharacter::TakeDamageEvent(float Dmg)
{
HP -= Dmg;
// ダメージ受けたらリジェネ Timer 解除
GetWorld()->GetTimerManager().ClearTimer(RegenHandle);
// 5 秒後にリジェネ開始
GetWorld()->GetTimerManager().SetTimer(
RegenStartHandle,
[this]()
{
GetWorld()->GetTimerManager().SetTimer(
RegenHandle,
this, &AMyCharacter::Regen,
1.0f, true // 1 秒ごとループ
);
},
5.0f, false // 5 秒後一回
);
}
void AMyCharacter::Regen()
{
HP = FMath::Min(MaxHP, HP + 5.0f);
}
スポーン処理 (3 秒ごとに敵生成)
void ASpawner::BeginPlay()
{
Super::BeginPlay();
GetWorld()->GetTimerManager().SetTimer(
SpawnHandle,
this, &ASpawner::SpawnEnemy,
3.0f, true
);
}
void ASpawner::SpawnEnemy()
{
if (EnemyClass)
{
FActorSpawnParameters Params;
GetWorld()->SpawnActor<AEnemy>(EnemyClass, GetActorLocation(), FRotator::ZeroRotator, Params);
}
}
カウントダウン UI
void AMyController::StartCountdown(int32 Seconds)
{
RemainingSeconds = Seconds;
GetWorld()->GetTimerManager().SetTimer(
CountdownHandle,
this, &AMyController::TickCountdown,
1.0f, true
);
}
void AMyController::TickCountdown()
{
RemainingSeconds--;
UpdateHUD(RemainingSeconds);
if (RemainingSeconds <= 0)
{
GetWorld()->GetTimerManager().ClearTimer(CountdownHandle);
OnCountdownFinished();
}
}
8Niagara System での Tick 制御
パーティクル側で「毎秒スポーン」は Niagara の Spawn Rate モジュールを使うのが正解。Blueprint Timer で Activate / Deactivate を切り替える方法も:
// 毎秒パーティクル発射
GetWorld()->GetTimerManager().SetTimer(
FXHandle,
[this]()
{
UNiagaraFunctionLibrary::SpawnSystemAtLocation(
this, FXSystem, GetActorLocation()
);
},
1.0f, true
);
9パフォーマンス注意
- Timer はTick より大幅に軽い(必要なときだけ呼ばれる)
- ただし大量に作るとマネージャ自体の負荷になるので、1 アクタに数個まで
- Tick は最終手段。毎フレ更新が本当に必要か再考
- 不要になった Timer は必ず ClearTimer(リークでメモリ・CPU 共に圧迫)
- キャラ EndPlay / Destroy では Timer 自動解除されるが、念のため明示的に
10FAQ
Q: Timer と Tick、結局どちらを使うべき?
A: 0.1 秒以上の周期なら Timer、毎フレ位置更新やアニメ補間なら Tick。判断基準は「FPS に関係するか」。
Q: タイマーが止まらない
A: FTimerHandle を保存し損ねている可能性大。SetTimer の戻り値(out 引数)を確実にメンバ変数として保持する。
Q: ゲームを一時停止すると Timer も止まる?
A: デフォルトでは止まります。SetTimerInPausedState やカスタム TimerManager で動作継続可能。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- 床の上に乗ったらイベントを発生させる方法
- OverlapAllDynamicとOverlapAllの違い
- タイトル画面を作る方法
- サードパーソンテンプレートでのキャラクター表示の仕組みと非表示にする方法
- ボタンに文字を記載する方法
- Event ActorBeginOverlapとOn Component Begin Overlapの違い
- キャラクターに特定のオブジェクトとの当たり判定を付ける
- 特定のオブジェクトに触れたとき、キャラクターが倒れるようにする
- 動いているオブジェクトに静止しているキャラクターが当たり判定を持たない原因と解決方法
- 「On Component Hit」に「Cast To ~」で複数のクラスを指定する方法
- Blenderファイルをインポートする方法
- 鏡を作成する方法
- レベルブループリントでキャラクターの出現を設定する方法
- サードパーソンテンプレートにおけるキャラクター出現の定義
- アイテムに近づいたらボタンを押してイベントを発火させる方法
- 画面の中央にメッセージを表示する方法
- どこからでも呼び出せるカスタムイベントを作成する方法
- カスタムイベントに引数を追加する方法
- 「Get Overlapping Actors」から特定のクラスの場合のみ処理を実行する方法
- オブジェクトに近づいている間だけメッセージを表示する方法
- PCの画面を操作するUIを作る方法
- コンテンツブラウザに画像を追加する方法
- SetInputMode_UIOnlyを取り消す方法
- 特定の画像の上にマウスカーソルを置いたら手マークにする方法
- オブジェクトがアウトライナーで選択できない原因と解決策
- PlayerStartを作成する方法
- メニュー画面を作成して開く方法
- 「Esc」キーを押してメニュー画面を開く方法
- イベントの「On Clicked」と「On Pressed」の違い
- 「Set Input Mode」の種類と使い方
- 「Set Game Paused」の使い方と詳細解説
- Motion Matchingとは?
- 「GameMode」と「GameModeBase」の違い
- マップに配置したTargetPointを取得する方法
- TargetPointにタグをつけて取得する方法
- Spawnしたインスタンスがイベントを実行する方法
- 特定の時間ごとに処理を実行する方法
- 数値をランダムで出力する方法
- ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
- MaxWalkSpeedを変更する方法
- しゃがむ動作を導入する方法
- キャラクターのアニメーションを設定する方法
- 導入済みのプラグインを確認する方法
- Motion Matchingの導入と必要なプラグイン
- プレイヤーを非表示にする方法
- カメラを傾ける角度を制限させる方法
- 配列からランダムに重ならない要素を特定の数取得する方法
- カメラの映す画面に文字やエフェクトを付ける方法
- キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
- プライマリーデータアセットを活用する方法
- プレイヤーのHPといった変数を定義する最適な場所
- カメラに映った画面をスクリーンショットとして保存する方法
- ゲーム内のカメラ映像を保存して再表示する方法
- HighResShot を使って高解像度の画像を保存する方法(UE5)
- HighResShotで保存した画像のファイル名を取得する方法
- SceneCapture2DとFrameGrabberの画像保存方法の比較
- SceneCapture2Dを使用して画像を保存・取得する方法
- HighResShotとTake High Res Screenshotの違い
- ゲーム終了ボタンを作成する方法
- 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
- 画面上にメッセージを指定された時間表示させる方法
- シェーダコンパイル時間を短縮する方法
- 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
- データベースを活用する方法
- UE5.5がインストールされた環境にUE5.4を追加で導入する方法
- World PartitionとWorld Compositionの違い
- オープンワールドテンプレートとは?
- ポーンをスポーンさせても視点を切り替えない方法
- キャラクター同士がすり抜けてしまう問題の解決方法
- キャラクターの外見を動的に変更
- World Partitionでインスタンスが「アンロード済み」になる問題
- データ アセットとデータ テーブルの違い
- コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
- エディターのソースコードの自動保存の頻度を高める方法
- SpawnActorでSpawn Transform Rotationが反映されない理由
- ミニマップを表示しポーンの位置を反映する方法
- RInterp ToとVInterp Toの違い
- 毎秒実行するイベントの定義方法
- Niagara のエフェクトにコリジョンを持たせる方法
- 「Overlap」と「Hit」の違い
- OverlapはあるがHitがない原因
- Overlapした位置の座標を取得する方法
- ブループリントでレベル間のパラメータを受け渡す方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 Spring Frameworkのアノテーション一覧
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- PHP $_SERVERとは|DOCUMENT_ROOT・PHP_SELFなど主な要素 2026-08-07 17:15:57
- PHPでのファイルアップロード方法|multipart/form-dataと$_FILES 2026-08-07 17:15:57
- Scratchのアカウントの作り方|メールアドレスとユーザー名の登録手順 2026-08-07 17:15:57
- Bluetoothとは|仕組み・BLEとClassicの違い・用途 2026-08-07 17:15:57
- Spring Bootのテスト入門|@SpringBootTestとJUnitでの単体・結合テスト 2026-08-07 17:15:57
- djangoにおけるMVCアプリケーション実装例 2026-08-07 17:15:57
- Scratch 作品の公開方法 2026-08-07 17:15:56
- 【PHPフレームワーク】Laravelの使い方 2026-08-07 17:15:56
- Google OAuth 2.0 認証の実装方法 2026-08-07 17:15:56
- APIキー取得方法 2026-08-07 17:15:56
- インストール方法(Windows版) 2026-08-07 17:15:56
- Java とは?言語仕様・JVM・主要フレームワーク一覧 2026-08-07 17:15:56
- データベースとは?RDB / NoSQL / SQL の基礎 2026-08-07 17:15:56
- インストール(eclipseプラグイン) 2026-08-07 17:15:56
- Spring Frameworkの使い方 2026-08-07 17:15:56
コメントを削除してもよろしいでしょうか?