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で確認しています。

このエントリーをはてなブックマークに追加