Blueprintとc++で角度を考慮してLaunch Characterする方法
移動対象のオブジェクトの発射する角度を考慮して、lanuch関数を呼び出してプレイヤーオブジェクトを移動させてみたいと思います。
サンプル例は以下のようになります。
この例ではドカンの角度を考慮して、キャラクタの発射角度を決めています。
このキャラクタBlueprintクラスで作成しており、親クラスにPaperCharacterを継承しています。
このBlueprintクラスの構成は以下のようになっています。
また、このゲーム内ではPaper2Dを使用しているので、平面で換算するとZ軸がY軸でX軸はX軸のままになっており、
奥行きを表すZ軸がY軸に変わっています。
キャラクタの角度を考慮して移動させる
キャラクタの回転を考慮して発射させるためには、
ドカンはY軸を基準として回転(pitch回転)させているので、ドカン(アクターを親に持つ)のオブジェクトのpicthを取得して、
三角関数により、移動ベクトルを決め、launch関数に渡してあげます。
ドカンを回転させている方法はBlueprintで回転し続けるオブジェクトを作成する方法を参照してください。
対象のActor角度を取得する
対象の角度を取得するためには、GetActorRotation関数を使用します。
キャラクタのBlueprintクラスには入っているドカンの角度Rotate構造体を格納する変数DocanAngleが宣言されているので、
DocanAngleに代入します。
発射すべき角度を取得できたので、加算するベクトルを求めてみたいと思います。
UE上の関数にそういう関数があるのかもしれませんが、わからないので以下のような関数を書き
その関数を発射ボタンを管理するUWidgetBlueprintを継承するBlueprint内で呼び出しています。
先ほど説明した通り、通常の三角関数の図でいうY軸はZ軸に変わっています。
三角関数により
x = cosθ * length
y = sinθ * length
となります。
/**
角度と長さから発射ベクトルを返す
*/
FVector UMyWidgetBlueprint::getVelocityFromAngle(FRotator rotator,float length)
{
float angle = rotator.Pitch;
float rad = FMath::DegreesToRadians(angle);
float x = cos(rad) * length;
float z = sin(rad) * length;
FVector vec = FVector(x,0,z);
return vec;
}
headerファイルは以下のようになります。
#pragma once
#include "CoreMinimal.h"
#include "WidgetBlueprint.h"
#include "MyWidgetBlueprint.generated.h"
/**
*
*/
UCLASS()
class DOCAN_API UMyWidgetBlueprint : public UWidgetBlueprint
{
GENERATED_BODY()
UFUNCTION(BlueprintCallable, Category="UMyWidgetBlueprint")
static FVector getVelocityFromAngle(FRotator rotator,float length);
};
Blueprintで角度を考慮した加算ベクトルをLanuch Character関数に渡す
加算ベクトルの取得ができたので、取得したベクトルをLanch Character関数に渡して
キャラクタを移動させます。
Blueprintは以下のようになります。
これで、発射角度を考慮してオブジェクトを移動させることができました。
UE4.19で確認しています。