タイマー は、遅延期間後、または継続期間中に絶えずアクションを実行します。 たとえば、特定のアイテムの取得後にプレイヤー キャラクターを無敵にし、数秒後にそれらを脆弱な状態に戻したい場合があります。または、炎の中に立っているプレイヤーに毎秒ダメージを与えたい場合があります。 この操作ガイドでは、Fire Effect Actor のボリュームの中を歩くと火がついてダメージを受けるプレイヤー キャラクターにタイマーを実装します。プレイヤーは炎の中に長時間立ち続けると、爆発して破壊します。
プロジェクトの設定
- まず、[New (新規)] > [Games (ゲーム)] > [Third-Person (サードパーソン)] > [Blueprint (ブループリント)] を選択して、[With Starter Content (スターターコンテンツ有り)] を有効にし、「Timers」という名前のプロジェクトを作成します。
「Third Person (サードパーソン)」テンプレート プロジェクトでは、入力を受け取るためにマッピング済みのサードパーソン キャラクターが提供されています。さらに、プロジェクトで スターター コンテンツ を設定することで、各種サウンドおよび、炎などのパーティクル エフェクトを使用することができます。
(w:600)
プロジェクト タイプを切り替えるドロップダウン (1)、スターター コンテンツの有効/無効を設定するドロップダウン (2)、プロジェクト名のフィールド、(4) プロジェクトを初期化する [Create Project (プロジェクト作成)] ボタン。
Fire Effect アクタを作成する
Fire Effect アクタは「Starter Content」フォルダ内に ブループリント クラスとして格納されています。Fire Effect アクタには、炎エフェクト用の パーティクル システム コンポーネント および、炎のサウンド用の オーディオ コンポーネント が含まれています。また、炎エフェクトの Initial Lifespan の値を設定する必要があります。アクタの存続期間が終了すると、アクタは破壊されます。
詳細については、「アクタのライフサイクル」を参照してください。
-
「コンテンツ」 > 「StaterContent」 > 「Blueprints」を選択して、Blueprint_Effect_Fire をダブルクリックして [Class Defaults (クラスのデフォルト)] を開きます。
-
[Details (詳細)] パネルで、[Actor (アクタ)] カテゴリに移動して、Initial LifeSpan 変数を「1.5」に設定します。
(w:600)
-
[Compile (コンパイル)] と [Save (保存)] を順にクリックします。
完成したブループリント

爆発エフェクトを作成する
Explosion Effect アクタ は「Starter Content」フォルダ内に ブループリント クラスとして格納されています。Explosion Effect アクタには、爆発エフェクト用の Particle System コンポーネント、および爆発サウンド用の Audio コンポーネントが含まれています。また、爆発エフェクトの Initial Lifespan の値を設定する必要があります。アクタの存続期間が終了すると、アクタはゲームプレイから破棄されます。
-
「コンテンツ」 > 「StaterContent」 > 「Blueprints」を選択して、Blueprint_Effect_Explosion をダブルクリックして [Class Defaults (クラスのデフォルト)] を開きます。
-
[Details (詳細)] パネルで、[Actor (アクタ)] カテゴリに移動して、Initial LifeSpan 変数を「1.5**」に設定します。
(w:600)
-
[Compile (コンパイル)] と [Save (保存)] を順にクリックします。
完成したブループリント

プレイヤー キャラクターを実装する
「Third Person」テンプレートには、Player Character クラスが含まれています。このクラスは、Character Movement コンポーネントにマップされた入力キーが押されると、動作ロジックを使用するように作成されています。これは、Fire アクタのオーバーラップ境界にキャラクターを物理的に移動させるうえで役立つ動作です。また、追加機能の作成では、次のクラス メンバーを使用します。
クラス メンバー | 説明 |
---|---|
float Health | プレイヤーのヘルスを表す float 変数。 |
FTimerHandle | イベント ディスパッチャーおよびデリゲート を区別するための固有のハンドルを持つ構造体。タイマー ハンドルは、指定された時間で呼び出す TakeFireDamage 関数を管理します。 |
TakeFireDamage() | 指定したダメージ量だけプレイヤーのヘルスを減少させる関数。プレイヤーのヘルスがゼロになると、Explosion アクタがスポーンされて、プレイヤー キャラクターが破壊されます。 |
IgniteFireTimer() | プレイヤー キャラクターに FireEffect アクタをスポーンして、タイマー ハンドルに TakeFireDamage 関数を呼び出させる関数。 |
ClearFireTimer() | タイマー ハンドルをクリアして、TakeFireDamage 関数が呼び出されないようにする関数。 |
-
コンテンツ ブラウザ で、ThirdPersonCharacter ブループリントをダブルクリックして、[Class Defaults] を開きます。
-
[My Blueprint (マイ ブループリント)] パネルに移動して、[Variables (変数)] カテゴリの [Add (追加) (+)] ボタンをクリックして、「Health」という名前の新しい float 変数 を追加します。
-
ブループリントを コンパイル して、Health float 変数を選択した状態で、[Details] パネルに移動し、Health の値を「100.0」に設定します。
-
[My Blueprint (マイ ブループリント)] タブに戻り、[Variables] カテゴリの [Add (+)] ボタンをクリックして、「FireTimer」という名前の新しい TimerHandle 型の変数を作成します。
-
[My Blueprint (マイ ブループリント)] タブに戻り、[Functions (関数)] カテゴリの [Add (+)] ボタンをクリックして、「TakeFireDamage」、「IgniteFireTimer」、および「ClearFireTimer」という名前の 3 つの関数を作成します。
新しい関数を作成する [Add (+)] ボタン。(2) 3 つの新しい関数を作成:TakeFireDamage、IgniteFireTimer、ClearFireTimer。
TakeFire Damage 関数を実装する
-
TakeFireDamage 関数タブを開いた状態で、[My Blueprint] パネルに移動して、Health 変数を イベント グラフ にドラッグし、参照ノードを作成します。
-
Health 変数ピンを引き出して [Actions] メニューで Subtract ノードを検索して選択します。
-
プレイヤー キャラクター に負わせたいダメージ量に削減値を設定します。この例では、「-20.0」を選択しました。
-
[My Blueprint] パネルに戻って、Health 変数を イベント グラフ にドラッグし、参照ノードを作成します。
-
Health ピンを引き出して [Executable actions (実行可能なアクション)] メニューで less equal (less than or equal to) 演算子を検索して選択します。
-
Take Fire Damage ノードの 実行ピン を引き出して、[Executable actions] メニューで Branch を検索して選択します。
-
[My Blueprint] パネルに移動して、Health 変数のコピーを float - float ノードの Return Value までドラッグします。これで、Health 変数がこのノードの演算の結果に設定されます。
-
Health <= 0 Operator ノードの Return Value ピンを Branch ノードの Conditional ピンに接続します。次に、False 出力ピンを Set Health ノードの Set 入力ピンに接続します。
-
Branch ノードの True 実行ピンを引き出して、[Executable actions] メニューで Spawn Actor From Class を検索して選択します。次に、このクラス ピンから、Blueprint_Explosion_Effect を検索して選択します。
-
SpawnActor Blueprint Effect Explosion ノードから Spawn Transform ピンを引き出して、[Executable actions] メニューで Get Actor Transform を検索して選択します。
-
SpawnActor Blueprint Effect Explosion ノードの 実行ピン を引き出して、[Executable actions] メニューで DestroyActor を検索して選択します。
-
[Compile (コンパイル)] と [Save (保存)] を順にクリックします。
In-Progress ブループリント

