LoginSignup
0
0

More than 1 year has passed since last update.

UnrealのC++で気を付けること

Last updated at Posted at 2022-03-15

はじめに

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, USTRUCTUPROPERTYなど, エディタやBlueprintで扱うためのクラスやプロパティの情報を処理します. リフレクション機構が充実しているC#では無用ですね. 特筆すべきは, namespaceに対応していないことです.

Unity Build

ビルドシステムに依ってサポートされる機能です. コンパイル単位を統合してしまう機能です. リンカ処理の回避によるビルドパフォーマンス向上や, コンパイル単位を超えた最適化を狙った機能と思います.

弊害も多いですが, 自分が扱いきれないからといって, プロジェクトの全モジュールで一律に無効にすることは横暴が過ぎます.

しっかり検証していないので話半分に, 危険回避の案とでも. 気を付けるべきは次だと思います.

  • 裸のnamespace
  • using namespace
  • include
  • define
  • pragma

列挙すると, namespaceはUnrealHeaderToolsの件も併せて使わない方針が楽です, ファイル名やクラス名は確実にユニークにしてしまいましょう. using namespaceは関数スコープ内だけだと思います. defineはユニークで, pragmapush & popとセットでしょう.

Slate

ドキュメント読んでもわからない, 慣れてくるとおそらくC++のこのメソッドがDSLのこれに対応しているのだな, とわかりますけど.
定数を指定する箇所で, C++のconstexprを指定しても通りません, CPP, Slate DSL, C++コンパイルの順なのかな, コンパイル時定数などは認識されないので注意です. まあ, まともに扱える人はいない感じです.

おまけ

staticの初期化

デバッガを繋いでエディタを起動するとわかりますが, クライアントのDLLはエディタ起動時にロードしています, このときにstatic変数は初期化されます. 以降, エディタ上でコンパイルボタンを押下した時などに, DLLの生成と再ロードを行います, ちゃんと"Reload"とメッセージがでますね, その時点でstatic変数は初期化されます, 当たり前ですけど. これはUnityでも同じですね.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0