<前文>
一年半ほどかけてUE4C++を「Unreal Engine 4 Scripting with C++ Cook」で勉強しました。UE4C++の基礎は大体は理解しましたが、ゲームにおけるソフトウェアデザインとの整合性が良く分かりません。と言うのはあるゲームにおいてどの機能を使用するのが最適なのかソフトウェアデザインの観点からどうやって決定しているのか不明だからです。Bob Nystrom著のGame programming patternsにはゲームにおけるソフトウェアデザインが詳しく載っていますがこのどれをUE4C++が採用していて実際のゲームの製作ではどのソフトウェアデザインをゲーム製作者らは選択するのかがまだ良く分かっていないです。今年はその辺について勉強したいと思います。
<本文>
ゲームにおけるソフトウェアデザインの具体的な勉強方法の一つはゲームの製作そのものから学ぶ事だと思います。そのゲームが採用しているソフトウェアデザインがそのまま学べるからです。3つほど具体的な案があります。「RPGを作成する。」「カードゲームを作成する。」「アクションRPGを作成する。」です。
案1:RPGを作成する
以下の本をずっと昔に買って忘れていました。この本買った日に一日で読み切ったので大して難しくはないはずです。さらに記憶が正しければUE4C++も結構使用したはずです。
ただしアマゾンの評価では
これ以上ない最悪の評価です。その理由は、
大体同じなのですがコードが動かない。質問を出版社にしても「内容に問題はない!」としか返事が返って来ないからと書かれています。
試しにサンプルコードのCh2をUE4.12.5で起動させたら普通に動きました。(最新のUE4.22では動かなかった。)
ちょっと不安はありますがこの本で勉強してRPGを作成してみるのが案1です。
案2:カードゲームを作成する
CCGtoolkitが無料だった時にダウンロードしました。その時に51ページもあるオフィシャルドキュメントも一緒にダウンロードしました。たった51ページですが内容が凄そうです。
これで勉強するのが案2です。
案3:アクションRPGを作成する
折角、Unreal Engine 4 scripting with C++でgameplay abilities systemについて勉強したのでアクションRPGを作成してみるのが案3です。
結論
簡単そうな案1から試してみます。
<本文2>
「Unreal Engine4.xを使用してRPGを作成する。」を勉強します。取りあえず一章を読んでみます。
読みました。特にここに記録しなければならない内容はなかったです。はっきり言って、Unreal Engine 4 scripting with C++と比べると大変簡単です。
<本文3>
データデーブル(data table)を使用するみたいです。Unreal Engine 4 scripting with C++の12章12節「GameplayTagsをアクターに付ける。」でData tableは使用しましたのでそれを踏まえて勉強したいと思います。ここからは実際にコードを書いて行くようです。Packet社のサンプルの方は各章毎に分かれたプロジェクトが用意されています。
前述したようにUE4.12.5で起動させたら普通に動きました。UE4.22で再現してみようと思います。
まず、新しいプロジェクトを作成しました。プロジェクト名はCh2です。
<方法と結果>
Step.1 アクタークラスの派生クラスの作成
サンプルコードを見ると、MyNewActorと名付けられているので同じにします。
出来ました。がエラーが凄い事になっています。ビルドしたらエラーが出ました。
.vs、Binaries、Intermediate、Saved、そしてCh2.slnを消してもう一度作り直しました。
今度はビルドが成功しました。
では教科書の指示通りに以下に示すコードを使用してHello Worldを表示させましょう。
GEngineがエラーに成ってしまいました。
を追加しますがエラーはそのままです。
あれ?しばらくしたらエラーが消えていました。
ビルドしても
普通に成功します。
作成したactorをレベルに追加します。
Playを実行すると
Hello World! が表示されました。
教科書の方ではplay画面だけでなくLogの画面でもHello World!は表示されるとありますが私のプロジェクトでは表示されませんでした。バージョンが違うからでしょうか?
Step.2 BPの作成
教科書の指示に従って以下のBPのノードを作成しました。
MyPrintString変数のデフォルト値に、
を追加します。教科書の説明ではMyPrintString変数を作成したら自然にDetailのデフォルト卵に文字が書き込めると書かれていましたがコンパイルをしないと書き込めないです。これは常識ですが初心者はこんな所でも結構躓きますよね。この辺がこの教科書の評価が最低になってしまっている理由だと思います。
出来ました。
Step.3 前に作成したC++クラスからBPを作成
作りました。
勿論作成したBPをレベル内に配置すればHello World!をプリントします。
この辺は当たり前すぎて正直、復習にすらならないですね。
Step.4 DataTableを使用してSpreadsheetをインポート
やっと、新しい事をします。これはやった事ないです。
まず教科書の表を以下に示すようにエクセルで作成しました。
CSVフォーマットで保存します。教科書によるとこのデータテーブルをUE4のプロジェクトにインポートする前にそのための構造体を作成する必要があるそうです。のでその構造体を作成します。
Step.5 データテーブルの構造体の作成
以下に示すように作成しました。
ビルトも成功しました。
教科書には変数名とエクセルの行の名前が同じと説明されていたので、一応名前を直しておきました。
そしてエクセルのデータをインポートします。
エラーに成ってしまいました。OutputLogを見ても理由が不明です。
このサイトに理由が載っていました。CSVファイルをインポートするためにはそのファイルを開いているソフトウェアを閉じてからする必要があるそうです。
エクセルを閉じてもう一度、インポートしたら出来ました。
Step.5 スプレットシートのクエリー
教科書に書かれている通り、以下のコードをMyNewActorクラスに追加します。
ビルドします。
成功しました。
MyNewActorクラスから作成したBP、NewBluePrint1を開き、My New Actorにインポートしたデータテーブル、Ch2Dataを選択します。
NewBluePrint1をレベル内に配置してPlayを実行すると
がプリントされました。
<考察>
DataTable->FindRow()関数について少しだけ勉強してみます。
と変えたら、
とプリントされました。勿論TEXT(“3”)と変えた場合は、
でした。
ではSomeNumberにアクセスする場合はどうすればいいでしょうか。
関数名がFindRow()ですのでその列のSomeNumberにも既にアクセスしていると考えられます。それをどうやってLogで表示するかの問題と考えられますので、
これで試してみます。
出来ました。
<感想>
最後の部分は思ったより難しかったですがこんな感じでやって行こうと思います。