もうすでに色々なサイトで書かれているけど、今回、意図的に全てBPで実装することを第一目標としてアプリを1本作ってみて個人的な感想を…
BPのバイナリデータ特有の不具合
何らかのタイミングでアセットがバグると基本、手動では修正出来ない(しかも稀によくバグる)
テキストベースのソースコードならコピペもできるけど、BPはコピペできる範囲も限られてるので、単純に同じBPを組むと言っても面倒くさいです(単純にアセットを複製するだけだとバグも複製されますし)
なのでBPで作成する場合はサブバージョンとかでバージョン管理しておくことを強くオススメします。(私はバージョン管理してなかったら途中で心が折れてました)
UObjectとAActorは何気に使い勝手が違う
UObjectとAActorは継承関係があるので互換性があるかと思いきや、結構仕様が違います
- UObject(AActor)を継承したクラスの親はAActor(UObject)に変更できない
UE4の継承関係は「UObject←AActor」という感じになっています。
なので「AActor←Hoge」を「UObject←Hoge」に変更できそうな気がするのですが出来ないようです(逆も出来ない)
関数やマクロのコピペ等が出来ないので、最低限どちらを親にするかはきっちり考えておいたほうがいいです。 - UObjectからは関数ライブラリをコールできない
UObjectはファンクションライブラリを参照できません。
なので、UObjectでなにかする予定がある場合はファンクションライブラリは使用しないほうがいいです。(マクロは可)
BPからC++にはアクセスできるけどC++からBPには出来ない
何やらBPはコンパイル時に都度ソースコードに翻訳されるらしく、C++側からBPで作成されたソース(クラス、インターフェイス、関数ライブラリなど)にはアクセスできない。
なので、非同期処理とかHTTP通信とかのC++専用機能を使う際には変数周りだけでもC++で作成しておかないと詰みます(もちろん初めからラッパーするつもりで実装すればなんとかなるとは思います)
特に今回はあらかたシステム周りを作りきってから、最後にHTTP通信を実装したので結局同じクラスを2パターン作る羽目になりました(既存のクラスを書き換えると継承関係とか、作成済み関数とかが大変なことになったので、おとなしくC++でデータクラスを作りました)
最低限変数宣言は全部C++でして、それ以外をBPで継承して実装がベターかなと今は考えています。
C++で作成してBPに公開したものはリネームが大変
エンジン側ではC++のリネームを自動で修正してくれないので手動で修正するには非常に手間がかかります。
一応リダイレクタという機能がありそれを記述して再起動するとBP内の関連付けを正常に出来ますが、やっぱり面倒くさいです。
極力C++で作成するものは仕様が固まってから作るのが良さそう。
C++のソースコードにエラーのある状態でエディタを閉じると起動できなくなる場合がある
エラーのある状態でエディタを閉じると、再起動時に再コンパイルをしてくれとエディタに言われることがある。
しかしエラーがあるのでコンパイルが通らず、ソースコードを修正しろと言われエディタが落ちる。
一度こうなるとソースコードを正常な状態にするまでVisualStudioのみでバグフィックスをしなければならなくなり面倒くさい。
なので一度ソースコードを弄ったら、きっちりコンパイルが通るところまで作業を進めてエディタを閉じることをオススメします。
コメント
>C++からBPにはアクセスできるけどBPからC++には出来ない
こちら見出しのアクセスできるできないが逆だと思います。本文の方があっています。
私も「BPはC++に変換されるだろうから当然C++からBP関数にアクセスできるだろうなー」と思っていて痛い目にあったので同意です!
間違ってましたね。ご指摘ありがとうございます修正しました!
意外とかゆいところに手が届かなくてモヤモヤする今日この頃です(それでも十分便利なんですけど)