MENU閉じる

HEXA BLOG

UE4プログラム

UE42022.9.29

UE4でさくっとキャラクターの索敵を作りたい!

こんにちは、東京PGの栗ご飯です
今回はUE4を使用してキャラクターの索敵を作る際によく使うUE4の便利な関数を紹介します!

UE4のUKismetMathLibraryを使用した関数

・2点の座標から向きを取得する
static FRotator FindLookAtRotation(const FVector& Start, const FVector& Target);
StartからTargetまでの向きをFRotatorで返します
キャラクターの向きを合わせる時に使います

・現在の角度を目標の角度に合わせて滑らかに回転させる
static FRotator RInterpTo(FRotator Current, FRotator Target, float DeltaTime, float InterpSpeed);
Currentの角度をTargetの角度に合わせていく処理になります
DeltaTimeは現在のActorなどのTickの時間を入れInterpSpeedが大きいほどTargetに近い角度を返します
InterpSpeedに0.0fを入れた場合はTargetの値をそのまま返します
FindLookAtRotationと組み合わせて使うことでキャラクターが少しずつ特定の方向を向かせる処理が実現出来ます

BPでFindLookAtRotationとRInterpToを使うとこんな感じの処理になります

・浮動小数点の差分がおおよそ等しいかを判定する
static bool NearlyEqual_FloatFloat(float A, float B, float ErrorTolerance = 1.e-6f);
整数同士の判定ならイコールを使うだけでいいのですがfloat(浮動小数点)を使う場合にイコールを使うと正しく判定出来ません
その際にNearlyEqualを使って判定します

・最小値と最大値を指定して値を範囲内に収めた値で返します
static float FClamp(float Value, float Min, float Max);
Valueの値がMin以上Max以下になるように値を返します
必ず指定した範囲内に収めたい場合などに使います

・最小値と最大値を指定して値を割合で返します
static float NormalizeToRange(float Value, float RangeMin, float RangeMax);
Valueの値がRangeMinとRangeMaxの値の割合になるかを返します
Value = 20.0f RangeMin = 0.0f RangeMax = 100.0fの場合だと0.2fを返します
Valueの値をRangeMin以上RangeMax以下にした場合は0.0~1.0fを返しますがRangeMinとRangeMaxの範囲外にした場合はその限りではありません
事前にFClampを使用すると例外を除外出来ます

・2つの値から指定した割合の値を返します
static float Lerp(float A, float B, float Alpha);
NormalizeToRangeと反対の処理になります
AとBの値からAlphaの割合で指定した値を返します
A = 0.0f B = 100.0f Alpha = 0.2fの場合だと20.0fを返します
Alphaは0.0fから1.0fの値を入力することでAからBの値を取得出来ます
VLerpやRLerpといったFVectorやFRotatorで判定する処理もあります

UKismetSystemLibraryを使用した関数

・指定方向の指定されたコリジョンを検索する
static bool LineTraceSingle(const UObject* WorldContextObject, const FVector Start, const FVector End, ETraceTypeQuery TraceChannel, bool bTraceComplex, const TArray<AActor*>& ActorsToIgnore, EDrawDebugTrace::Type DrawDebugType, FHitResult& OutHit, bool bIgnoreSelf, FLinearColor TraceColor = FLinearColor::Red, FLinearColor TraceHitColor = FLinearColor::Green, float DrawTime = 5.0f);
WorldContextObjectにGetWorld()を指定しStartからEndまでの距離でTraceChannelのコリジョンを検索する
bTraceComplexはtrueなら複雑なコリジョンで判定しfalseなら簡易コリジョンで判定する
ActorsToIgnoreは除外するものを指定
DrawDebugTypeはデバッグで画面に判定を描画
OutHitはリザルトが格納されるので対象の情報が取得出来る
bIgnoreSelfがtrueなら自身も除外する
複数の検索をしたい場合はLineTraceMultiを使用したり線ではなく球体でチェックしたい場合はSphereTraceSingleを使用する
壁やキャラをチェックする際に使用します
複雑になるほど処理負荷は上がるので注意が必要になります

BPの場合LineTraceSingleがないため別の関数を使用します

便利な判定方法

・指定した角度内にtargetがいるか判定
FVector vector = GetActorLocation() – target->GetActorLocation();
float dir = FMath::Acos(GetActorForwardVector().CosineAngle2D(vector.GetSafeNormal()));
float degrees = UKismetMathLibrary::RadiansToDegrees(dir);
if( degrees <= 90.0f ){
}
targetが正面方向(GetActorForwardVector())から90度以内にいるかを判定
正面方向との角度差分を判定しているので90度は正面の左右をそれぞれ90度見ているので半円をチェックしていることになります
ForwardVector以外に向きを指定することで任意の向きを指定することも可能です

・targetまでの距離を取得
FVector vector = GetActorLocation() – target->GetActorLocation();
float dist = vector.Size();
ターゲットまでの距離を判定することが出来ます
上記の処理と組み合わせることで距離と角度をチェックできます

UE4を触りたての方はこちらを参考にして自分だけのキャラクターの索敵処理を作ってみて下さい!

 

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE