1.タイマーを使用したアクタの作成

一定速度でコードを実行するタイマーを開始/停止する

Windows
MacOS
Linux
このページ中

アンリアルエンジン 4 (UE4) にまだ慣れていない場合は、最初に プログラマ向けクイックスタート tutorial をお読みください。このチュートリアルでは、プロジェクトの作成とプロジェクトに C++ コードを追加できることを前提にしています。

  1. まず「HowTo_VTE」という名前のスターターコンテンツを使用して、新規で Basic Code (基本コード) プロジェクトを作成し、 Actor クラスを追加します。このチュートリアルでは「Countdown」と名前を付けます。

    ChooseParentClass.png

    NameYourActor.png

  2. ゲームに表示するシンプルなカウントダウンタイマーの作成から始めます。「Countdown.h」ファイルで、クラス定義の最後に以下の行を追加します。

    int32 CountdownTime;
    
    UTextRenderComponent* CountdownText;
    
    void UpdateTimerDisplay();
  3. Countdown.cpp に、レンダリング可能なテキスト**Component を作成して、カウントダウン時間を 3 秒に初期化します。このタイプの アクタ には必要ないため、Ticking をオフにすることもできます。ACountdown::ACountdown** は、以下のようになります。

    PrimaryActorTick.bCanEverTick = false;
    
    CountdownText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("CountdownNumber"));
    CountdownText->SetHorizontalAlignment(EHTA_Center);
    CountdownText->SetWorldSize(150.0f);
    RootComponent = CountdownText;
    
    CountdownTime = 3;
  4. ACountdown::UpdateTimerDisplay はテキスト表示を更新して、残り時間、または時間切れの場合はゼロを表示します。ゲームに ACountdown を初めてスポーンした時にこのコードを実行して、CountdownTime 変数がゼロになるまで 1 秒に一回コードを実行します。

    void ACountdown::UpdateTimerDisplay()
    {
        CountdownText->SetText(FString::FromInt(FMath::Max(CountdownTime, 0)));
    }
  5. 関数の実行に Timer を割り当てると、必ず Timer Handle が与えられます。カウントダウン終了時に Timer をシャットダウンできるようにこのハンドルをしっかりと維持します。時間をカウントダウンする関数と、この関数をコントロールするために必要な Timer Handle を Countdown.h のクラス定義に追加しましょう。この作業を行うついでに、カウントダウン終了時に何か特別なことを行う関数も追加しましょう。

    void AdvanceTimer();
    
    void CountdownHasFinished();
    
    FTimerHandle CountdownTimerHandle;

    Countdown.cpp ファイルに ACountdown::AdvanceTimerACountdown::CountdownHasFinished のボディを記述することもできます:

    void ACountdown::AdvanceTimer()
    {
        --CountdownTime;
        UpdateTimerDisplay();
        if (CountdownTime < 1)
        {
            //カウントダウンを終了したのでタイマーの実行を停止します。
            GetWorldTimerManager().ClearTimer(CountdownTimerHandle);
            CountdownHasFinished();
        }
    }
    
    void ACountdown::CountdownHasFinished()
    {
        //特別な読み出しに変更
        CountdownText->SetText(TEXT("GO!"));
    }
  6. 新しく更新した関数の呼び出しを追加して、 ACountdown::BeginPlay のテキスト表示を初期化します。そして 1 秒に一回カウントダウンを進め、更新を行うタイマーを設定します。

    UpdateTimerDisplay();
    GetWorldTimerManager().SetTimer(CountdownTimerHandle, this, &ACountdown::AdvanceTimer, 1.0f, true);

    ACountdown::ACountdown ではなく、ACountdown::BeginPlay の表示を更新しています。Unreal Editor で変数に設定されている値は、コンストラクタの後で、BeginPlay の前に割り当てられるからです。後でエディタへ CountdownTime を公開する時にこれらの値に従います。

  7. アンリアルエディタ へ移動して Compile (コンパイル) を押して、これまでの作業進捗を確認しましょう。

    CompileFromEditor.png

    更新した ACountdown クラスを、コンテンツブラウザ から レベル エディタ へドラッグできます。

    ClassInContentBrowser.png

    LevelEditorText.png

    カウントダウン テキストは ACountdown::ACountdown ではなく ACountdown::BeginPlay 中に設定するため、デフォルトの "Text" が レベルエディタ に表示されます。

    Play (再生) を押すと、予定通りカウントダウンが始まって、 "3"、 "2"、 "1"、 最後に "GO!" となります。

