なりゆきでエンジン修正してプルリクしてみた その1:プラグインをビルドして動かしてデバッグする【UE4 / Unreal Engine 4】

前置き

面白そうな記事が上がっていたので、見ながらいろいろ手を動かしていた。

kano-lab.org

標準の「Sound Visualizations Plugin」を使ってるんだけど、どうも「GetAmplitude」で取得するデータが変なので、記事内では仕方なく別の方法でやっている。ふーんと思って自分でもいろいろ調べるうちに、C++をビルドする環境を作って、GitHubの勉強をし、プルリクするまでに至ったという話。

先にバグの内容を書きます

やった作業の記録を書く前に、要するにこういうバグだったという部分だけ先に書いておきます。(結果的にそれはこの記事の本題じゃなくなっちゃったので。)

…わかってみれば単純で、データ取得開始位置の計算が間違っていた。
チャンネル数分のズレが考慮されていなかったので、2チャンネル(ステレオ)の時に、時間的にちょうど半分の位置から開始する(10秒の位置から取得しようとすると、5秒の位置から取得される)ようになっていた。
3チャンネル以上のファイルの場合は全く別の処理が組まれているので、問題が起きるのは2チャンネルのファイルのみである。

以下GitHubにアップした際の差分のスクショ:
GitHubがらみの話は別の投稿でします)

f:id:nakadaieng:20190716124516p:plain

その1:プラグインをビルドして動かしてデバッグする

C++環境

C++環境は、以前UE4C++本を見ながらセットアップしていた。

C++でつくるUnreal Engineアプリ開発 for Windows & macOS 〜初歩からプラグイン開発まで〜

C++でつくるUnreal Engineアプリ開発 for Windows & macOS 〜初歩からプラグイン開発まで〜

 

使用バージョンが本と異なるのでメモしておく。

OS:Windows10
US4:4.21.2
VisualStudio:2017 Community

 せっかくなんでVS Codeでやってみようかとも思ったけど、手間がかかるだけでメリットがなさそうなので素直にVSにした。

インストール時「C++によるデスクトップ開発」にチェックを入れる必要がある。他のネット上の記事にはWindows8.1とかVC++2015関連とかも入れないといけないって書いてあるものもあったけど、今は入れなくても大丈夫っぽい?少なくとも現状問題は出ていない。

もう2019が出てますね。昔のバージョンはこちらからDLできます。
https://visualstudio.microsoft.com/ja/vs/older-downloads/ 

空のプラグインを新規で作ってみる

できればエンジン全体はビルドしたくないので、自プロジェクトにプラグインだけコピーしてきてビルドする方針でやってみる。

 

まずはプラグインを作る手順を学ぶために空のプラグインをゼロから自作してみる。

この辺の記事を参考にしつつ…でもすぐに機能が変わってくるので差分は適当に解釈しつつ。
PluginBrowerのTemplate作成機能
https://qiita.com/BlackMa9/items/e9c99ee2bf652bb91064

以前はPluginCreaterだった
http://historia.co.jp/archives/2967/

 

1.空のC++プロジェクトを作成
VisualStudioも立ち上がるけどとりあえず閉じる。

2.エディタの「編集>Plugins」
下部の「New Plugin」ボタンから「Blank」のプラグインを作る。
これだけで、テンプレートのソースを追加してビルドするところまで自動で進む。
記事では再起動を促されるとかあったけどそんなこともなく完了。進化してるわ。

3.トレースデバッグするには
VS上でブレークポイントを張って、普通にF5すると、エディタが起動してブレークするのを確認。

 

何をした時にソリューションを作り直すべきなのかとか、どこまでが自動になっているのかとかっていうあたりがいまいちよくわからんなぁ。

BPプロジェクトをC++プロジェクトに変更する

このままこのプロジェクトで進めようかとも思ったけど、問題が起きている冒頭の記事の内容をまたこの新しいプロジェクト上に作るのが面倒なので、やっぱり既存のプロジェクトに新しくプラグインを入れていることにする。

と思ったら元の(問題が起きている)プロジェクトはBPプロジェクトで作り始めたので、C++環境がない。

