とあるゲームプログラマの挑戦と敗北の歴史

UE4とプログラミングとmayaとpythonとhtmlとマラソンを中心に情報を発信する元「技術ブログを目指すブログ」から再始動した毎日の日々を発信するブログです。

UE4:マルチスレッドなディレイの作成手順

マルチスレッドなディレイの作成手順メモ

 

1.通常のDelay

「Delay」は
最初の呼び出しがあってから指定時間後 に次の遷移へと進行します。
(3回入力があっても2回目、3回目ははじかれるわけです)

f:id:toncrimentan_w:20200211123332j:plain

f:id:toncrimentan_w:20200211123308j:plain

 

2.Retriggerable Delay
「Retriggerable Delay」 は
最後の実行から指定時間後 に次の遷移へと進行します。
(3回入力があった場合は1回目、2回目は上書きされるわけです)

f:id:toncrimentan_w:20200211123229j:plain

f:id:toncrimentan_w:20200211123206j:plain

 

3.指定回数分呼び出されるDelayがほしい
指定回数分呼び出されるDelayが必要な場合は
「UKismetSystemLibrary :: Delay」 のソースコードを参考に
C++で自作のDelayを作る必要があります。

KismetSystemLibrary.cpp UKismetSystemLibrary::Delay()
の処理をコピーして作成し、一部消してしまえば作成できます。

 

ヘッダーファイル

UCLASS()
class X00_API UMyBlueprintFunctionLibrary
: public UBlueprintFunctionLibrary
{
GENERATED_BODY()
UFUNCTION(BlueprintCallable, meta=(Latent, WorldContext="WorldContextObject", LatentInfo="LatentInfo", Duration="0.2", Keywords="sleep"))
static void MyDelay(UObject* WorldContextObject, float Duration, struct FLatentActionInfo LatentInfo );
};

 

ソースファイル

#include "DelayAction.h"
#include "Kismet/KismetSystemLibrary.h"
if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))
{
FLatentActionManager& LatentActionManager = World->GetLatentActionManager();
LatentActionManager.AddNewAction(LatentInfo.CallbackTarget, LatentInfo.UUID, new FDelayAction(Duration, LatentInfo));
}

3回入力があった場合ははじかれも上書きもされず3回呼び出されます。

f:id:toncrimentan_w:20200211123129j:plain

f:id:toncrimentan_w:20200211123047j:plain