C++ Timeline を使って接近すると開くドアの設定方法の例を紹介します。
Door アクタを作成する
ブランク テンプレートでスターター コンテンツを有効にして新しい C++ プロジェクトを作成して「TimelineDoorActor」と名前を付けます。
コンテンツ ブラウザで「C++ Classes」フォルダをクリックし、[+Add (+追加)] ボタンをクリックして [New C++ Class (新規 C++ クラス)] を選択します。
アクタを親クラスとして選択します。
作成したアクタに「DoorActor」という名前を付けます。
新しいアクタを作成すると、Visual Studio では自動的に「
DoorActor.h」ファイルと「DoorActor.cpp」ファイルが開かれます。DoorActor.hファイルに移動し、次のように宣言します。DoorActor.h
C++#include "Components/TimelineComponent.h"次に、
DoorActorクラスの定義に次のコードを追加します。DoorActor.h
C++protected: //MeshComponents to represent Door assets UPROPERTY(VisibleAnywhere, BlueprintReadWrite) UStaticMeshComponent* DoorFrame; UPROPERTY(VisibleAnywhere, BlueprintReadWrite) UStaticMeshComponent* Door; //TimelineComponent to animate Door meshes UPROPERTY(VisibleAnywhere, BlueprintReadWrite)「
DoorActor.cpp」に移動します。 以下のクラス ライブラリをインクルードして Box コンポーネントを使用します。DoorActor.cpp
C++#include "Components/BoxComponent.h"ADoorActor::ADoorActorのコンストラクタで、次のように宣言します。DoorActor.cpp
C++// Sets default values ADoorActor::ADoorActor() { // 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; //Create our Default Components DoorFrame = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorFrameMesh")); Door = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorMesh")); DoorTimelineComp = CreateDefaultSubobject<UTimelineComponent>(TEXT("DoorTimelineComp"));注:後で Door アクタのカスタム メソッドを使って操作するために、ドアの相対トランスフォームをアタッチメント ルールとして保持します。 詳細については、「FAttachmentTransformRules」を参照してください。
コードをコンパイルします。
Door Static Mesh を設定する
DoorFrame スタティックメッシュ コンポーネントと Door スタティックメッシュ コンポーネントを視覚的に表示するスタティックメッシュ アセットも設定する必要があります。
コンテンツ ブラウザから「C++ Classes」フォルダに移動します。
DoorActor クラスを右クリックして [Create Blueprint Class based on DoorActor (DoorActor に基づいてブループリント クラスを作成する)] を選択します。
ブループリント アクタに「Bp_DoorActor」という名前を付け、適切なフォルダ内に配置します。
[Components (コンポーネント)] タブで、DoorFrame スタティックメッシュ コンポーネントを選択します。
[Details (詳細)] パネルに移動し、スタティックメッシュを SM_DoorFrame に変更します。
[Components] タブに移動し、DoorMesh コンポーネントを選択します。
[Details] パネルでスタティックメッシュを SM_Door に変更します。
次に、[Transform (トランスフォーム)] カテゴリに移動し、Location の Y 値を 45.0 に変更します。
[Compile (コンパイル)] ボタンと、[Save (保存)] ボタンを順にクリックします。
UCurveFloat トラックと Timeline イベント トラックを作成する
Timeline Component では、Timeline Curve を必要とします。 各カーブには時間と値を定義する複数のキーを含むことができます。カーブはこれらのキーを補間して、タイムライン中の任意のポイントの値を計算します。
この例では、UCurveFloat を使用します。
DoorActor.hのADoorActorクラス定義に移動し、次の変数を宣言します。DoorActor.h
C++public: // Variable to hold the Curve asset UPROPERTY(EditAnywhere) UCurveFloat* DoorTimelineFloatCurve; private: //Float Track Signature to handle our update track event FOnTimelineFloat UpdateFunctionFloat; //Function which updates our Door's relative location with the timeline graphDoorActor.cppに移動し、UpdateTimelineCompメソッドを実装します。DoorActor.cpp
C++void ADoorActor::UpdateTimelineComp(float Output) { // Create and set our Door's new relative location based on the output from our Timeline Curve FRotator DoorNewRotation = FRotator(0.0f, Output, 0.f); Door->SetRelativeRotation(DoorNewRotation); }次に、
BeginPlayメソッドに次のコードを追加します。DoorActor.cpp
C++//Binding our float track to our UpdateTimelineComp Function's output UpdateFunctionFloat.BindDynamic(this, &ADoorActor::UpdateTimelineComp); //If we have a float curve, bind it's graph to our update function if (DoorTimelineFloatCurve) { DoorTimelineComp->AddInterpFloat(DoorTimelineFloatCurve, UpdateFunctionFloat); }コードをコンパイルします。
作成中のコード
DoorActor.h
// Copyright 1998-2022 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Components/TimelineComponent.h"
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DoorActor.generated.h"
UCLASS()
class TIMELINEDOORACTOR_API ADoorActor : public AActor
{
DoorActor.cpp
//Copyright 1998-2022 Epic Games, Inc. All Rights Reserved.
#include "DoorActor.h"
#include "Components/BoxComponent.h"
// Sets default values
ADoorActor::ADoorActor()
{
// 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;
Collision Overlap イベントを作成してバインドする
アクタがコリジョン領域に出入りするときに Box コンポーネントが反応する機能が必要です。
「
DoorActor.h」ファイルのクラス定義に移動し、次のように宣言します。DoorActor.h
C++// Begin and End Overlap Events for our DoorProxVolume UFUNCTION() void OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); UFUNCTION() void OnOverlapEnd(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);次に、「
DoorActor.cpp」ファイルに移動し、OnOverlapBeginクラス メソッドおよびOnOverlapEndクラス メソッドを次のように実装します。DoorActor.cpp
C++void ADoorActor::OnOverlapBegin(UPrimitiveComponent * OverlappedComp, AActor * OtherActor, UPrimitiveComponent * OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult) { DoorTimelineComp->Play(); } void ADoorActor::OnOverlapEnd(UPrimitiveComponent * OverlappedComp, AActor * OtherActor, UPrimitiveComponent * OtherComp, int32 OtherBodyIndex) { DoorTimelineComp->Reverse(); }BeginPlayメソッドで次のようにオーバーラップ関数をバインドします。DoorActor.cpp
C++void ADoorActor::BeginPlay() { Super::BeginPlay(); //Binding our float track to our UpdateTimelineComp Function's output UpdateFunctionFloat.BindDynamic(this, &ADoorActor::UpdateTimelineComp); //If we have a float curve, bind it's graph to our update function if (DoorTimelineFloatCurve) {コードをコンパイルします。
Unreal Editor でカーブ アセットを作成する
Timeline Actor ブループリントに割り当てるために Unreal Editor でカーブ アセットを作成する必要があります。
コンテンツ ブラウザに移動し、[+Add (+追加)] > [Miscellaneous (その他)] > [Curve (カーブ)] を選択します。
[CurveFloat] を選択してアセットの名前を「DoorCurveFloat」にします。
作成された DoorCurveFloat をダブルクリックしてタイムライン エディタを開きます。
グラフを右クリックして [Add Key (キーを追加)] を選択し、2 つのキーを Float カーブに追加します。 1 つ目のキーの時間値を (0, 0) に調節します。 2 つ目のキーの時間値を (4, 90) に調節します。
Timeline カーブの編集に関する詳細は、「キーとカーブ」を参照してください。
Shift キーを押しながら 2 つのキーを選択し、グラフを右クリックして、それらに Auto 補間を設定します。
カーブは次のようになります。 DoorCuveFloat を保存して、タイムライン エディタを終了します。
Bp_DoorActor を開いて [Components] タブで Bp_DoorActor を選択します。
[Details] パネルに移動し、[Door Action (ドア アクション)] セクションの [Door Timeline Float Curve (ドア タイムライン フロート カーブ)] ドロップダウン メニューから DoorCurveFloat を選択します。
コンテンツ ブラウザに移動して、レベルに Bp_DoorActor を配置します。
コンパイルして保存し、PIE を押します。
WASD を使って、スペクテイター ポーンを制御することができます。 DoorActor のコリジョン境界に移動すると、タイムラインがプレイされるのが確認できます。また、境界を出ると、タイムラインが逆にプレイされるのが確認できます。
完成コード
DoorActor.h
// Copyright 1998-2022 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Components/TimelineComponent.h"
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DoorActor.generated.h"
UCLASS()
class TIMELINEDOORACTOR_API ADoorActor : public AActor
DoorActor.cpp
// Copyright 1998-2022 Epic Games, Inc. All Rights Reserved.
#include "DoorActor.h"
#include "Components/BoxComponent.h"
// Sets default values
ADoorActor::ADoorActor()
{
// 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;