【UnrealEngine】浮遊するアクタ作成時のC++コード解説【C++】
前回ゲーム内で浮遊するアクタを作成したのですが、そのときに使用したコードの処理などをまとめていなかったので、各種コードについて処理内容などをまとめていきたいと思います。
◆まずはヘッダーファイルから!
.h
// ===========================
// ▼ここから
// ===========================
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MoveClass.generated.h"
UCLASS()
class MYPROJECT2_API AMoveClass : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMoveClass();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
protected:
FVector StartLocation;
UPROPERTY(EditAnywhere, Category="Floating")
float Amplitude = 50.0f;
UPROPERTY(EditAnywhere, Category="Floating")
float Speed = 2.0f;
};
// ===========================
// ▲ここまで
// ===========================
◆protected
ここに記述した内容は自身もしくは子クラスからアクセスすることはできるが、外部からのアクセスはできない。
変数は基本的にここに書くよ!
◆FVector StartLocation
これは「アクタの初期位置を保存する変数」です。
型
FVector = 3D座標(X,Y,Z)
・なぜ必要になる?
アクタを移動させると、どんどん座標が変化していく。元の位置を所持していないと元に戻れなくなってしまうため、基準点として所持しておく必要あり。
◆UPROPERTY(EditAnywhere, Category=”Floationg”)
・UPROPERTY(…)
型 変数名;
役割:UnrealEngineにこの変数の存在を教えるためのマクロ
UPROPERTYがないとどうなる?
- エディタに表示されない
- ブループリントから触ることができない
- セーブされない可能性あり
- GC(ガベージコレクション)対象外
UPROPERTYがあると?
- エディタに表示できる
- ブループリントからアクセス可能
- 保存される(シリアライズされる)
- GC対象となる
・UPROPERTY(EditAnywhere)
型 変数名;
「どこでも編集できる」フラグ
どこでもってどこなの?
| 場所 | 編集できる? |
| BPクラス | 可 |
| レベルに置いたインスタンス | 可 |
| デフォルト値 | 可 |
他のエディット系も存在するため、比較として記載しますがコードとしての利用はしていません。
・EditDefaultsOnly(固定値を作り値を変更させたくないときに使用)
➥ブループリントのデフォルトだけ変更可能
➥インスタンスは変更不可
・EditInstanceOnly(配置ごとに変えたいときに使用)
➥レベルに置いた個体だけ変更可能
➥ブループリントでは変更不可
・UPROPERTY(EditAnywhere, Category=”Floating”)
エディタの整理用フォルダを作成することができる。作成したC++アクタをブループリント化して詳細タブを開くとFloatingというカテゴリが作成され、そこに変数の項目が整理されている。
ここの値を変更することで振れ幅やスピードの調整を行うことができる。

3つをまとめると
UPROPERTY:エンジンに登録
EditAnywhere:編集可能にする
Category:見た目の整理
といった感じになる。
◆float Amplitude = 50.0f;
振れ幅を調整する用の変数。
どれくらい上下させるかをfloat値で調整するので、振れ幅を小さくしたい場合は値を小さくし、大きくしたい場合は値も大きくする。
◆float Speed = 2.0f
アクタが動く速さ(周期)を調整する用の変数
1→ゆっくり
5→速い
◆続いてはソースファイルだ!
目的:Sin波で上下にアクタを動かす
↓
② Tickで毎フレーム処理
↓
③ 時間を取得
↓
④ Sin波で上下量を計算
↓
⑤ 元の位置に加算
↓
⑥ アクタを移動
.cpp
// ===========================
// ▼ここから
// ===========================
// Fill out your copyright notice in the Description page of Project Settings.
#include "MoveClass.h"
// Sets default values
AMoveClass::AMoveClass()
{
// 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;
}
// Called when the game starts or when spawned
void AMoveClass::BeginPlay()
{
Super::BeginPlay();
StartLocation = GetActorLocation();
}
// Called every frame
void AMoveClass::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
float Time = GetWorld()->GetTimeSeconds();
float OffsetZ = FMath::Sin(Time * Speed) * Amplitude;
FVector NewLocation = StartLocation;
NewLocation.Z += OffsetZ;
SetActorLocation(NewLocation);
}
// ===========================
// ▲ここまで
// ===========================
◆StartLocation =GetActorLocation();
ヘッダーファイルで作成したFVector変数に初期位置を保存するためのコード。
GetActorLocation
➥現在のワールド座標を取得するコード
◆float Time = GetWorld()->GetTimeSeconds();
ゲーム開始からの経過時間(秒数)を取得
値はずっと増え続ける。
Sinと組み合わせると周期運動になる。
◆float OffsetZ = FMath::Sin(Time * Speed) * Amplitude;
Time * Speed
➥動く速さを調整
Sin(…)
➥-1~1の値を出す
Amplitude
➥振れ幅を決める
・最終出力イメージ
「-Amplitude ~ +Amplitude」の範囲で上下する
◆FVector NewLocation = StartLocation;
NewLocation.Z += OffsetZ;
何をしている?
➥元の位置に「上下分だけ足す」
なぜ新しく変数を作成したのか?
➥StartLocation変数を直接いじらないようにするため。
初期位置の変数に値を直接入れてしまうとどんどんずれていってしまうため、新しく変数を作成するほうがいいよ!
◆SetActorLocation(NewLocation);
アクタをその位置に移動させる。毎フレーム呼ぶことでアニメーションになる。
◆YouTube
ゆうtuber・ゆうくん – YouTube