この時点で、タイマーを使用するシンプルなクラスを作成済みです。プログラミングをしないユーザーは、カウントダウン時間を設定したり、カウントダウン終了時の挙動を変更するとさらに活用できます。次にこうした機能をエディタに公開します。

作業中のコード

Countdown.h

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "GameFramework/Actor.h"
#include "Countdown.generated.h"

UCLASS()
class HOWTO_VTE_API ACountdown : public AActor
{
    GENERATED_BODY()
public:

    // Sets default values for this actor's properties (このアクタのプロパティのデフォルト値を設定)
    ACountdown();

protected:
    // Called when the game starts or when spawned (ゲーム開始時またはスポーン時に呼び出されます)
    virtual void BeginPlay() override;
public:

    // Called every frame (フレーム毎に呼び出されます)
    virtual void Tick( float DeltaSeconds ) override;

    // カウントダウンの実行時間 (秒)
    int32 CountdownTime;

    UTextRenderComponent* CountdownText;

    void UpdateTimerDisplay();

    void AdvanceTimer();

    void CountdownHasFinished();

    FTimerHandle CountdownTimerHandle;
};

Countdown.cpp

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#include "HowTo_VTE.h"
#include "Countdown.h"

// Sets default values (デフォルト値を設定) 
ACountdown::ACountdown()
{
    // Set this actor to call Tick() every frame. (フレーム毎に Tick() を呼び出すようにこのアクタを設定) You can turn this off to improve performance if you don't need it. (必要がなければパフォーマンスを向上させるためにオフにすることができます) 
    PrimaryActorTick.bCanEverTick = false;
CountdownText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("CountdownNumber"));

    CountdownText->SetHorizontalAlignment(EHTA_Center);
    CountdownText->SetWorldSize(150.0f);
    RootComponent = CountdownText;

    CountdownTime = 3;
}

// Called when the game starts or when spawned (ゲーム開始時またはスポーン時に呼び出されます)
void ACountdown::BeginPlay()
{
    Super::BeginPlay();
UpdateTimerDisplay();

    GetWorldTimerManager().SetTimer(CountdownTimerHandle, this, &ACountdown::AdvanceTimer, 1.0f, true);
}

// Called every frame (フレーム毎に呼び出されます)
void ACountdown::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );

}

void ACountdown::UpdateTimerDisplay()
{
    CountdownText->SetText(FString::FromInt(FMath::Max(CountdownTime, 0)));
}

void ACountdown::AdvanceTimer()
{
    --CountdownTime;
    UpdateTimerDisplay();
    if (CountdownTime < 1)
    {
        //カウントダウンを終了したのでタイマーの実行を停止します。
        GetWorldTimerManager().ClearTimer(CountdownTimerHandle);
        //タイマー終了時に任意の特別なアクションを実行。
        CountdownHasFinished();
    }
}

void ACountdown::CountdownHasFinished()
{
    //特別な読み出しに変更
    CountdownText->SetText(TEXT("GO!"));
}

新しい Unreal Engine 4 ドキュメントサイトへようこそ!

あなたの声を私たちに伝えるフィードバックシステムを含め、様々な新機能について開発をおこなっています。まだ広く使える状態にはなっていないので、準備ができるまでは、ドキュメントフィードバックフォーラムで、このページについて、もしくは遭遇した問題について教えていただけると助かります。

新しいシステムが稼働した際にお知らせします。

フィードバックを送信