Open13

UE5 & UE4 Tips / 覚書

あじおじああじおじあ

[C++] コリジョンチャンネルをTraceTypeに変換する

// ECC_WorldDynamicをTraceTypeに変換
UEngineTypes::ConvertToTraceType(ECC_WorldDynamic)
あじおじああじおじあ

[C++] ComponentをSweepテストを行う

PrimitiveComponentの形状を使用してSweepテストを行うことができる

FComponentQueryParams Params(SCENE_QUERY_STAT(ComponentSweep), nullptr);
GetWorld()->ComponentSweepMulti(Result, Comp, StartLoc, EndLoc, Quat, Params);
あじおじああじおじあ

[C++] ワイドディスプレイ対応

UnrealEngineは標準で横のFOVを固定して計算されるため、カメラの設定のアスペクト比より横長の解像度にすると上下が切り取られてしまう。
16:9より縦に長いディスプレイを使用するゲーマーは少ないがウルトラワイドを使用するゲーマーは増えつつあるので対応したほうが良いかも

// PlayerControllerのBeginPlayあたりで登録
FViewport::ViewportResizedEvent.AddUObject(this, &ThisClass::ChangeViewportSize);
if (IsValid(LocalPlayer->ViewportClient))
{
    ChangeViewportSize(LocalPlayer->ViewportClient->Viewport, 0);
}


// ChangeViewportSize関数
if (Viewport->GetClient() != LocalPlayer->ViewportClient)
{
    return;
}

// 現在のAspectRatio取得
const float AspectRatio = Viewport->GetDesiredAspectRatio();

// 基本アスペクトより横長の場合
// 例えば16:9のゲームなら AspectRatio > 16/9
if (AspectRatio > [想定X / 想定Y])
{
    LocalPlayer->AspectRatioAxisConstraint = AspectRatio_MaintainYFOV;
}
// 基本アスペクトより縦長の場合
else
{
    LocalPlayer->AspectRatioAxisConstraint = AspectRatio_MaintainXFOV;
}


あじおじああじおじあ

[Graphic] TAAをきれいにする

TSRを使わずに、第4世代TAAで軽さと綺麗さを両立したい場合のパラメーター一例

DefaultEngine.ini に追記

[ConsoleVariables]
r.TemporalAA.Algorithm=0
r.TemporalAACurrentFrameWeight=0.2
r.TemporalAASamples=4
r.Tonemapper.Sharpen=0.8
あじおじああじおじあ

[C++] EnumをString化する

主にデバッグ用途などで表示するとき用


// Enum名は含めない : Override Root Scale
StaticEnum<ESpawnActorScaleMethod>()->GetDisplayValueAsText(ESpawnActorScaleMethod::OverrideRootScale);

// Enum名を含める : ESpawnActorScaleMethod::OverrideRootScale
StaticEnum<ESpawnActorScaleMethod>()->GetValueAsString(ESpawnActorScaleMethod::OverrideRootScale);
あじおじああじおじあ

[C++/BP] Tickの順番・優先順位を指定する

そのActor、Componentの前に走らせるTickのActorやComponentを指定する形

AActor::AddTickPrerequisiteActor(AActor*)
AActor::AddTickPrerequisiteComponent(UActorComponent*)

UActorComponent::AddTickPrerequisiteActor(AActor*)
UActorComponent::AddTickPrerequisiteComponent(UActorComponent*)
あじおじああじおじあ

[C++] 非同期アセットロード

// 読み込み後に実行されるラムダ式
auto LoadedFunc = FStreamableDelegate::CreateWeakLambda(GetWorld(),[](){});

// 非同期読み込みリクエストを送る
UAssetManager::GetStreamableManager().RequestAsyncLoad([SoftObjectPath], LoadedFunc);
あじおじああじおじあ

[Profile] SessionFrontendを使用してプロファイリングする

  • エディタ上なら何もしなくてもつながる
  • 実行ファイルなら -messaging 引数をつけてゲームを起動する
あじおじああじおじあ

[Profile] UnrealInsightsを使用してプロファイリングする

下記引数をつけてゲームを起動する。
Traceチャンネルが多ければ多いほどログの容量が増えるので必要に応じて削ること
-trace=log,cpu,gpu,frame,bookmark,loadtime,file,memory,net -statnamedevents

実機テストで同じLAN内のPCでキャプチャするには下記引数でPC側のローカルIPを指定する
-tracehost=xxx.xxx.xxx.xxx

あじおじああじおじあ

[C++] 任意のコンソール変数追加する

いくつか方法はあるが FAutoConsoleVariableRefが簡単

FAutoConsoleVariableRefはInt, Float, Boolをサポート

// CPPで定義
bool TestBoolValue;
FAutoConsoleVariableRef CVarTestBoolValue(
	TEXT("TestBoolValue"),
	TestBoolValue,
	TEXT("テストBool変数"));

int32 TestIntValue;
FAutoConsoleVariableRef CVarTestIntValue(
	TEXT("TestIntValue"),
	TestIntValue,
	TEXT("テストInt変数"));

// 定義したCPP以外で利用したい場合
auto Variable = IConsoleManager::Get().FindConsoleVariable(TEXT("TestIntValue"));
int32 Value = Variable->GetInt();
あじおじああじおじあ

[Debug] デバッガの接続を待って起動する

-WaitForDebugger 引数を指定して起動する。
プロセスに接続すると UE_DEBUG_BREAK() に引っかかり、続行するとスタートする

あじおじああじおじあ

[C++] statコマンドの計測項目を追加する

  1. stat ~~ でまとめられるグループ単位で DECLARE_STATS_GROUP を定義
  2. 計測単位で DECLARE_CYCLE_STAT を定義
  3. 実際の計測箇所で SCOPE_CYCLE_COUNTER を記述
// 関数外のcpp定義
DECLARE_STATS_GROUP(TEXT("Test"), STATGROUP_Test, STATCAT_Advanced);
DECLARE_CYCLE_STAT(TEXT("Test.Task" ), STAT_Test_Task , STATGROUP_Test);

// 実際の計測をしたい関数内に定義
SCOPE_CYCLE_COUNTER(STAT_Test_Task);
あじおじああじおじあ

[Animation] Montageの BlendIn / BlendOut の仕様

BlendInはその名の通りMontageが再生されるときに使用されるブレンド設定
BlendOutはそのMontageの再生が終わってスロットに接続されてるポーズにブレンドする時の設定
(ポーズがない・接続されてない場合はメッシュのRefポーズになる)

MontageA再生中に違うMontageBが呼ばれた場合はMontageAのBlendOutは使用されずにMontageBのBlendInが使用される

※MontageA BlendingOut時にMontageBを再生した場合1フレだけスロットに接続されてるポーズがブレンドされるのであまりにBlendOutが短いと変なブレンドになる可能性がある