IgniteFireTimer 関数を実装する
-
IgniteFireTimer 関数グラフを開きます。Ignite Fire Timer ノードの 実行ピン を引き出して、[Executable actions] メニューで Spawn Actor From Class を検索して選択します。次に、このクラス ピンから、Blueprint_Fire_Effect を検索して選択します。
-
SpawnActor Blueprint Fire Effect ノードから Spawn Transform ピンを引き出します。次に、[Executable actions] メニューで Get Actor Transform を検索して選択します。
-
SpawnActor Blueprint Fire Effect ノードの Return Value ピンを引き出します。次に、[Executable actions] メニューで AttachActorToComponent を検索して選択します。
-
AttachActorToComponent node ノードで、Socket Name ピンに移動して、spine_01 に設定します。次に、Location Rule ピンを Snap to Target に設定して、Rotation Rule ピンを Scale Rule to Keep Relative に設定します。次に、チェックボックスをオンにして、Weld Simulated Bodies ブール値を true に設定します。
-
AttachActorToComponent ノードの親ピンを引き出して、[Executable actions] メニューで Get Mesh を検索して選択します。
-
AttachToActorComponent ノードの実行ピンを引き出して、[Executable actions] メニューで Set Timer By Function Name を検索して選択します。次に、Function Name ピンを TakeFireDamage に設定して、Time ピンを「0.75」に設定します。最後に、チェックボックスをオンにして、Looping ブール値を true に設定します。
-
Set Timer By Function Name ノードの Timer Handle Return Value ピンを引き出して、[Executable actions] メニューで Set Fire Timer を検索して選択します。
-
[Compile (コンパイル)] と [Save (保存)] を順にクリックします。
In-Progress ブループリント

ClearFireTimer 関数を実装する
-
ClearFireTimer 関数グラフを開きます。[My Blueprint] パネルで FireTimer 変数をイベント グラフにドラッグします。
-
Fire Timer ピンを引き出して、[Executable actions] メニューで Clear and Invalidate Timer by Handle を検索して選択します。
-
[Compile (コンパイル)] と [Save (保存)] を順にクリックします。
In-Progress ブループリント

Fire Effect アクタを作成する
Fire Effect アクタは、レベル内の物理的な場所に存在するパーティクル エフェクトとして機能します。プレイヤー キャラクターが Fire Effect アクタにオーバーラップすると、着火し、時間の経過に伴いダメージを受ける機能を実装します。 この機能を実装するためには、次のクラス メンバーを作成する必要があります。
クラス メンバー | 説明 |
---|---|
BoxComponent | Fire Effect アクタのコリジョン ボリュームとして使用されるボックス。他のアクタがボックスの境界にオーバーラップすると、NotifyActorBeginOverlap 関数が呼び出されます。 |
ParticleSystemComponent | 視覚的な炎のエフェクトを提供するパーティクル エミッタ。 |
NotifyActorBeginOverlap | このアクタが他のアクタとオーバーラップすると (プレイヤーが Fire Effect アクタのオーバーラップ境界に使用されているボックス コンポーネントに立ち入るなど) トリガーされるイベント。 |
NotifyEndActorOverlap | 特定のアクタが他のアクタとオーバーラップしなくなり、両者が離れたときに (プレイヤーが Fire Effect アクタのオーバーラップ境界に使用されているボックス コンポーネントから出るなど) トリガーされるイベント。 |
-
コンテンツ ブラウザ に移動して、[Add/Import (追加/インポート)] ボタンをクリックします。ドロップダウン メニューから **[Blueprint Class (ブループリント クラス)] の作成を選択して、[Pick Parent Class (親クラスを選択)]** ウィンドウで、[Actor (アクタ)] を選択します。
-
[Class Defaults] から [Components (コンポーネント)] パネルに移動して、[Add Component (コンポーネントを追加)] ボタンをクリックし、Box Collision を検索して選択します。この Box Collision 形状に「OverlapVolume」という名前を付けます。
-
[Add Component] ボタンをクリックして、Particle System を検索して選択します。
-
Particle System の [Details] パネルで、[Particles (パーティクル)] カテゴリに移動します。Template 変数の横にある矢印を選択して、ドロップダウン アセット ウィンドウを表示します。P_Fire Particle アセットを検索して選択します。
-
イベント グラフ で右クリックして、[Actions (アクション)] ドロップダウン メニューから Actor Begin Overlap を検索して選択します。
-
Event ActorBeginOverlap ノードの Other Actor 出力ピンを引き出して、ドロップダウン メニューで、Cast To ThirdPersonCharacter を検索して選択します。
-
Cast To ThirdPersonCharacter ノードの As Third Person Character 出力ピンを引き出して、ドロップダウン メニューで、Ignite Fire Timer 関数を検索して選択します。
-
イベント グラフ で右クリックして、[Actions] ドロップダウン メニューから ActorEndOverlap を検索して選択します。
-
Event ActorEndOverlap ノードの Other Actor 出力ピンを引き出して、ドロップダウン メニューで、Cast To ThirdPersonCharacter を検索して選択します。
-
Cast To ThirdPersonCharacter ノードの As Third Person Character 出力ピンを引き出して、ドロップダウン メニューで、Clear Fire Timer 関数を検索して選択します。
-
[Compile (コンパイル)] と [Save (保存)] を順にクリックします。
完成したブループリント

最終結果
-
コンテンツ ブラウザから、Bp_FireActor のインスタンスをレベルにドラッグします。
-
エディタのツールバーに移動して、[Play (PIE) (プレイ (PIE))] をクリックして、エディタでプロジェクトをプレビューします。
矢印キーまたは WASD キーを使用して、キャラクターを Fire Effect アクタのボリュームに移動させます。ボリューム内に長く留まりすぎると、最終的にはキャラクターのヘルスがゼロになり、その時点でキャラクターが爆発します。

タイマーに関連するその他のノード
タイマーの開始/停止には、Set Timer by Function Name ノードおよび Clear Timer by Handle ノードを使用しますが、必要に応じて、次のノードも使用できます。
Get Timer Elapsed and Get Timer Remaining

Get Timer Elapsed by Handle ノードおよび Get Timer Remaining by Handle ノードは、それぞれ開始からの経過時間を返し、指定されたタイマー (ハンドルで示される) の残り時間を取得します。これらのノードは、値を float として返し、時間の経過とともにエフェクトを変化させる場合や、エフェクトの存続期間が終了する前にメッセージを表示する場合など、さまざまな目的で使用できます。
Pause Timer および Unpause Timer

Pause Timer by Handle は、現在の時刻でタイマーを一時停止し、Clear Timer by Handle は、タイマーを完全に停止してリセットします。Unpause Timer by Handle ノードを使用すると、一時停止したタイマーを再開し、停止した時点から続行することができます。たとえば、タイマー後に存続期間が終了するエフェクトがプレイヤーに適用されている場合に、プレイヤーがメニューやインベントリ画面に入ると、エフェクトを一時停止して、ゲームプレイに戻ったら再開させることができます。
Timer Exists、Is Timer Active、および Is Timer Paused

Does Timer Exist by Handle ノード、Is Timer Active by Handle ノード、および Is Timer Paused by Handle ノードはすべて、True または False の値を返します。それぞれ、タイマーが存在するかどうか、タイマーが現在アクティブかどうか、またはタイマーが現在一時停止しているかどうかを判定するために使用できます。
Set Timer by Event

Set Timer by Event ノードは、関数を指定する以外は Set Timer by Function Name ノードと同じように機能し、トリガーされる Custom Event ノードを接続することができます。Set Timer by Function Name ノードと同様に、このノードをループさせるように設定することもできます。
プロジェクトの設定
- まず、[New (新規)] > [Games (ゲーム)] > [Third-Person (サードパーソン)] > [C++] を選択して、[With Starter Content (スターター コンテンツ有り)] を有効にし、「Timers」という名前のプロジェクトを作成します。
「Third-person (サードパーソン)」テンプレート プロジェクトには、入力を受け取るためのマッピング済みのサードパーソン キャラクターがあります。さらに、プロジェクトで [With Starter Content] を設定することで、各種サウンドおよび、炎などのパーティクル エフェクトを使用することができます。

プロジェクト タイプを切り替えるドロップダウン (1)、スターター コンテンツの有効/無効を設定するドロップダウン (2)、プロジェクト名のフィールド、(4) プロジェクトを初期化する [Create Project (プロジェクト作成)] ボタン。
Fire Effect アクタを作成する
Fire Effect アクタは「Starter Content」フォルダ内のブループリント クラスです。Fire Effect アクタには、炎エフェクト用の UParticleSystemComponent および、炎のオーディオ用の UAudioComponent が含まれています。また、プレイヤー キャラクターが Fire Effect アクタにオーバーラップすると、TimerCharacter クラスで炎エフェクトをスポーンさせる C++ バージョンのクラスを作成する必要があります。
- コンテンツ ブラウザ で、[Add/Import (追加/インポート)] ボタンをクリックして、[New C++ Class (新規 C++ クラス)] を選択し、「FireEffect」という名前の新規 Actor クラスを作成します。

