LoginSignup
0
0

More than 3 years have passed since last update.

Unreal Engine 4.26 の時刻、日付回りのメモ (C++/Blueprint)

Last updated at Posted at 2021-01-26

時刻回りの忘備録です。

日付と時刻 (Blueprint)

Blueprint では DateTime という構造体で日付を管理できる。

image.png

Now ノードで現在時刻を取得でき、AsDateTime で文字列に変換できる。AsDateTime はローカルタイムでの表示になるけど、UTC表示にする AsDateTime(From UTC) という関数もある。

image.png

DateTime 構造体を Break すれば、ミリ秒の値まで取れる。精度がどのくらいあるかはわからない。

image.png

レベルブループリントに書いて実行すると上のような感じで時刻を表示できる。

image.png

今日の日付を返す Today(時刻は 0:00 になる)、曜日を返す GetDay もある。GetDay の返り値は整数で、0が月曜、1が火曜・・・という感じになる。

時刻間の大小比較(>とか<=とか)もできる。

時間 (Blueprint)

時刻と時刻の差(時間)は、Timespan 構造体で管理する。DateTime 間の和や差は Timespan 型になる。

image.png

上のようなイベントグラフで、BeginPlay からの経過時間を表示できる。

image.png

Timespan 構造体もミリ秒まで情報を持っているので、一応ミリ秒単位での計算はできる。精度はよくわからない。さらに GetMicroseconds というノードがあって、マイクロ秒の値が取得できるぽい。精度はそれこそ全くわからないけど・・・

DateTimeTimespan を加えたり、引いたりすると DateTime 型になる。

image.png

上のグラフでは現在時刻に1秒加えて、その結果を表示している。

日付と時刻 (C++)

FDateTime 構造体と FTimespan 構造体として、Blueprint とほぼ同様に扱える。

TEWorker.h
#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 クラスのヘッダに上記のようなコードを追加してみる。

TEWorker.cpp
#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() からの経過時間を計算して返す。

image.png

BWorker という Blueprint クラスを、TEWorker クラスを親として作成して、レベル内に配置してから、上のコードを書いてやると、GetPassedTime ノードで経過時刻を計算して表示できる。

image.png

当然だけど、BWorker をレベル内に配置しないと、Tick が呼び出されなくて実行されない。

このくらいで思い出せるでしょう(多分)。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0