時刻回りの忘備録です。
日付と時刻 (Blueprint)
Blueprint では DateTime
という構造体で日付を管理できる。
Now
ノードで現在時刻を取得でき、AsDateTime
で文字列に変換できる。AsDateTime
はローカルタイムでの表示になるけど、UTC表示にする AsDateTime(From UTC)
という関数もある。
DateTime 構造体を Break すれば、ミリ秒の値まで取れる。精度がどのくらいあるかはわからない。
レベルブループリントに書いて実行すると上のような感じで時刻を表示できる。
今日の日付を返す Today
(時刻は 0:00 になる)、曜日を返す GetDay
もある。GetDay
の返り値は整数で、0が月曜、1が火曜・・・という感じになる。
時刻間の大小比較(>とか<=とか)もできる。
時間 (Blueprint)
時刻と時刻の差(時間)は、Timespan
構造体で管理する。DateTime
間の和や差は Timespan
型になる。
上のようなイベントグラフで、BeginPlay からの経過時間を表示できる。
Timespan
構造体もミリ秒まで情報を持っているので、一応ミリ秒単位での計算はできる。精度はよくわからない。さらに GetMicroseconds
というノードがあって、マイクロ秒の値が取得できるぽい。精度はそれこそ全くわからないけど・・・
DateTime
に Timespan
を加えたり、引いたりすると DateTime
型になる。
上のグラフでは現在時刻に1秒加えて、その結果を表示している。
日付と時刻 (C++)
FDateTime
構造体と FTimespan
構造体として、Blueprint とほぼ同様に扱える。
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TEWorker.generated.h"
UCLASS()
class TOWNEDITORV6_API ATEWorker : public AActor
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "MyLibrary")
FDateTime StartTime;
UFUNCTION(BlueprintPure, Category = "MyLibrary")
FTimespan GetPassedTime();
// Sets default values for this actor's properties
ATEWorker();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};
Actor のサブクラスとして作った TEWorker クラスのヘッダに上記のようなコードを追加してみる。
#include "TEWorker.h"
// Sets default values
ATEWorker::ATEWorker()
{
// 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;
}
// Called when the game starts or when spawned
void ATEWorker::BeginPlay()
{
Super::BeginPlay();
StartTime = FDateTime::Now();
}
FTimespan ATEWorker::GetPassedTime()
{
return StartTime - FDateTime::Now();
}
// Called every frame
void ATEWorker::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
GetPassedTime()
は BeginPlay()
からの経過時間を計算して返す。
BWorker
という Blueprint クラスを、TEWorker
クラスを親として作成して、レベル内に配置してから、上のコードを書いてやると、GetPassedTime
ノードで経過時刻を計算して表示できる。
当然だけど、BWorker
をレベル内に配置しないと、Tick
が呼び出されなくて実行されない。
このくらいで思い出せるでしょう(多分)。