虛幻4 C++實現物體的上下浮動
- 新建一個C++類,命名爲FloatingActor
- 在FloatingActor.h中聲明變量floatK和floatSpeed,具體用途看註釋:
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Components/StaticMeshComponent.h"
#include "FloatingActor.generated.h"
UCLASS()
class TPCPP_API AFloatingActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AFloatingActor();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
private:
//物體運動的時間
float runninfTime;
UStaticMeshComponent* staticMesh;
public:
UPROPERTY(EditAnywhere, Category = "Float|value")
//物體上下移動的振幅
float floatK = 20.f;
UPROPERTY(EditAnywhere, Category = "Float|value")
//物體上下浮動的速率
float floatSpeed = 1.f;
};
3. 在FloatingActor.CPP中的Tick中寫入相關代碼是物體發生位移:
// Fill out your copyright notice in the Description page of Project Settings.
#include "FloatingActor.h"
#include "Engine/StaticMesh.h"
// Sets default values
AFloatingActor::AFloatingActor()
{
// 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;
staticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
UStaticMesh* actorMesh = LoadObject<UStaticMesh>(NULL, TEXT("StaticMesh'/Game/StarterContent/Shapes/Shape_Cone.Shape_Cone'"));
staticMesh->SetStaticMesh(actorMesh);
}
// Called when the game starts or when spawned
void AFloatingActor::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AFloatingActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
//獲取物體當前的位置並賦值給newLocation
FVector newLocation = GetActorLocation();
//計算這一幀因該上升的高度
float deltaHeight = FMath::Sin(runninfTime + DeltaTime * floatSpeed) - FMath::Sin(runninfTime);
//物體的高度加上這一幀因該上升的高度
newLocation.Z += deltaHeight * floatK;
//累計時間加上幀時間
runninfTime += DeltaTime * floatSpeed;
//設置物體的位置爲新的位置
SetActorLocation(newLocation);
}