[UE4] Unreal EngineのPhysXをビルドする方法

検証バージョン：4.26.0
# はじめに
UE4の物理シミュレーションは現在Chaosの開発を行っていますが、元々は[PhysX](https://www.nvidia.com/en-us/drivers/physx/physx-9-19-0218-driver/)を使用しており、今もまだこちらを利用することがあります。エンジンはPhysXは.dllで配布して利用しますが、本記事で説明する手順でPhysXをビルドをすることによってシンボルなどを作成してデバッグに役立てる事ができます。

例えばPhysXのメモリをトラッキングしたい場合、MallocProfilerを使用する際にPhysXのビルドをする/しないの違いによって、コールスタックに以下の差異が出てきます。

**・PhysXビルドなし**
![2021-03-29_01h36_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/cbfb0c84-b829-6942-7bc3-536b8f700356.png)

**・PhysXビルドあり**
![2021-03-29_01h36_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/c7d3802d-9e0f-665d-52cf-d6c4fa8c239b.png)

また、ここで説明する内容は以下のリンクの内容を詳細に説明したものとなります。
https://www.ue4community.wiki/legacy/physx-source-guide-0mvucbzi

# 手順
本記事では以降で詳細な方法を説明しています。

##1. Visual Studio 2015をインストール
PhysXはVS2015でビルドする必要があるため、以下のサイトからVisual Studio 2015をダウンロードします。[Visual Studio 2015 and other Products]の[ダウンロード]を選択し、CommunityやProをダウンロードします。VS2015のインストール時には"C++によるデスクトップ開発"にもチェックを入れてインストールしておきます。

UE4の4.26では現在VS2019が標準で利用するバージョンなため、ここがやや手間がかかる部分です。

https://visualstudio.microsoft.com/vs/older-downloads/

##2. 一部のソースコードを修正
PhysXのビルドを行う前に事前に一か所ソースコードの変更を行います。
以下のファイルの1か所をコメントアウトします。この行はPerforceにアクセスするためのコマンドなため、コメントアウトしない場合はビルド時に失敗のメッセージが表示されます。

**【変更ファイル】**
\Engine\Source\Programs\AutomationTool\Scripts\BuildPhysX.Automation.cs

**【変更箇所】**
23行目の`[RequireP4]`をコメントアウトする。

**＜変更前＞**
![2021-03-24_12h18_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/72c121da-2652-fdb7-ec89-86a4f88e12da.png)
**＜変更後＞**
![2021-03-24_12h19_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/77ad8bb0-5a8d-b4b9-b9a9-29aadff03f3b.png)

##3. ビルド実行
`\Engine\Source\ThirdParty\PhysX3\`にあるバッチファイル`BuildProfile_Win64.bat`を実行します。
問題なくビルドが完了したら、以下のように成功が表示されます。

![2021-03-24_16h31_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/f1ed7dfc-d1da-d452-ece8-28212fcbfd0d.png)

失敗しているような場合は、ビルド環境が問題の可能性があります。

例えばバッチファイルを実行した際に以下のようなエラーが出る場合はVS2015のビルド環境に問題があります。CMakeのビルドに失敗しているので、VS2015にC++のビルドに必要なコンポーネントが不足している可能性があります。

![2021-03-24_14h23_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/fc68a3a9-7b92-81e6-084c-0def996eae0e.png)

```
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
ERROR: CMake Error in CMakeLists.txt:
ERROR: No CMAKE_C_COMPILER could be found.
ERROR:
ERROR:
ERROR:
ERROR: CMake Error in CMakeLists.txt:
ERROR: No CMAKE_CXX_COMPILER could be found.
ERROR:
ERROR:
ERROR:
-- Configuring incomplete, errors occurred!
```

変更してコンポーネントを追加しても問題ないですが、一度VS2015を再インストールしてC++コンポーネントを選択して入れなおすのも良いです。

変更する場合は、[コントロールパネル]の[プログラム一覧]から選択できます。
![2021-03-24_16h32_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/50c08469-0991-9a27-8f0e-1e9350d46cbd.png)
再インストールする場合は、[カスタム]インストールを選択してコンポーネントを一覧から選択してください。
![2021-03-24_14h26_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/f7a318bf-e6cc-2b51-de00-a492161987c8.png)

# パッケージにデバッグシンボルを含める場合
上記が成功していればPhysXのシンボルも作成されるので、ProjectSettingsの設定からIncludeDebugFilesを有効にするだけです。

# Win64以外のプラットフォーム向けにビルドする場合
バッチファイル`BuildProfile_Win64.bat`の中身を見ると以下のようになっているので、`TargetPlatforms`の部分をビルドしたいプラットフォーム名称に変更するだけです。

```
@echo off

pushd ..\..\..\Build\BatchFiles
call RunUAT.bat BuildPhysX -TargetPlatforms=Win64 -TargetConfigs=profile -TargetWindowsCompilers=VisualStudio2015 -SkipCreateChangelist
popd
```

選択したプラットフォームによってはビルドが通らないこともあるため、その場合はフォーラムなどでお問い合わせください。