俺マクロ
UE4ってDevelopビルドで開発中もユーザーコードが最適化されているので
いざデバッガが使いたいような問題にあたったり例外が出た時に変数などが省略されてて
困ることがありますよね。
※ディスアセンブルを読めば良いんですが、苦手な人もいますよね。
そこで自分がデバッグしたいコードの一部分の最適化を#pragma optimize
を使って解除しておくとデバッグが簡単になります。
ただしチーム開発している時に他の開発者に影響を与えるのは困りものですし
CIで生成したパッケージに影響を与えるのはもっと困ります。
そこで開発者毎のマクロを宣言して使うようにすると自分だけに影響を及ぼすコードを記述できます。
UEはUBTというビルドツールがビルド全般を担うのでBuild.csファイルにちょっと追記することで実現可能です。
Build.CS
public class MyGame : ModuleRules
{
public MyGame(ReadOnlyTargetRules Target) : base(Target)
{
string DevUserDefine = "DEVUSER_" + System.Environment.GetEnvironmentVariable("USERNAME").ToUpper();
DevUserDefine = DevUserDefine.Replace(".", "_");
DevUserDefine = DevUserDefine.Replace("-", "_");
DevUserDefine = DevUserDefine.Replace("$", "_");
PublicDefinitions.Add( DevUserDefine );
使ってみる
optimize/off したあとは、後方で optimize/onしておくのがよろしいです。
(unitybuildとかで他のソースに影響を与えたりしちゃうかも)
# if defined(DEVUSER_TAKASHI_SUZUKI)
# pragma optimize("",off)
# endif //DEVUSER_TAKASHI_SUZUKI
void MyClass::MyFunction()
{
... // debuggable!!
}
# if defined(DEVUSER_TAKASHI_SUZUKI)
# pragma optimize("",on)
# endif //DEVUSER_TAKASHI_SUZUKI
iniに書けばいいじゃん・・・と思うかもしれませんがConsoleVariableに適用するのも楽ちんなので結構好きです。
static TAutoConsoleVariable<int32> CVarMyVariable(
TEXT("MyGame.MyVariable"),
# if defined(DEVUSER_TAKASHI_SUZUKI)
1,
# else
0,
# endif //defined(DEVUSER_TAKASHI_SUZUKI)
TEXT("0 - anta")
TEXT("1 - wai"));
以上!