【UE】アクタを回転させキャラクターと重なったら消滅!【C++】
以前にアクタを上下に浮遊させたり、円運動させたりしたので今回はそれの一つ上のステップ?と言っていいのかは分からないですが、アクタを上下運動させつつさらに回転させて、プレイヤーキャラクターがアクタに重なった時にはアクタをゲーム内から削除する!という処理を組んでいきたいと思います。
まずは新規でC++のアクタを作成します。VisualStudioが立ち上がったらコードを書いていきます。
※画像には後半のコードが見え隠れするかと思いますが、気にせず赤枠部分から随時作成していきましょう!
まずは上下運動部分から行っていきます。
デフォルトで存在するpublicの中にまずは変数を作成します。

public:
// Called every frame
virtual void Tick(float DeltaTime) override;
FVector StartLocation;
UPROPERTY(EditAnywhere, Category = "Move")
float MoveSpeed = 5.f;
UPROPERTY(EditAnywhere, Category = "Move")
float Amplitude = 25.f;
UPROPERTY(EditAnywhere, Category = "Move")
float RotationSpeed = 100.f;
変数の作成ができたらソースファイルに移動してアクタがゲーム開始時にスポーンした場所を覚えておけるよう変数にスポーン時の場所を格納しておきます。
StartLocation = GetActorLocation();

続いてソースファイル内のTickの部分に上下運動と回転運動ができるようコードを書いていきましょう!

コードをまとめて申し訳ないですが、Tick内に下記を記述する。
void AItemActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
float Time = GetWorld()->GetTimeSeconds();
float Offset = FMath::Sin(Time * MoveSpeed) * Amplitude;
FVector NewLocation = StartLocation;
NewLocation.Z += Offset;
SetActorLocation(NewLocation);
FRotator Rotation = GetActorRotation();
Rotation.Yaw += RotationSpeed * DeltaTime;
SetActorRotation(Rotation);
}
ここまででアクタの運動関係については処理の記述ができているのですが、ルートや見た目などの設定を現状持っていないので、コンポーネントを追加できるようにコードを記述していきます。
まずはヘッダーファイルに戻って、#includeとUCLASSの間でクラスを作成しておきます。
class UBoxComponent;

次に少し下側に移動して、各種コンポーネントをBPで扱えるようコードを書いていきます。今回protectedとしてますがpublicでも問題ないはずです。たぶん。

ソースファイルに移動して、コンポーネントを追加できるようにしていきます。
まずあたり判定用のBoxComponentは初期値だけでは、使用することができないため、インクルードして利用できるようにします。そのために前段でBoxComponentについてはクラスで記述してます。
#include “Components/BoxComponent.h”

続いて追加するコンポーネントの種類や階層を設定していきます。
今回は、メッシュとあたり判定があればいいかなと思ったので必要最低限になっています。

Root = CreateDefaultSubobject(TEXT("Root"));
RootComponent = Root;
BoxCollision = CreateDefaultSubobject(TEXT("Collision"));
BoxCollision->SetupAttachment(Root);
Mesh = CreateDefaultSubobject(TEXT("MeshComponent"));
Mesh->SetupAttachment(BoxCollision);
おっけー!
ここまで作成ができたらあと少しで完成だ!!!
ヘッダーファイルに戻り関数処理を書きます。

UFUNCTION()
void OnOverlapBegin(
UPrimitiveComponent* OverlappedComponent,
AActor* OhterActor,
UPrimitiveComponent* OtherComp,
int32 OtherBodyIndex,
bool bFromSweep,
const FHitResult& SweepResult
);
そうしたら、ヘッダーファイルからソースファイルに移動して同じようなコードを書いた後に処理内容を記述していきます。
あと少し!

BoxCollision->OnComponentBeginOverlap.AddDynamic(this, &AItemActor::OnOverlapBegin);

void AItemActor::OnOverlapBegin(
UPrimitiveComponent* OverlappedComponent,
AActor* OtherActor,
UPrimitiveComponent* OtherComp,
int32 OtherBodyIndex,
bool bFromSweep,
const FHitResult& SweepResult
)
{
AMyProject2Character* Player = Cast(OtherActor);
if (Player)
{
Destroy();
}
}
ここまで作成できたらあとはC++アクタを右クリックしてBPを作成。Componentを設定してゲーム内に配置して終わりです。
本日もお疲れさまでした!
◆YouTubeチャンネルもやってます
