Blueprintについて勘違いしていたこと3選

少し前からUnreal Engine入門をしています。
最終的にC++を書くことになるんだろうなと思いつつ、
Unreal EngineといえばBlueprintからでしょう!と思い、Blueprintを触ってみているところです。

まず始めに断っておきますが、自分は静的型付け言語が好きで、
動的型付け言語やビジュアルスクリプティングに類するものが苦手です。
自分が使うのが苦手というだけで、それが好きな人がいるのは理解はしています。

そんな自分が、Blueprintを触ってみて、
勘違いしていた点や「思ってたより良いじゃん」と思った点を3つ紹介します。

1. コンパイルがあって、型をチェックしてくれる

まずこれ。
ビジュアルスクリプティングといえば動的型付けで型エラーも実行時。みたいな思い込みがありましたが、
Blueprintにはコンパイルという作業があります。

簡単な例を見て見ましょう。

Testというメソッドは、intを受け取り、intを返します。

使う側はこんな感じ。

これをstringを受け取り、stringを返すように変更して見ます。

ちゃんとコンパイルエラーが出ました!嬉しい!

型のチェックしてくれるビジュアルスクリプティング言語なんて他にもあるよ、とお思いかもしれませんが
ちゃんと構造体も定義できて、型をチェックしてくれて、何より実行前にエラーが出てくれる。
それだけで嬉しいのです。

2. 高レベルな作業が行えるノードが充実している

この話はGodotのVisual Scripting廃止の記事が詳しいので、引用して訳します。

ビジュアル スクリプティングの基本機能はあっても、Godot にはそれを利用するための高レベル コンポーネントが不足していました。UnrealやGame Maker、Constructのようなエンジンでは、ビジュアルスクリプティングのソリューションと一緒に高レベルのゲーム機能がパッケージされています。これがGodotの便利なところです。Godotは極めて汎用的なゲームエンジンであり、そのような機能を自分で作るのは簡単ですが、箱から出してパッケージ化されているわけではありません。そのため、VisualScript単体ではほとんど役に立ちませんでした。

前の記事で書いた通り、Unreal Engineはeasyを目指していると思っています。
どう説明すべきか悩ましいですが、1つ1つのノードがC++の1命令ではなく、便利な1関数であり、
それが潤沢に準備されている。という点が、今まで使ってきたビジュアルスクリプティングとは違う点だなと感じました。

3. BlueprintとC++の間の壁は、想像以上に薄かった

Blueprint Classの詳しい説明はドキュメントを見ていただくとして
まず、「BlueprintからC++で書いた関数が呼び出せる」は当たり前に出来るものだと思ってましたし、出来ます。
もっと正確に言うと「BlueprintからC++で書いたstaticな関数を呼び出せる」と思っていました。

ですが、実はBlueprint Classは、(必ず?)C++で書いたclassを継承したものだったのです。
BlueprintからC++で実装したメンバ変数にもメンバ関数にもアクセス出来ます。
これが何を意味するかと言うと、このclassのこの関数はC++で、この関数はBlueprintで、と1つのclass内で2つの実装方法が使えます。
さらに、C++側でvirtualな関数を定義しておけば、C++からその関数(実装はBlueprintで行われている)を呼び出すことも出来ます。
その発想はなかった、頭良すぎる。

とはいえ

テキストベースでコード書く方が好きなのでC++書くことになるだろうな〜とは思いつつ、
リアルタイムに調整できたら嬉しいもの、例えば演出周りだとか、敵の動きの制御周りなんかは
Blueprintに任せられても楽しいかもな〜とか思ってます。

参考資料