UE4の勉強記録

UE4の勉強の記録です。個人用です。

実際のゲームを作成する

<前文>

一年半ほどかけてUE4C++を「Unreal Engine 4 Scripting with C++ Cook」で勉強しました。UE4C++の基礎は大体は理解しましたが、ゲームにおけるソフトウェアデザインとの整合性が良く分かりません。と言うのはあるゲームにおいてどの機能を使用するのが最適なのかソフトウェアデザインの観点からどうやって決定しているのか不明だからです。Bob Nystrom著のGame programming patternsにはゲームにおけるソフトウェアデザインが詳しく載っていますがこのどれをUE4C++が採用していて実際のゲームの製作ではどのソフトウェアデザインをゲーム製作者らは選択するのかがまだ良く分かっていないです。今年はその辺について勉強したいと思います。

<本文>

ゲームにおけるソフトウェアデザインの具体的な勉強方法の一つはゲームの製作そのものから学ぶ事だと思います。そのゲームが採用しているソフトウェアデザインがそのまま学べるからです。3つほど具体的な案があります。「RPGを作成する。」「カードゲームを作成する。」「アクションRPGを作成する。」です。

案1:RPGを作成する

以下の本をずっと昔に買って忘れていました。この本買った日に一日で読み切ったので大して難しくはないはずです。さらに記憶が正しければUE4C++も結構使用したはずです。

f:id:kazuhironagai77:20190407212450p:plain

ただしアマゾンの評価では

f:id:kazuhironagai77:20190407212508p:plain

これ以上ない最悪の評価です。その理由は、

f:id:kazuhironagai77:20190407212540p:plain

大体同じなのですがコードが動かない。質問を出版社にしても「内容に問題はない!」としか返事が返って来ないからと書かれています。

試しにサンプルコードのCh2をUE4.12.5で起動させたら普通に動きました。(最新のUE4.22では動かなかった。)

f:id:kazuhironagai77:20190407212605p:plain

ちょっと不安はありますがこの本で勉強してRPGを作成してみるのが案1です。

案2:カードゲームを作成する

CCGtoolkitが無料だった時にダウンロードしました。その時に51ページもあるオフィシャルドキュメントも一緒にダウンロードしました。たった51ページですが内容が凄そうです。

f:id:kazuhironagai77:20190407212633p:plain

これで勉強するのが案2です。

案3:アクションRPGを作成する

折角、Unreal Engine 4 scripting with C++でgameplay abilities systemについて勉強したのでアクションRPGを作成してみるのが案3です。

結論

簡単そうな案1から試してみます。

<本文2>

「Unreal Engine4.xを使用してRPGを作成する。」を勉強します。取りあえず一章を読んでみます。

1章 UnrealによるRPGのデザインの開始

読みました。特にここに記録しなければならない内容はなかったです。はっきり言って、Unreal Engine 4 scripting with C++と比べると大変簡単です。

<本文3>

第2章 Unrealによるスクリプトとデータ

データデーブル(data table)を使用するみたいです。Unreal Engine 4 scripting with C++の12章12節「GameplayTagsをアクターに付ける。」でData tableは使用しましたのでそれを踏まえて勉強したいと思います。ここからは実際にコードを書いて行くようです。Packet社のサンプルの方は各章毎に分かれたプロジェクトが用意されています。

f:id:kazuhironagai77:20190407212805p:plain

前述したようにUE4.12.5で起動させたら普通に動きました。UE4.22で再現してみようと思います。

まず、新しいプロジェクトを作成しました。プロジェクト名はCh2です。

f:id:kazuhironagai77:20190407212825p:plain

<方法と結果>

Step.1 アクタークラスの派生クラスの作成

サンプルコードを見ると、MyNewActorと名付けられているので同じにします。

f:id:kazuhironagai77:20190407212902p:plain

出来ました。がエラーが凄い事になっています。ビルドしたらエラーが出ました。

f:id:kazuhironagai77:20190407212920p:plain

.vs、Binaries、Intermediate、Saved、そしてCh2.slnを消してもう一度作り直しました。

f:id:kazuhironagai77:20190407212939p:plain

今度はビルドが成功しました。

では教科書の指示通りに以下に示すコードを使用してHello Worldを表示させましょう。

f:id:kazuhironagai77:20190407212959p:plain

f:id:kazuhironagai77:20190407213006p:plain

GEngineがエラーに成ってしまいました。

f:id:kazuhironagai77:20190407213027p:plain

を追加しますがエラーはそのままです。

あれ?しばらくしたらエラーが消えていました。