-
「
Fire Effect.h
」ファイルのクラスのデフォルトで、次のクラスを宣言します。protected: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) class UParticleSystemComponent* FireParticle; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) class UAudioComponent* FireAudio;
-
「
FireEffect.cpp
」ファイルに移動して、コンポーネント クラスのメンバーをインスタンス化するために、次のクラス ライブラリをインクルードします。#include "Particles/ParticleSystemComponent.h" #include "Components/AudioComponent.h"
-
FireEffect::FireEffect コンストラクタ
で、次のクラス メンバーをインスタンス化してアタッチします。// 各フレームでこのアクタが Tick() を呼び出すよう設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。 PrimaryActorTick.bCanEverTick = true; //アクタ コンポーネントをインスタンス化します。 FireParticle = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("FireParticle")); FireAudio = CreateDefaultSubobject<UAudioComponent>(TEXT("FireAudio")); //FireParticle エフェクトにアタッチされるオーディオ コンポーネントを設定します。 FireAudio->SetupAttachment(FireParticle); static ConstructorHelpers::FObjectFinder<UParticleSystem>ParticleAsset(TEXT("ParticleSystem'/Game/StarterContent/Particles/P_Fire.P_Fire'")); FireParticle->SetTemplate(ParticleAsset.Object); static ConstructorHelpers::FObjectFinder<USoundBase>AudioAsset(TEXT("SoundCue'/Game/StarterContent/Audio/Fire01_Cue.Fire01_Cue'")); FireAudio->SetSound(AudioAsset.Object); }
ConstructorHelpers は、Unreal Editor にあるオブジェクトへの参照を Cpp コードで割り当てるメソッドを提供するクラスです。
-
FireEffect::BeginPlay
メソッドに移動し、次のコードを実装します。{ Super::BeginPlay(); SetLifeSpan(1.5f); }
SetLifeSpan は、Actor クラスから継承されたメソッドで、Initial Lifespan 変数を設定する float を受け取ります。アクタの存続期間が終了すると、アクタは破壊されます。詳細については、「アクタのライフサイクル」を参照してください。
- コードをコンパイルします。
完成したコード
FireEffectActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FireEffect.generated.h"
UCLASS()
class TIMERS_API AFireEffect : public AActor
{
GENERATED_BODY()
public:
// このアクタのプロパティのデフォルト値を設定します。
AFireEffect();
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
class UParticleSystemComponent* FireParticle;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
class UAudioComponent* FireAudio;
protected:
// ゲームの開始時またはスポーン時に呼び出されます。
virtual void BeginPlay() override;
public:
// フレームごとに呼び出されます。
virtual void Tick(float DeltaTime) override;
};
FireEffectActor.cpp
#include "FireEffect.h"
#include "Particles/ParticleSystemComponent.h"
#include "Components/AudioComponent.h"
// デフォルト値を設定します。
AFireEffect::AFireEffect()
{
// 各フレームでこのアクタが Tick() を呼び出すよう設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。
PrimaryActorTick.bCanEverTick = true;
FireParticle = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("FireParticle"));
FireAudio = CreateDefaultSubobject<UAudioComponent>(TEXT("FireAudio"));
FireAudio->SetupAttachment(FireParticle);
static ConstructorHelpers::FObjectFinder<UParticleSystem>ParticleAsset(TEXT("ParticleSystem'/Game/StarterContent/Particles/P_Fire.P_Fire'"));
FireParticle->SetTemplate(ParticleAsset.Object);
static ConstructorHelpers::FObjectFinder<USoundBase>AudioAsset(TEXT("SoundCue'/Game/StarterContent/Audio/Fire01_Cue.Fire01_Cue'"));
FireAudio->SetSound(AudioAsset.Object);
}
// ゲームの開始時またはスポーン時に呼び出されます。
void AFireEffect::BeginPlay()
{
Super::BeginPlay();
SetLifeSpan(1.5f);
}
// フレームごとに呼び出されます。
void AFireEffect::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
Explosion Effect アクタを作成する
Explosion Effect アクタ は「Starter Content」フォルダ内にブループリント クラスとして格納されています。Explosion Effect アクタには、爆発エフェクト用の Particle System コンポーネント、および爆発サウンド用の Audio コンポーネントが含まれています。また、プレイヤー キャラクターのヘルスがゼロになると、TimerCharacter クラスで爆発エフェクトをスポーンさせることを目的とするゲームプレイ機能を実現するために、このクラスの C++ バージョンを作成する必要があります。
-
コンテンツ ブラウザ で、[Add/Import] ボタンをクリックして、[New C++ Class] を選択し、「ExplosionEffect」という名前の新規 Actor クラスを作成します。
-
「
ExplosionEffect.h
」ファイルのクラスのデフォルトで、次を宣言します。protected: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) class UParticleSystemComponent* ExplosionParticle; UPROPERTY(EditDefaultsOnly,BlueprintReadOnly) class UAudioComponent* ExplosionAudio;
-
「
ExplosionEffect.cpp
」ファイルに移動して、クラス メンバーをインスタンス化するために、次のクラス ライブラリをインクルードします。#include "Particles/ParticleSystemComponent.h" #include "Components/AudioComponent.h"
-
ExplosionEffect::ExplosionEffect
コンストラクタで、次のクラス メンバーを実装します。// フレームごとにTick()を呼び出すようにこのアクタを設定します。 必要ない場合は、これをオフにしてパフォーマンスを向上させることができます。 PrimaryActorTick.bCanEverTick = true; //アクタ コンポーネントを初期化します ExplosionParticle = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("ExplosionParticle")); ExplosionAudio = CreateDefaultSubobject<UAudioComponent>(TEXT("ExplosionAudio")); //オーディオ コンポーネントを ExplosionParticle エフェクトに設定します。 ExplosionAudio->SetupAttachment(ExplosionParticle); static ConstructorHelpers::FObjectFinder<UParticleSystem>ParticleAsset(TEXT("ParticleSystem'/Game/StarterContent/Particles/P_Explosion.P_Explosion'")); ExplosionParticle->SetTemplate(ParticleAsset.Object); static ConstructorHelpers::FObjectFinder<USoundBase>AudioAsset(TEXT("SoundCue'/Game/StarterContent/Audio/Explosion_Cue.Explosion_Cue'")); ExplosionAudio->SetSound(AudioAsset.Object); }
-
次に、
ExplosionEfect::BeginPlay
メソッドに移動し、次のコードを実装します。void AExplosionEffect::BeginPlay() { Super::BeginPlay(); SetLifeSpan(1.5f); }
-
コードをコンパイルします。
完成したコード
ExplosionEffect.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ExplosionEffect.generated.h"
UCLASS()
class TIMERS_API AExplosionEffect : public AActor
{
GENERATED_BODY()
public:
// このアクタのプロパティのデフォルト値を設定します。
AExplosionEffect();
protected:
// ゲームの開始時またはスポーン時に呼び出されます。
virtual void BeginPlay() override;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
class UParticleSystemComponent* ExplosionParticle;
UPROPERTY(EditDefaultsOnly,BlueprintReadOnly)
class UAudioComponent* ExplosionAudio;
public:
// フレームごとに呼び出されます。
virtual void Tick(float DeltaTime) override;
};
ExplosionEffect.cpp
#include "ExplosionEffect.h"
#include "Components/AudioComponent.h"
#include "Particles/ParticleSystemComponent.h"
// Sets default values
AExplosionEffect::AExplosionEffect()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
ExplosionParticle = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("FireParticle"));
ExplosionAudio = CreateDefaultSubobject<UAudioComponent>(TEXT("FireAudio"));
ExplosionAudio->SetupAttachment(ExplosionParticle);
static ConstructorHelpers::FObjectFinder<UParticleSystem>ParticleAsset(TEXT("ParticleSystem'/Game/StarterContent/Particles/P_Explosion.P_Explosion'"));
ExplosionParticle->SetTemplate(ParticleAsset.Object);
static ConstructorHelpers::FObjectFinder<USoundBase>AudioAsset(TEXT("SoundCue'/Game/StarterContent/Audio/Explosion_Cue.Explosion_Cue'"));
ExplosionAudio->SetSound(AudioAsset.Object);
}
// ゲームの開始時またはスポーン時に呼び出されます。
void AExplosionEffect::BeginPlay()
{
Super::BeginPlay();
SetLifeSpan(1.5);
}
// フレームごとに呼び出されます。
void AExplosionEffect::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
Player Character クラスを実装する
「Third-Person」テンプレートには、Player Character クラスが含まれています。このクラスは、入力キーが押されると、動作ロジックを使用するように作成されています。これは、Fire Effect アクタのオーバーラップ境界にキャラクターを移動させるうえで役立ちます。また、追加機能の作成では、次のクラス メンバーを使用します。
クラス メンバー | 説明 |
---|---|
float Health | プレイヤーのヘルスを表す float 変数。 |
FTimerHandle | デリゲート を区別するための固有のハンドルを持つ構造体。タイマー ハンドルでは、指定された時間で呼び出す TakeFireDamage 関数を管理します。 |
void TakeFireDamage() | プレイヤーのヘルスを指定されたダメージ量だけ減少させる関数。プレイヤーのヘルスがゼロになると、Explosion アクタがスポーンされて、プレイヤー キャラクターが破壊されます。 |
void IgniteFireTimer() | プレイヤー キャラクターに FireEffect アクタをスポーンして、TakeFireDamage 関数を呼び出すようにタイマー ハンドルを設定する関数。 |
void ClearFireTimer() | タイマー ハンドルをクリアして、TakeFireDamage 関数が呼び出されないようにする関数。 |
FTimerDelegate | 「Delegate」テンプレートは、汎用的かつ型安全な方法で C++ オブジェクトでメンバー関数を呼び出すことができます。 |
-
まず、「C++ Classes」フォルダに移動して、TimerCharacter クラスをダブルクリックして「
TimerCharacter.h
」ファイルを開きます。 -
クラスの定義で、次を宣言します。
protected: FTimerHandle FireTimer; FTimerDelegate FireDelegate; UPROPERTY(BlueprintReadOnly) float Health; //プレイヤーのヘルス値を消耗させます。 UFUNCTION() void TakeFireDamage(); public: //Firetimer を呼び出し、火のエフェクト アクタをスポーンします。 void IgniteFireTimer(); //FireTimer ハンドルをクリアします。 void ClearFireTimer();
-
「
TimerCharacter.cpp
」ファイルに移動して、次のクラス ライブラリを追加します。#include "Kismet/GameplayStatics.h" #include "FireEffect.h" #include "ExplosionEffect.h"
-
TimerCharacter::FireActor
クラスのコンストラクタで、次のコードを宣言します。//デフォルト値を設定します。 AFireActor::AFireActor() { //アクタ コンポーネントをインスタンス化します。 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent")); OverlapVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("OverlapVolume")); FireParticleComp = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("FireParticleComp")); //アクタ コンポーネントをルートにアタッチします。 OverlapVolume->SetupAttachment(RootComponent); FireParticleComp->SetupAttachment(OverlapVolume); //オーバーラップ ボリュームのサイズを設定します。 OverlapVolume->SetBoxExtent(FVector(256, 256, 128)); }
-
次のコードを宣言して
ATimersCharacter::TakeFireDamage
関数を実装します。void ATimersCharacter::TakeFireDamage() { if (Health <= 0) { //アクタの体力が 0 以下になりました。Spawn Explosion Effect GetWorld()->SpawnActor<AExplosionEffect>(GetActorLocation(), GetActorRotation()); //アクタを破壊します。 Destroy(); } else { //アクタが燃えており、火によるダメージが付与されています。 Health = (Health - 20.0f); } }
タイマーは、アタッチされているオブジェクトが破壊されると、自動的にキャンセルされます。この場合、プレイヤー キャラクターが破壊されると、タイマー ハンドルは無効になり、この関数は呼び出されません。
-
ATimersCharacter::IgniteFireTimer
関数に対して次のコード ロジックを実装します。void ATimersCharacter::IgniteFireTimer() { GetWorldTimerManager().SetTimer(FireTimer, FireDelegate, 0.75f, true); AActor* TempFireEffect = GetWorld()->SpawnActor<AFireEffect>(GetActorLocation(), GetActorRotation()); TempFireEffect->AttachToActor(this, FAttachmentTransformRules::SnapToTargetIncludingScale); }
FTimerManager クラスの SetTimer 関数は、特定の関数やデリゲートを遅延後に呼び出すようにタイマーを設定し、その関数呼び出しを無限に繰り返すように設定することができます。これらの関数は、タイマー ハンドル (FTimerHandle) を作成します。タイマー ハンドルは、カウントダウンの一時停止および再開、残り時間のクエリや変更、タイマーのキャンセルに使用できます。タイマーが呼び出す関数内でタイマーを設定することは、その関数の呼び出しに使用されたタイマー ハンドルの再利用を含めて、安全です。 また、tTimers は、時間制限された期間内ではなく、次のフレームで実行することができます。これは、SetTimerForNextTick を呼び出すことで可能になりますが、この SetTimerForNextTick 関数ではタイマー ハンドルを作成しません。
-
最後に、
ATimersCharacter::ClearFireTimer
関数の次の定義を実装します。void ATimersCharacter::ClearFireTimer() { GetWorldTimerManager().ClearTimer(FireTimer); }
これで Fire Timer Handle は無効になりますが、このハンドルを再利用して新しいタイマーを管理することができます。既存のタイマー ハンドルで SetTimer を呼び出すと、そのタイマー ハンドルで参照されているタイマーがクリアされ、新しいタイマーに置き換えられます。
サンプル例:
void AMyActor::BeginPlay()
{
Super::BeginPlay();
// 現在より 2 秒後から、RepeatingFunction を 1 秒に 1 回呼び出します。
GetWorldTimerManager().SetTimer(MemberTimerHandle, this, &AMyActor::RepeatingFunction, 1.0f, true, 2.0f);
}
void AMyActor::RepeatingFunction()
{
// この関数を十分な回数呼び出したら、タイマーをクリアします。
if (--RepeatingCallsRemaining <= 0)
{
GetWorldTimerManager().ClearTimer(MemberTimerHandle);
// MemberTimerHandle を他のタイマーに再利用できるようになりました。
}
// ここで何か行ってください...
完成したコード
TimersCharacter.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "TimersCharacter.generated.h"
UCLASS(config=Game)
class ATimersCharacter : public ACharacter
{
GENERATED_BODY()
/** キャラクターの後ろにカメラを配置するカメラ ブーム*/
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
class USpringArmComponent* CameraBoom;
/** カメラをフォローします。*/
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
class UCameraComponent* FollowCamera;
public:
ATimersCharacter();
/** 基本回転速度 (度/秒)。最終的なターン率が他のスケーリングの影響を受ける場合があります。*/
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera)
float BaseTurnRate;
/** 基本ルックアップ/ダウンレート (度/秒)。最終的なレート (率) が他のスケーリングの影響を受ける場合があります。*/
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera)
float BaseLookUpRate;
protected:
virtual void BeginPlay() override;
/** VR での HMD の向きをリセットします。*/
void OnResetVR();
/** 前方/後方入力のために呼び出されます。*/
void MoveForward(float Value);
/** 左右の入力のために呼び出されます。*/
void MoveRight(float Value);
/*** 任意の率でターンするよう、入力を介して呼び出されます。
* @param Rate これは正規化された率で、「1.0」は希望のターン率を 100% 実現していることを意味します。
*/
void TurnAtRate(float Rate);
/**
* 任意の率でルックアップ/ルックダウンをターンするよう、入力を介して呼び出されます。
* @param Rate これは正規化された率で、「1.0」は希望のターン率を 100% 実現していることを意味します。
*/
void LookUpAtRate(float Rate);
/** タッチ入力が開始されたときのハンドラ。*/
void TouchStarted(ETouchIndex::Type FingerIndex, FVector Location);
/** タッチ入力が停止したときのハンドラ。*/
void TouchStopped(ETouchIndex::Type FingerIndex, FVector Location);
FTimerHandle FireTimer;
FTimerDelegate FireDelegate;
UPROPERTY(BlueprintReadOnly)
float Health;
UFUNCTION()
void TakeFireDamage();
protected:
// APawn インターフェース
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
// APawn インターフェースの終了
public:
/**CameraBoom サブオブジェクトを返します。**/
FORCEINLINE class USpringArmComponent* GetCameraBoom() const { return CameraBoom; }
/**FollowCamera サブオブジェクトを返します。**/
FORCEINLINE class UCameraComponent* GetFollowCamera() const { return FollowCamera; }
//FireTimer を設定して TakeFireDamage 関数を呼び出します。
void IgniteFireTimer();
//FireTimer の呼び出しをクリアします。
void ClearFireTimer();
};
TimersCharacter.cpp
#include "TimersCharacter.h"
#include "HeadMountedDisplayFunctionLibrary.h"
#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"
#include "Components/InputComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/Controller.h"
#include "GameFramework/SpringArmComponent.h"
#include "Kismet/GameplayStatics.h"
#include "FireEffect.h"
#include "ExplosionEffect.h"
// ATimersCharacter
ATimersCharacter::ATimersCharacter()
{
// コリジョン カプセルのサイズを設定します。
GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f);
// 入力のターン率を設定します。
BaseTurnRate = 45.f;
BaseLookUpRate = 45.f;
// コントローラーが回転するときは回転させないでください。影響を受けるのはカメラのみにします。
bUseControllerRotationPitch = false;
bUseControllerRotationYaw = false;
bUseControllerRotationRoll = false;
// キャラクターの動きを設定します。
GetCharacterMovement()->bOrientRotationToMovement = true; // 入力した方向にキャラクターが移動します...
GetCharacterMovement()->RotationRate = FRotator(0.0f, 540.0f, 0.0f); // ...この回転速度で実行します。
GetCharacterMovement()->JumpZVelocity = 600.f;
GetCharacterMovement()->AirControl = 0.2f;
// カメラ ブームを作成します (コリジョンがある場合はプレイヤーに向かって引きます)。
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
CameraBoom->SetupAttachment(RootComponent);
CameraBoom->TargetArmLength = 300.0f; // カメラがキャラクターの後ろをこの距離で追跡します。
CameraBoom->bUsePawnControlRotation = true; // コントローラーを基準にアームを回転させます。
// 追跡するカメラを作成します。
FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); // ブームの最後にカメラをアタッチして、コントローラーの方向と一致するようブーム自身に調整させます。
FollowCamera->bUsePawnControlRotation = false; // カメラは腕の動きに合わせて回転しません。
Health = 100.0f;
// 注:メッシュ コンポーネント上のスケルタルメッシュと Anim ブループリントの参照 (キャラクターから継承) は、
// MyCharacter という名前の、派生したブループリント アセットで設定されます (C++ での直接のコンテンツ参照を回避するため)。
}
void ATimersCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
// ゲームプレイ キー バインディングを設定します。
check(PlayerInputComponent);
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);
PlayerInputComponent->BindAxis("MoveForward", this, &ATimersCharacter::MoveForward);
PlayerInputComponent->BindAxis("MoveRight", this, &ATimersCharacter::MoveRight);
// さまざまなデバイスをそれぞれ処理するための回転バインディングには 2 つのバージョンがあります。
// 「turn」では、マウスなどの絶対デルタを提供するデバイスを処理します。
// 「turnrate」は、アナログのジョイスティックなど、ユーザーが「変更率」として処理することに決めたデバイス向けです。
PlayerInputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput);
PlayerInputComponent->BindAxis("TurnRate", this, &ATimersCharacter::TurnAtRate);
PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput);
PlayerInputComponent->BindAxis("LookUpRate", this, &ATimersCharacter::LookUpAtRate);
// タッチ デバイスを処理します。
PlayerInputComponent->BindTouch(IE_Pressed, this, &ATimersCharacter::TouchStarted);
PlayerInputComponent->BindTouch(IE_Released, this, &ATimersCharacter::TouchStopped);
// VR ヘッドセットの機能
PlayerInputComponent->BindAction("ResetVR", IE_Pressed, this, &ATimersCharacter::OnResetVR);
}
void ATimersCharacter::BeginPlay()
{
Super::BeginPlay();
FireDelegate.BindUFunction(this, FName("TakeFireDamage"));
}
void ATimersCharacter::OnResetVR()
{
UHeadMountedDisplayFunctionLibrary::ResetOrientationAndPosition();
}
void ATimersCharacter::TouchStarted(ETouchIndex::Type FingerIndex, FVector Location)
{
Jump();
}
void ATimersCharacter::TouchStopped(ETouchIndex::Type FingerIndex, FVector Location)
{
StopJumping();
}
void ATimersCharacter::TakeFireDamage()
{
if (Health <= 0)
{
GetWorld()->SpawnActor<AExplosionEffect>(GetActorLocation(), GetActorRotation());
Destroy();
}
else
{
Health = (Health - 20.0f);
}
}
void ATimersCharacter::IgniteFireTimer()
{
GetWorldTimerManager().SetTimer(FireTimer, FireDelegate, 0.75f, true);
AActor* TempFireEffect = GetWorld()->SpawnActor<AFireEffect>(GetActorLocation(), GetActorRotation());
TempFireEffect->AttachToActor(this, FAttachmentTransformRules::SnapToTargetIncludingScale);
}
void ATimersCharacter::ClearFireTimer()
{
GetWorldTimerManager().ClearTimer(FireTimer);
}
void ATimersCharacter::TurnAtRate(float Rate)
{
// 率に関する情報からこのフレームのデルタを計算します。
AddControllerYawInput(Rate * BaseTurnRate * GetWorld()->GetDeltaSeconds());
}
void ATimersCharacter::LookUpAtRate(float Rate)
{
// 率に関する情報からこのフレームのデルタを計算します。
AddControllerPitchInput(Rate * BaseLookUpRate * GetWorld()->GetDeltaSeconds());
}
void ATimersCharacter::MoveForward(float Value)
{
if ((Controller != nullptr) && (Value != 0.0f))
{
// どちらが前方かを調べます。
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
// get forward ベクター
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
AddMovementInput(Direction, Value);
}
}
void ATimersCharacter::MoveRight(float Value)
{
if( (Controller != nullptr) && (Value != 0.0f))
{
// どちらが右かを調べます。
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
// get right ベクター
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
// その方向に動きを追加します。
AddMovementInput(Direction, Value);
}
}
Fire Effect アクタを作成する
Fire Effect アクタは、レベル内の物理的な場所に存在するパーティクル エフェクトとして機能します。プレイヤー キャラクターが Fire Effect アクタにオーバーラップすると、着火し、時間の経過に伴いダメージを受ける機能を実装します。
クラス メンバー | 説明 |
---|---|
UBoxComponent | Fire Effect アクタのコリジョン ボリュームとして使用される Box コンポーネント。他のアクタがボックスの境界にオーバーラップすると、NotifyActorBeginOverlap 関数が呼び出されます。 |
UParticleSystemComponent | 炎のビジュアル エフェクトを提供するパーティクル エミッタ。 |
void NotifyActorBeginOverlap | このアクタが他のアクタとオーバーラップすると (プレイヤーが Fire Effect アクタのオーバーラップ境界に使用されている Box コンポーネントに立ち入るなど) トリガーされるイベント。 |
void NotifyEndActorOverlap | 特定のアクタが他のアクタとオーバーラップしなくなったときに (プレイヤーが Fire Effect アクタのオーバーラップ境界に使用されている Box コンポーネントから出るなど) トリガーされるイベント。 |
-
「C++ Classes」フォルダに移動して、コンテンツ ブラウザ を右クリックし、「FireActor」という名前の 新しい C++ Actor クラス を作成します。
-
AFireActor のクラスの定義で、次を宣言します。
UPROPERTY(EditDefaultsOnly,BlueprintReadOnly) class UBoxComponent* OverlapVolume; UPROPERTY(EditDefaultsOnly,BlueprintReadOnly) class UParticleSystemComponent* FireParticleComp; //アクタがオーバーラップしたときに呼び出されます。 virtual void NotifyActorBeginOverlap(AActor* OtherActor); virtual void NotifyActorEndOverlap(AActor* OtherActor);
-
次に、「FireActor.cpp」ファイルに移動して、次のクラス ライブラリをインクルードします。
#include "Particles/ParticleSystemComponent.h" #include "Components/BoxComponent.h" #include "TimersCharacter.h"
-
Fire アクタのコンストラクタで、次のクラスのデフォルトを初期化します。
AFireActor::AFireActor() { // 各フレームでこのアクタが Tick() を呼び出すよう設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。 PrimaryActorTick.bCanEverTick = true; //アクタ コンポーネントをインスタンス化します。 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent")); OverlapVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("OverlapVolume")); FireParticleComp = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("FireParticleComp")); //アクタ コンポーネントをルートにアタッチします。 OverlapVolume->SetupAttachment(RootComponent); FireParticleComp->SetupAttachment(OverlapVolume); //FireParticleComp エフェクトをスターター コンテンツ フォルダ内のアセットに設定します。 static ConstructorHelpers::FObjectFinder<UParticleSystem>ParticleAsset(TEXT("ParticleSystem'/Game/StarterContent/Particles/P_Fire.P_Fire'")); FireParticleComp->SetTemplate(ParticleAsset.Object); }
-
プレイヤー キャラクターが Fire Effect アクタのボリュームに入ると、タイマー ハンドルが TakeFireDamage 関数を呼び出す必要があります。
FireActor::NotifyActorBeginOverlap
関数を実装するには、次のコードを宣言します。void AFireActor::NotifyActorBeginOverlap(AActor* OtherActor) { ATimersCharacter* TimersCharacterRef = Cast<ATimersCharacter>(OtherActor); if (TimersCharacterRef) { TimersCharacterRef->IgniteFireTimer(); } }
-
プレイヤー キャラクターが自身のヘルスがゼロになる前に Fire Effect アクタのボリュームから出ると、タイマー ハンドルがタイマー ハンドル自身をクリアし、TakeFireDamage 関数の呼び出しを停止します。
FireActor::NotifyActorEndOverlap
関数に対しても同様のコード定義を実装します。void AFireActor::NotifyActorEndOverlap(AActor* OtherActor) { ATimersCharacter* TimersCharacterRef = Cast<ATimersCharacter>(OtherActor); if (TimersCharacterRef) { TimersCharacterRef->ClearFireTimer(); } }
完成したコード
FireActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FireActor.generated.h"
UCLASS()
class TIMERS_API AFireActor : public AActor
{
GENERATED_BODY()
public:
// このアクタのプロパティのデフォルト値を設定します。
AFireActor();
protected:
// ゲームの開始時またはスポーン時に呼び出されます。
virtual void BeginPlay() override;
UPROPERTY(EditDefaultsOnly,BlueprintReadOnly)
class UBoxComponent* OverlapVolume;
UPROPERTY(EditDefaultsOnly,BlueprintReadOnly)
class UParticleSystemComponent* FireParticleComp;
virtual void NotifyActorBeginOverlap(AActor* OtherActor);
virtual void NotifyActorEndOverlap(AActor* OtherActor);
public:
// フレームごとに呼び出されます。
virtual void Tick(float DeltaTime) override;
};
FireActor.Cpp
#include "FireActor.h"
#include "Particles/ParticleSystemComponent.h"
#include "Components/BoxComponent.h"
#include "TimersCharacter.h"
// デフォルト値を設定します。
AFireActor::AFireActor()
{
// 各フレームでこのアクタが Tick() を呼び出すよう設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。
PrimaryActorTick.bCanEverTick = true;
//アクタ コンポーネントをインスタンス化します。
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
OverlapVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("OverlapVolume"));
FireParticleComp = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("FireParticleComp"));
//アクタ コンポーネントをルートにアタッチします。
OverlapVolume->SetupAttachment(RootComponent);
FireParticleComp->SetupAttachment(OverlapVolume);
//FireParticleComp エフェクトをスターター コンテンツ フォルダ内のアセットに設定します。
static ConstructorHelpers::FObjectFinder<UParticleSystem>ParticleAsset(TEXT("ParticleSystem'/Game/StarterContent/Particles/P_Fire.P_Fire'"));
FireParticleComp->SetTemplate(ParticleAsset.Object);
}
// ゲームの開始時またはスポーン時に呼び出されます。
void AFireActor::BeginPlay()
{
Super::BeginPlay();
}
void AFireActor::NotifyActorBeginOverlap(AActor* OtherActor)
{
ATimersCharacter* TimersCharacterRef = Cast<ATimersCharacter>(OtherActor);
if (TimersCharacterRef)
{
TimersCharacterRef->IgniteFireTimer();
}
}
void AFireActor::NotifyActorEndOverlap(AActor* OtherActor)
{
ATimersCharacter* TimersCharacterRef = Cast<ATimersCharacter>(OtherActor);
if (TimersCharacterRef)
{
TimersCharacterRef->ClearFireTimer();
}
}
// フレームごとに呼び出されます。
void AFireActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
最終結果
-
コンテンツ ブラウザで「C++ Classes」フォルダに移動して FireActor クラスを右クリックし、[Create a Blueprint Class based on FireActor] を選択します。
-
Bp_FireActor のインスタンスをレベルにドラッグします。
-
エディタのツールバーに移動して、[Play (PIE) (プレイ (PIE))] をクリックし、エディタでプロジェクトをプレビューします。
矢印キーまたは WASD キーを使用して、Fire Effect アクタのボリュームにキャラクターを移動させます。ボリューム内に長く留まりすぎると、最終的にはキャラクターのヘルスがゼロになり、その時点でキャラクターが爆発します。

