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コマンドの計測項目を追加する
- stat ~~ でまとめられるグループ単位で DECLARE_STATS_GROUP を定義
- 計測単位で DECLARE_CYCLE_STAT を定義
- 実際の計測箇所で 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が短いと変なブレンドになる可能性がある