f:id:kazuhironagai77:20190407213045p:plain

ビルドしても

f:id:kazuhironagai77:20190407213102p:plain

普通に成功します。

作成したactorをレベルに追加します。

f:id:kazuhironagai77:20190407213125p:plain

Playを実行すると

f:id:kazuhironagai77:20190407213214p:plain

Hello World! が表示されました。

教科書の方ではplay画面だけでなくLogの画面でもHello World!は表示されるとありますが私のプロジェクトでは表示されませんでした。バージョンが違うからでしょうか?

f:id:kazuhironagai77:20190407213232p:plain

Step.2 BPの作成

f:id:kazuhironagai77:20190407213307p:plain

教科書の指示に従って以下のBPのノードを作成しました。

f:id:kazuhironagai77:20190407213331p:plain

MyPrintString変数のデフォルト値に、

f:id:kazuhironagai77:20190407213354p:plain

を追加します。教科書の説明ではMyPrintString変数を作成したら自然にDetailのデフォルト卵に文字が書き込めると書かれていましたがコンパイルをしないと書き込めないです。これは常識ですが初心者はこんな所でも結構躓きますよね。この辺がこの教科書の評価が最低になってしまっている理由だと思います。

f:id:kazuhironagai77:20190407213424p:plain

出来ました。

Step.3 前に作成したC++クラスからBPを作成

作りました。

f:id:kazuhironagai77:20190407213450p:plain

勿論作成したBPをレベル内に配置すればHello World!をプリントします。

f:id:kazuhironagai77:20190407213539p:plain

この辺は当たり前すぎて正直、復習にすらならないですね。

Step.4 DataTableを使用してSpreadsheetをインポート

やっと、新しい事をします。これはやった事ないです。

まず教科書の表を以下に示すようにエクセルで作成しました。

f:id:kazuhironagai77:20190407213606p:plain

CSVフォーマットで保存します。教科書によるとこのデータテーブルをUE4のプロジェクトにインポートする前にそのための構造体を作成する必要があるそうです。のでその構造体を作成します。

Step.5 データテーブルの構造体の作成

以下に示すように作成しました。

f:id:kazuhironagai77:20190407213632p:plain

f:id:kazuhironagai77:20190407213647p:plain

ビルトも成功しました。

f:id:kazuhironagai77:20190407213736p:plain

教科書には変数名とエクセルの行の名前が同じと説明されていたので、一応名前を直しておきました。

f:id:kazuhironagai77:20190407213758p:plain

そしてエクセルのデータをインポートします。

f:id:kazuhironagai77:20190407213816p:plain

エラーに成ってしまいました。OutputLogを見ても理由が不明です。

このサイトに理由が載っていました。CSVファイルをインポートするためにはそのファイルを開いているソフトウェアを閉じてからする必要があるそうです。

エクセルを閉じてもう一度、インポートしたら出来ました。

f:id:kazuhironagai77:20190407213849p:plain

Step.5 スプレットシートのクエリー

教科書に書かれている通り、以下のコードをMyNewActorクラスに追加します。

f:id:kazuhironagai77:20190407213914p:plain

f:id:kazuhironagai77:20190407213940p:plain

f:id:kazuhironagai77:20190407213950p:plain

f:id:kazuhironagai77:20190407214003p:plain

ビルドします。

f:id:kazuhironagai77:20190407214111p:plain
成功しました。

MyNewActorクラスから作成したBP、NewBluePrint1を開き、My New Actorにインポートしたデータテーブル、Ch2Dataを選択します。

f:id:kazuhironagai77:20190407214126p:plain

NewBluePrint1をレベル内に配置してPlayを実行すると

f:id:kazuhironagai77:20190407214205p:plain

がプリントされました。

<考察>

DataTable->FindRow()関数について少しだけ勉強してみます。

f:id:kazuhironagai77:20190407214241p:plain

と変えたら、

f:id:kazuhironagai77:20190407214300p:plain

とプリントされました。勿論TEXT(“3”)と変えた場合は、

f:id:kazuhironagai77:20190407214339p:plain

でした。

ではSomeNumberにアクセスする場合はどうすればいいでしょうか。

関数名がFindRow()ですのでその列のSomeNumberにも既にアクセスしていると考えられます。それをどうやってLogで表示するかの問題と考えられますので、

f:id:kazuhironagai77:20190407214405p:plain

これで試してみます。

f:id:kazuhironagai77:20190407214427p:plain

出来ました。

<感想>

最後の部分は思ったより難しかったですがこんな感じでやって行こうと思います。