タイマー関連のその他の注記
タイマーは、グローバル タイマー マネージャー (FTimerManager 型) で管理されます。グローバル タイマー マネージャーは、Game Instance オブジェクト内および各 ワールド 内に存在します。 タイマー マネージャーでタイマーを設定するには、SetTimer と SetTimerForNextTick という 2 つの主な関数が使用されます。どちらにもいくつかのオーバーロードがあります。それぞれを任意の型のオブジェクトや関数デリゲートにアタッチできます。また、SetTimer は一定の間隔で繰り返すように設定することができます。その他のクラス メソッドについては、「Timer Manager API」のページを参照してください。 タイマーは、標準的な C++ 関数ポインタ TFunction オブジェクト または デリゲート で使用できます。
タイマーを一時停止/再開する
FTimerManager 関数 PauseTimer は、タイマー ハンドルを使用して、実行中のタイマーを一時停止します。これにより、タイマーがその関数呼び出しを実行することはなくなります。ただし、一時停止中は経過時間と残り時間の増分が停止します。UnPauseTimer は、一時停止したタイマーの実行を再開させます。
タイマー情報
タイマー マネージャーでは、特定のタイマーのタイム レート、経過時間、残り時間などの情報を取得するための関数も提供します。
IsTimerActive
FTimerManager クラスの IsTimerActive 関数は、指定されたタイマーが現在アクティブであり、一時停止されていないかどうかを特定するために使用されます。
次に例を示します。
// この武器は再び発砲できるようになるのを待機しているか?
GetWorldTimerManager().IsTimerActive(**this**, &AUTWeapon::RefireCheckTimer);
GetTimerRate
FTimerManager には、GetTimerRate という関数があり、そのタイマー ハンドルからタイマーの現在のタイム レート (アクティベーション間の時間) を返します。タイマーのレートを直接変更することはできませんが、SetTimer をそのタイマー ハンドルで呼び出すことで、タイマーをクリアし、異なるレートを使用する複製したタイマーを作成することができます。GetTimerRate は、タイマー ハンドルが有効でない場合は、-1 の値を返します。
次に例を示します。
// この武器は暖まるにつれて発射速度が変化します。現在、発砲を待機していますか? その場合、ショット間の現在の遅延はどれくらいの長さですか?
GetWorldTimerManager().GetTimerRate(**this**, &AUTWeapon::RefireCheckTimer);
GetTimerElapsed および GetTimerRemaining
FTimermanager は GetTimerElapsed および GetTimerRemaining を使用して機能を提供しており、提供されたタイマー ハンドルに関連付けられたタイマーの経過時間と残り時間をそれぞれ返します。GetTimerRate と同様に、これらの関数は、タイマー ハンドルが無効な場合は、-1 を返します。
次に例を示します。
// この武器が再び発射できるようになるまでどれくらいかかるか?-1 が戻されれば、準備が整っています。
GetWorldTimerManager().GetTimerElapsed(**this**, &AUTWeapon::RefireCheckTimer);
タイマーの経過時間と残り時間の合計は、そのタイマーのレートと等しい必要があります。