ブループリントのアクセス修飾子をデフォルトPrivateにする

こんばんわ。鈴木です。
記念すべき第一回はブループリントのアクセス制限の記事です

まずはじめにとりあえずコード

これをエンジンに書き加えてもらうとブループリントの関数とプロパティのデフォルトアクセス修飾子が
Privateになります。
コードはUE4.17用(ちょっと古くてすいません)ですが多分同じ様な所を見つけて書き足せば大丈夫だと思います。

メンバ関数のデフォルトPrivate化

FBlueprintEditorUtils::CreateFunctionGraph

BlueprintEditorUtils.h
            if ( bIsUserCreated )
            {
                // We need to flag the entry node to make sure that the compiled function is callable from Kismet2
//                int32 ExtraFunctionFlags = ( FUNC_BlueprintCallable | FUNC_BlueprintEvent | FUNC_Public );
                int32 ExtraFunctionFlags = ( FUNC_BlueprintCallable | FUNC_BlueprintEvent | FUNC_Private );    //追加
                if ( BPTYPE_FunctionLibrary == Blueprint->BlueprintType )

結果

image.png

メンバ変数のデフォルトPrivate化

FBlueprintEditorUtils::AddMemberVariable

BlueprintEditorUtils.cpp
    NewVar.VarType.bIsReference   = false;
    NewVar.SetMetaData(FBlueprintMetadata::MD_Private,"true");    //追加

    Blueprint->NewVariables.Add(NewVar);

結果

image.png

以上です。

ブループリントを使った開発でありがちなこと

複数の開発者でブループリントを使った開発を行うと他のアセットへの参照を意図せずに追加してしまい
気づいた時にはアセット同士がルンバ(c)のブラシに絡まった髪の毛のような状態になることがあります

この状態になるといろいろなことが起こります

依存しないはずのアセットの読み込み

起動時に大量のアセットを読んじゃうとか
タイトル画面とかシンプルなレベルなのに、よくわからないキャラクターのメッシュが読み込まれてるとか

依存の無いプループリント編集時に謎のアセットが読み込まれる

イケてないブループリントインターフェイスや、ブループリントファンクションライブラリを作ってませんか?
これらはエディタを開く時に必ず読み込まれます。

ブループリントのコンパイルが遅い

リファレンスが増えるとコンパイルが遅くなるそうです。。。

パッケージビルドでブループリントにまつわる謎のエラーに遭遇する

これは何が原因なのか解らないのですが、関係ないアセットの編集で治ったり再発するところをみると
なにかBP間の参照が影響している可能性がある気がします。

アクター単体テストが難しくなる

まず、ほげたつさんのすごく良い記事があったのでリンクをはっておきます
http://hogetatu.hatenablog.com/entry/2017/12/11/000638
どうでもいいですが、DIは dependency ejection だと思ってました。依存性を狂信的にちぎっていく的な。

強い相互依存が生まれていると、その一部のブループリントを複製して、入れ替えてテストするのが難しくなります
ソースコントロールを有効にしていると、編集対象が競合しているため誰かが取得しているロックが外れるのを待ったりする無駄な時間とか辛いですよね。
作業者が被らないように編集対象のアセットの分割したり、そもそもソースコントロールを無効にして作業したりと運用である程度カバーもできますが、
依存関係がなければ、Duplicateして別のBPで作業したりすることが可能です。

※個人的には作業のコンフリクトが発生し得る部分はネイティブコード推奨です。
※BPはロック不要でバージョン管理ツールでサクサクマージ可能な形式で保存してほしい。

いざリファクタリング

このような問題を含みつつもブループリントは流れがイメージしやすかったりイテレーションも早いしでメリットも沢山あるので積極的に使うことになります。
これで問題がでなければ良いのですが、最適化やリファクタリングを行ったり(強いられたり)、ネイティブコード化したりすることがあります。

この際に
この関数なんとなく内部呼び出し用なんだけどpublicになっている。
もしかすると外部からアクセス呼び出されている可能性が・・・

とか
メンバプロパティを外部から書き換えてるんですが、カプセル化とは・・・
みたいな状況に度々遭遇します。

こうなるとまずBPを全検索して・・・みたいな悲しい作業が始まるのですが、
private設定の変数や関数であればそのアセット内で作業が完結してくれます。

しかしブループリントはアクセス制限設定がデフォルトでpublicとなっております。
汎用エンジンなのでまず適当にやっても動く(書ける)ことを重視しているのかもしれません。
もしこの辺りで困ったことがあれば冒頭のようなパッチを当てることで、不幸せなコードが減ってくれるかもしれません。

糸冬

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.