UE4 Unreal C++コードリーディング会@大阪に行ってきた。
主催はalwei氏で、前に第1回 Unreal Engine4 名古屋勉強会で講師をしていた人だ。
Unreal C++のソースコードは、UE4で新規プロジェクトを作る際にBluePrintのプロジェクトでなくC++プロジェクトに設定して作成すると、そのプロジェクトのスケルトンのソースコードとエンジン部分のソースコードが入った状態で作成される。
実際にThirdPersonプロジェクトをC++のプロジェクトとして作成して、確認してみた。
Unreal Engineのエンジン部分のソースコードはさすがにC++にあまり精通していない自分が読むのは厳しい感じだった。
ThirdPersonのC++のコードをいじって、cpp_thirdCharacter.cppというファイルのvoid Acpp_thirdCharacter::MoveForward(float Value)という部分のキャラクターが前後方向に移動する処理を書き換えて、LOG出力を入れてみたり、画面上に文字を表示させたりしてみた。
void Acpp_thirdCharacter::MoveForward(float Value) { if ((Controller != NULL) && (Value != 0.0f)) { // find out which way is forward const FRotator Rotation = Controller->GetControlRotation(); const FRotator YawRotation(0, Rotation.Yaw, 0); // get forward vector const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); AddMovementInput(Direction, Value); UE_LOG(LogTemp, Warning, TEXT("output : %s"), L"Move Forward!!!!"); // これを追加した! GEngine->AddOnScreenDebugMessage(-1 , 2.0 , FLinearColor::Red.ToFColor(true) , TEXT("Move Forward!!!!") ); // これを追加した! } }
GEngineを参照するため、GEngineを定義しているヘッダファイルEngine.hのincludeを先頭に追加した。
#include "Runtime/Engine/Classes/Engine/Engine.h"
その他、勉強になった点。
・UE4のビルドシステムは、MONO/C#で作られている。
UE4のエンジンのソースと同じく、プロジェクトのフォルダに入っている。
Makefileみたいなものに比べるとかなり複雑な動作をしている。
C++に独自の拡張をしていて、ヘッダファイルを処理するプリプロセッサがコメントに所定の書式で書かれたメタ情報を取り込んで、C++で作られたモジュールがBluePrint上でも使えるように処理してくれたりする。
C++プロジェクトを作ると、Visual Studioが起動してUE4 Editorとビルドシステムは連携して動作する。
だだ、UE4 EditorとVisual Studioの連携は、ちょっと使ってみて不安な感じだ。例えば、UE4 Editor側でクラスを追加して、そのクラスをVisual Studio側で削除したりすると不整合が起きてUE4側に戻ったあとビルドでエラーになる。
Visual Studioを終了させておいてもC++プロジェクトはUE4 Editor側からちゃんとビルドできるので、Visual Studioが起動していないときにはUE4 Editorが内部でコンパイラを呼び出しているっぽい。
ホットリロードという機能があり、UE4 Editorで作っているゲームを動かしている最中にソースコードを変更してコンパイルして修正をかけるということが可能だ。BluePrintでそれができるのは前に聞いていて面白いと思っていたのだが、C++のソースコードの部品もホットリロードができるのだそうだ。
—
追記
このコードリーディング会は、UE4のソースコードをみんなで読んでみんなで意見交換をする会というのを主催のalwei氏は狙っていたみたいだけど、いきなりその場で初めてUE4のC++のちょっと特徴のある大量のソースコードを読み始めて意見を出すというのは殆どの参加者には難しかったのだと思う。