Ein Beispiel der C++-Zeitleiste dient zum Aufbau einer klassischen, berührungslosen Türöffnung.
Erstellen des Tür-Actors
Erstellen Sie das neue C++-Projekt basierend auf der Vorlage Leer mit aktiviertem Starter-Inhalt, benennen Sie es TimelineDoorActor.
Navigieren Sie zum Inhaltsbrowser, klicken Sie auf C++-Klassen und klicken Sie dann auf Hinzufügen (+) und wählen Sie Neue C++-Klasse.
Wählen Sie Actor als eine übergeordnete Klasse.
Benennen Sie den erstellten Actor DoorActor.
Wenn ein neuer Actor erstellt wird, öffnet Visual Studio automatisch
DoorActor.hUndDoorActor.cpp-Dateien. Navigieren Sie zumDoorActor.hDatei und erklären Sie Folgendes:DoorActor.h
C++#include "Components/TimelineComponent.h"Als nächstes in der
DoorActor-Klassendefinition, fügen Sie den folgenden Code hinzu: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)Navigieren Sie zum
DoorActor.cpp. Sie müssen die folgende Klassenbibliothek einbinden, um Ihre Box-Komponente zu nutzen.DoorActor.cpp
C++#include "Components/BoxComponent.h"Im Konstruktor Ihrer
ADoorActor::ADoorActorerklären Sie Folgendes: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"));Notiz: Wir behalten die relative Transformation der Tür als Anhangsregel bei, um sie später mit einer benutzerdefinierten Methode für unseren Tür-Actor zu bearbeiten. Weitere Dokumentation finden Sie unter FAttachmentTransformRules.
Kompilieren Sie Ihren Code.
Einrichten des statischen Türnetzes
Sie müssen die Statisches Mesh-Assets einrichten, die Ihre DoorFrame- und Door Static Mesh-Komponenten visuell darstellen.
Vom Inhaltsbrowser, navigieren Sie zu Ihrem C++-Klassenordner.
Klicken Sie mit der rechten Maustaste auf die DoorActor-Klasse, wählen Sie Erstellen einer Blueprint-Klasse basierend auf DoorActor.
Benennen Sie Ihren Blueprint-Actor Bp_DoorActor und legen Sie es im entsprechenden Ordner ab.
Vom Tab Komponenten wählen Sie die Komponente des statischen Meshs DoorFrame.
Navigieren Sie zum Details-Panel und ändern Sie das Statische Mesh zu SM_DoorFrame.
Navigieren Sie zum Tab Komponenten, wählen Sie die Komponente DoorMesh.
Vom Details-Panel ändern Sie das statische Mesh zu SM_Door.
Navigieren Sie dann zur Kategorie Verwandeln und ändern Sie den Wert Y-Standort auf 45,0.
Klicken Sie die Schaltflächen Kompilieren und Speichern.
Erstellen von UCurveFloat- und Timeline-Event-Tracks
Die Timeline-Komponente erfordert eine Timeline Curve. Jede Kurve kann mehrere Schlüssel enthalten, die eine Zeit und einen Wert definieren. Kurven interpolieren diese Schlüssel, um den Wert an jedem Punkt während der Zeitleiste zu berechnen.
Für dieses Beispiel verwenden wir eine UCurveFloat.
Navigieren Sie zur
ADoorActor-Klassendefinition inDoorActor.hund deklarieren Sie die folgenden Variablen: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 graphNavigieren Sie zu
DoorActor.cppund implementieren dieUpdateTimelineComp-Methode: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); }Dann, in der
BeginPlay-Methode den folgenden Code hinzufügen: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); }Kompilieren Sie Ihren Code.
In Arbeit befindlicher Code
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;
Erstellen und Binden von Kollisionsüberlappungsevents
Die Box-Komponente muss reagieren können, wenn ein Actor ihre Kollisionsgrenzen betritt oder verlässt.
Navigieren Sie zur Klassendefinition Ihres
DoorActor.hDatei und erklären Sie Folgendes: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);Navigieren Sie anschließend zu Ihrer Datei
DoorActor.cppzur Implementierung Ihrer KlassenmethodenOnOverlapBeginundAmÜberlappungsende: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(); }Binden Sie Ihre Überlappungsfunktionen in die
Spielbeginn-Methode wie folgt: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) {Kompilieren Sie Ihren Code.
Erstellen eines Kurven-Assets im Unreal Editor
Sie müssen ein Kurven-Asset im Unreal Editor erstellen, um es Ihrem Zeitleiste-Actor-Blueprint zuzuweisen.
Navigieren Sie zum Inhaltsbrowser, wählen Sie Hinzufügen (+) > Verschiedenes > Kurve.
Wählen Sie CurveFloat und benennen Sie das Asset DoorCurveFloat.
Doppelklick en Sie den erstellten DoorCurveFloat zum Öffnen des Zeitleisten-Editor.
Fügen Sie der Float-Kurve zwei Schlüssel hinzu, indem Sie mit der rechten Maustaste auf das Diagramm klicken und wählen Sie dann Schlüssel hinzufügen. Passen Sie den Zeitwert des ersten Schlüssels an (0, 0) an. Passen Sie den Zeitwert der zweiten Taste an (4, 90) an.
Weitere Informationen zum Bearbeiten von Zeitleiste-Kurven, siehe Keys and Curves.
Drücken Sie Shift und klicken Sie, um beide Schlüssel auszuwählen, klicken Sie mit der rechten Maustaste auf Diagramm und stellen Sie sie auf Auto-Interpolation.
Ihre Kurve sollte jetzt wie folgt aussehen. Speichern Sie Ihre DoorCuveFloat und schließen sie den Zeitleisten-Editor.
Öffnen Sie den Bp_DoorActor und wählen Sie Bp_DoorActor aus dem Tab Komponenten.
Navigieren Sie zum Details-Panel und wählen Sie DoorCurveFloat aus dem Dropdown-Menü Tür-Zeitachsen-Gleitkurve des Abschnitts Türaktion.
Navigieren Sie zum Inhaltsbrowser und platzieren Sie die Bp_DoorActor in die Ebene.
Kompilieren und speichern, dann PIE drücken.
Durch den Input mit WASD können Sie Ihren Zuschauer-Bauer steuern. Wenn Sie zu den Kollisionsgrenzen Ihres DoorActor navigieren, können Sie die Wiedergabe der Zeitleiste beobachten, und wenn Sie die Grenzen verlassen, können Sie die Rückwärtswiedergabe beobachten.
Vollständiger Code
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;