.uprojectファイルを右クリック>Generate Visual Studio project filesで、環境ができる?と思ったが、以下のエラー:

f:id:nakadaieng:20190716121258p:plain

「This project dos not have any souece code. You need to add C++ souece
files to the project from the Editor befor you can generate project files.」

何らかのC++ソースを追加する必要がある?
ということで試しに、エディタから、「ファイル>新規C++クラス」から空のクラスを作ってみると、、、なんかslnファイルはできたが、ビルドエラー。
一旦エディタ閉じて「Generate Visual Studio project files」で作り直して、VSでビルドしても同じエラーが出る。

UnrealBuildTool : error : Couldn't find target rules file for target 'UE4Editor' in rules assembly 'MotionProject_03ModuleRules, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
Location:D:\*****\MotionProject_03\Intermediate\Build\BuildRules\MotionProject_03ModuleRules.dll
Target rules found:
MotionProject_03-D:\*****\MotionProject_03\Source\MotionProject_03.Target.cs
MotionProject_03Editor- D:\*****\MotionProject_03\Source\MotionProject_03Editor.Target.cs

 (一部伏字にしてます)

uprojectの、Enterpriseの行を消すとビルドが通るという情報があったので試したら通った・・・全く分からんけどとりあえずそういうこと。
https://answers.unrealengine.com/questions/835578/

だが、このslnからではF5でエディタが起動しない。エディタのexeの場所が分からなくなっちゃってるみたい。

プログラム 'D:\*****\Engine\Intermediate\Build\Unused\UE4.exe' を開始できません。
指定されたパスが見つかりません。 

まー設定があるんでしょうね。
今回は取り急ぎ、VSでソリューション開いておいて、エディタは別で起動しておいて、VS側で「デバッグ>プロセスにアタッチ」を開いて「UE4Editor」を選択することでトレースできたので面倒ですがこれで良しとする。 

BPプロジェクトをC++プロジェクトに変更する(補足)

自分のところで新規で作った「BPプロジェクト」を「C++プロジェクト」に変換してみたら、上記ビルドエラーも出ず、F5でエディタ実行もできた。

おそらく使用しているプロジェクトが冒頭で挙げたサイトからDLしたものをベースにしていたからではないかと思う。Enterpriseって、UnrealStudioのことかもしれない。

既存のプラグインを自プロジェクトでビルド

続いてエンジン側にある「Sound Visualizations Plugin」を自分のプロジェクト側にコピーしてみる。

この辺を参考にしつつ…
http://unrealengine.hatenablog.com/entry/2015/05/20/220000
http://historia.co.jp/archives/367/

まず、Pluginsフォルダを作り、その下に、
エンジン側の「\Engine\Plugins\Runtime\SoundVisualizations」
を丸っとコピー。BinariesとIntermediateは削除。

名前変えないとダメかなぁと思いつつとりあえずそのままでやってみる。
「Generate Visual Studio project files」でsln作り直す。
お、ビルドは通った。

ちょっといろいろやって前後関係が怪しいが
公式のプラグインが一覧に出てこなくなっちゃったけど、
追加した奴はProjectのプラグインとしてちゃんと一覧に出てきた。
一旦無効化(Enableチェックを外す)してから再度有効化し、
そのまま、使ってたBPを再生すると、プロジェクト側で追加した方のプラグインが使われているっぽい(ちゃんとそちらのブレークポイントに反応する)。
BPは名前で参照解決してるんだなぁ。

いわゆるホットリロードできないといちいちエディタ再起動で面倒だな。

http://unrealengine.hatenablog.com/entry/2018/01/07/224555
これでモジュール単位でホットリロードできるって。できたできた。

でも、エディタ側からコンパイルするとデバッグ情報がずれる?みたいで、VS側でブレークポイント置けなくなる。うーむ。今回のところはエディタ再起動します・・・。

不具合の原因特定 

…意外とてこずったが、結果、冒頭に書いたバグを発見しました。

続きます

次の記事で、プルリクの経緯を書きます。