chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

Unreal Engine5のC++ Tutorialをやってみる

Unreal Engineの動きの定義は使いやすいBluePrintが主流と思われるが、C++で実装したいので、tutorialをやってみた。tutorialのままなのだが、作った画面は以下

実際の画面では、机の上のキューブが上下に動きながら、回転します。
ソースコードは以下
file: FloatingActor.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FloatingActor.generated.h"

UCLASS()
class TEST_CS02_API AFloatingActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AFloatingActor();
    UPROPERTY(VisibleAnywhere)
    UStaticMeshComponent* VisualMesh;

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};

file: FloatingActor.cpp

#include "FloatingActor.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;

    
    VisualMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
    VisualMesh -> SetupAttachment(RootComponent);
    
    static ConstructorHelpers::FObjectFinder<UStaticMesh> CubeVisualAsset(TEXT("/Game/StarterContent/Shapes/Shape_Cube.Shape_Cube"));
    if(CubeVisualAsset.Succeeded())
    {
        VisualMesh->SetStaticMesh(CubeVisualAsset.Object);
        VisualMesh->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
    }
}

// Called when the game starts or when spawned
void AFloatingActor::BeginPlay()
{
	Super::BeginPlay();
}

// Called every frame
void AFloatingActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

    FVector NewLocation = GetActorLocation();
    FRotator NewRotation = GetActorRotation();
    float RunningTime = GetGameTimeSinceCreation();
    float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime));
    
    NewLocation.Z += DeltaHeight* 40.0f;
    float DeltaRotation = DeltaTime * 80.0f;
    NewRotation.Yaw += DeltaRotation;
    SetActorLocationAndRotation(NewLocation, NewRotation);
}

■ご参考URL
docs.unrealengine.com

■今後の課題
Cubeを次々に発生させたい。そして後方に飛んでいかせたい。アクタを生成するのはSpawnActor関数らしい。これをタイマを使って連続的に発生させると、Cubeが生成されて流れていくように作れるはずなのだが

C++からSPAWNさせる方法(どこに書いたらいいのやら)

FString path = "/Game/SomeActor.SomeActor_C";
TSubclassOf<class AActor> ClassObject = TSoftClassPtr<AActor>(FSoftObjectPath(*PathName)).LoadSynchronous(); 
if (ClassObject  != nullptr)
{
    ASomeActor* actor = (ASomeActor*)GetWorld()->SpawnActor<AActor>(ClassObject);
}

[https://papersloth.hatenablog.com/entry/2018/09/24/155634:title]

引用:
Unreal C++/Blueprint 雑多なメモ (Unreal Engine 4.26.1) - Qiita