4蓝图遍历actor_【虚幻4笔记15】浮动平台
本系列為個人學(xué)習(xí)筆記,非專業(yè)教程,歡迎交流指正
一、概述
本節(jié)主要介紹浮動平臺的實現(xiàn)(可作為不同關(guān)卡之間的連接)
二、C++實現(xiàn)
1、首先定義靜態(tài)網(wǎng)格體變量
將其初始化并設(shè)為根節(jié)點
此處的靜態(tài)網(wǎng)格體使用的是初學(xué)者內(nèi)容包中的SM_AssetPlatform
2、定義StartPoint和EndPoint,用于確定浮動平臺的起點和終點(均為向量)
MakeEditWidget = “ture”可用來將EndPoint屬性顯示到GamePanel中,實現(xiàn)可視化的調(diào)節(jié)。
同時注意此處的EndPoint坐標(biāo)是相對于浮動平臺的,而非世界坐標(biāo),因此在計算時需要將EndPoint轉(zhuǎn)換為世界坐標(biāo)。
3、定義bInterping布爾型變量,來控制平臺循環(huán)移動
4、利用插值實現(xiàn)平滑的移動
5、使用TimerManager進(jìn)行定時(平臺停留一段時間后再進(jìn)行移動,方便人物跳躍)
6、.h和.cpp源碼如下
h文件如下
#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FloatingPlatform.generated.h"UCLASS()
class FIRSTPROJECT_API AFloatingPlatform : public AActor
{GENERATED_BODY()public: // Sets default values for this actor's propertiesAFloatingPlatform();// Mesh for the platformUPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Platform")UStaticMeshComponent* Mesh;UPROPERTY(EditAnywhere)FVector StartPoint;//將EndPoint顯示在編輯窗口UPROPERTY(EditAnywhere, meta = (MakeEditWidget = "true"))FVector EndPoint;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Platform")float InterpSpeed;UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Platform")float InterpTime;// 用來控制浮動平臺的往返UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Platform")FTimerHandle InterpTimer;// 判斷是否在插值bool bInterping;float Distance;protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public: // Called every framevirtual void Tick(float DeltaTime) override;void ToggleInterping();void SwapVectors(FVector& VecOne, FVector& VecTwo);};cpp文件如下
#include "FloatingPlatform.h"
#include "TimerManager.h"// Sets default values
AFloatingPlatform::AFloatingPlatform()
{// 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;Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));RootComponent = Mesh;StartPoint = FVector(0.f);EndPoint = FVector(0.f);bInterping = false;InterpSpeed = 4.f;InterpTime = 1.f;
}// Called when the game starts or when spawned
void AFloatingPlatform::BeginPlay()
{Super::BeginPlay();//將平臺起始位置賦給StartPointStartPoint = GetActorLocation();EndPoint += StartPoint;bInterping = false;GetWorldTimerManager().SetTimer(InterpTimer, this, &AFloatingPlatform::ToggleInterping, InterpTime);Distance = (EndPoint - StartPoint).Size();
}// Called every frame
void AFloatingPlatform::Tick(float DeltaTime)
{Super::Tick(DeltaTime);if(bInterping){FVector CurrentLocation = GetActorLocation();// 插值FVector Interp = FMath::VInterpTo(CurrentLocation, EndPoint, DeltaTime, InterpSpeed);SetActorLocation(Interp);float DistanceTraveled = (GetActorLocation() - StartPoint).Size();if(Distance - DistanceTraveled <= 1.f){ToggleInterping();GetWorldTimerManager().SetTimer(InterpTimer, this, &AFloatingPlatform::ToggleInterping, InterpTime);// 交換起點和終點,使其返回SwapVectors(StartPoint, EndPoint);}}}void AFloatingPlatform::ToggleInterping()
{bInterping = !bInterping;
}void AFloatingPlatform::SwapVectors(FVector& VecOne, FVector& VecTwo)
{FVector Temp = VecOne;VecOne = VecTwo;VecTwo = Temp;
}三、藍(lán)圖實現(xiàn)(配置碰撞)
升降臺的碰撞類型選擇10DOP-Z Simplified Collision(Z軸對齊,相較于X和Y軸對齊更逼近升降臺的外形)
碰撞盒子如下
總結(jié)
以上是生活随笔為你收集整理的4蓝图遍历actor_【虚幻4笔记15】浮动平台的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开花蒲公英怎么做好吃啊?
- 下一篇: lstm timestep一般是多少_请