はじめに
Unreal Engine のC++といっても, 普通のC++です, autoの推論規則が異なるとか, ヘッダの扱いが異なるとかそういうことはありません.
検証はしていない駄文です, 間違いだらけです.
- Unreal Header Tool
- C++で独自のリフレクション機構やGC機構を実現するために, コンパイル前のプリプロセスを行います
- Unity Build
- Unreal特有でもないですが, Unrealが積極的に活用しているため気を付ける特徴です
- Slate
- 経緯は知りませんし, 調べたくないですが, どうしてこうなった感が強い, 埋め込みDSLを使うUIライブラリ. どうしてこうなった.
- UMLはSlateのUIクラス階層と同じものを複製し, 同期して更新するとんでも機構, どうしてこうなった.
Unreal Header Tool
DSLです, UCLASS
, USTRUCT
やUPROPERTY
など, エディタやBlueprintで扱うためのクラスやプロパティの情報を処理します. リフレクション機構が充実しているC#では無用ですね. 特筆すべきは, namespace
に対応していないことです.
Unity Build
ビルドシステムに依ってサポートされる機能です. コンパイル単位を統合してしまう機能です. リンカ処理の回避によるビルドパフォーマンス向上や, コンパイル単位を超えた最適化を狙った機能と思います.
弊害も多いですが, 自分が扱いきれないからといって, プロジェクトの全モジュールで一律に無効にすることは横暴が過ぎます.
しっかり検証していないので話半分に, 危険回避の案とでも. 気を付けるべきは次だと思います.
- 裸のnamespace
- using namespace
- include
- define
- pragma
列挙すると, namespace
はUnrealHeaderToolsの件も併せて使わない方針が楽です, ファイル名やクラス名は確実にユニークにしてしまいましょう. using namespace
は関数スコープ内だけだと思います. define
はユニークで, pragma
はpush
& pop
とセットでしょう.
Slate
ドキュメント読んでもわからない, 慣れてくるとおそらくC++のこのメソッドがDSLのこれに対応しているのだな, とわかりますけど.
定数を指定する箇所で, C++のconstexprを指定しても通りません, CPP, Slate DSL, C++コンパイルの順なのかな, コンパイル時定数などは認識されないので注意です. まあ, まともに扱える人はいない感じです.
おまけ
staticの初期化
デバッガを繋いでエディタを起動するとわかりますが, クライアントのDLLはエディタ起動時にロードしています, このときにstatic変数は初期化されます. 以降, エディタ上でコンパイルボタンを押下した時などに, DLLの生成と再ロードを行います, ちゃんと"Reload"とメッセージがでますね, その時点でstatic変数は初期化されます, 当たり前ですけど. これはUnityでも同じですね.