UE4のBP内で「_(アンダーバー)」を使うべきではない理由

Blueprint

BP内のグラフ・関数・変数の名前には「_(アンダーバー)」は使うべきではない。これらを使用すると見た目上の区別がつかなくなり混乱とバグを生むからだ。

間違い探しに挑戦!

まずは次のグラフを見てほしい。

間違い探しノード

A,B,C,Dの4つのブロック(関数ノード、Get変数ノードの組)がある。A,B,C,Dはすべて異なるノードで構成されている。さて、どの辺が違うのかよく見てほしい。

分かった人は次へ。分からない人も次へ。

答え合わせ

答え合わせ

MyBlueprintタブでのリスト

ブロック関数ノード名Get変数ノード名
AMyFunctionMyVar
B_MyFunction_MyVar
CMyFunction_MyVar_
DMy_FunctionMy_Var
  • Aは特に _ を使用していない
  • Bは語頭に _ を使用。関数ノード名でスペースが多いことに気が付いた人もいるだろう。
  • Cは語尾に _ を使用
  • Dは単語の区切りに _ を使用

おそらく大半の人がBの関数ノード以外の違いを見分けられなかっただろう。

なんでこんなことがおきるのか?

グラフエディタ上では_はスペースに変換される、という機能があるため。

元々UE4では名前の命名規則はPascalCaseが採用されている。

パスカルケース (pascal case)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
用語「パスカルケース (pascal case)」の意味を何となく説明しています。

このPascalCaseを一般的な英文にして読みやすくするために単語の区切りに自動的にスペースを表示してくれる、というのがBPなどのグラフエディタの便利機能としてある。この時、略字と単語が続く(例:XMLAndHTML)時などにどこからが区切りかわからないために区別がつくように_で単語の区切りを示す書き方があり(例:XML_AndHTML)、この書き方にも対応したために_をスペースに表示する機能になった、と思われる。

なので本来はこれは便利な機能のはずなのだ。

問題が起きる条件

見た目でスペースと区別がつかない、という問題が起きる条件は次になる。

語頭(プレフィックス)に「_」

テキスト系のスクリプト言語ではグローバルな変数とローカルな変数の名前被りを避け、ローカルであることを明示するために語頭(プレフィックス)に_を付けるルールを設けていることがしばしばある(JavaScriptやPythonなど)。

その感覚でローカルな関数や変数名の頭に_を付けてしまうと、グローバルなものと区別がつかない、という残念なことが起きる。

本来、グラフ上でグローバル・ローカルの見た目に差がつけばよいと思うのだが、BPのグラフエディタ上ではノードの見た目で区別がつかない残念、、、

語尾(ポストフィックス)に「_」

語頭の場合と異なり意識的につける文化などはないので大きく問題にはなりがちではないが、区別のつかなさでは語頭にあるよりも凶悪でまったく区別がつかない。

語頭にある場合、スペースの幅分でかろうじてわかることもあるが、語尾は無理!
混乱の危険性ではよりこちらのほうが上である。

大文字が続かない場合の語中の「_」

前述の通り、 略字などで単語の区切りなのに大文字が続く場合を除いて 、語中、特に単語の区切りに_を入れては全く区別がつかなくなる。

余談:単語の区切りに「 (スペース)」

_ではないが、自動でスペースが入力される位置にスペースを入力するのも危険。
UE4のBPのグラフ・関数・変数名にはスペースが入れられるためにこれも併せて要注意。

まとめ

  • BPのグラフ・関数・変数名で次は危険なので避ける
    • 語頭(プレフィックス)に「_
    • 語尾(ポストフィックス)に「_
    • 大文字が続かない場合の語中の「_
    • 単語の区切りに「 (スペース)」

Gamemakin UE4スタイルガイドにもこの辺は書いていないので要注意。
新しく始めるプロジェクトでは是非このルールを採用してほしい。

akenatsu/ue4-style-guide
ue4-style-guide - An attempt to make Unreal Engine 4 projects more consistent