UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する 戦闘システムを完成する2

f:id:kazuhironagai77:20201122221405p:plain

<前文>

日本語の「は」と「が」の違いをアメリカ人に説明する

今の若いアメリカ人は日本のアニメが大好きですが、アニメを見ているとどうしても日本語を勉強したくなるそうです。しかしアメリカにも老害と言われる人達が居て「アニメを見ても日本語は学べない。」とアニメ好きな若者に説教するんです。この説教はどう考えてもウソです。だって日本人だってハリウッド映画を見て英語の勉強するじゃないですか。だからアニメを見て日本語の勉強は出来ます。と言うか、ある部分の日本語はアニメで勉強する必要があります。

こういう嘘が問題なのは、日本語を勉強したての初心者には親切なアドバイスに見えるし、日本語を勉強している中級者には嘘と分かっても論破出来ないところです。

そこで思いついたのですが、アニメ好きなアメリカ人に、日本語ネイティブがしている日本語の「は」と「が」の区別方法を教えてあげるのはどうでしょうか。

10年以上日本語を勉強しているアメリカ人でも「は」と「が」の違いが分からない人は結構います。と言うかほとんど全ての日本語学習者が分かっていません。「先生は「アニメを見ても日本語は学べない。」と仰っていますが、先生の日本語の「は」と「が」の使い方間違っていますよ。」と言えるようになれば「アニメを見ても日本語は学べない。」のような嘘に騙される事もありませんし、その先の日本語の勉強にも弾みがつくし自信にもつながります。

日本語ネイティブが「は」と「が」の選択する時に考えているのはたった一つの事だけです。

後ろが大切な時は「は」、前が大切な時は「が」を使用します。

例えば” Charizard is a dragon.”と言う文があった時、

の二つの訳が考えられます。この文でドラゴンが大切な時(つまり後ろが大切な時)は「は」が正解になります。ほとんどの文は大切な事は最後に述べるので「は」の使用頻度は「が」よりかなり多いはずです。稀にリザードンが大切な時(つまり前が大切な時)もあります。その時は「が」が正解になります。

先程の例文に対して

“Charizard is not a dragon.”と返答した場合は”not a dragon”の部分が大切になります。ので「は」が正解になります。「リザードンドラゴンではない。」が正解で「リザードンドラゴンではない。」といったら日本人にとって可笑しな文に聞こえます。

“Dragonite is a dragon”と更に前の返答に追加した場合は”dragonite”の部分が大切になります。だから「カイリュウドラゴン」が正解になります。しかしこの場合は「”is a dragon”の部分の方が大切。」と考える事も出来て、その場合は「カイリュウドラゴン」でも正解になります。

これを今度、アニメが好きなアメリカ人にあったら教えてあげる事にします。

それでは今週の勉強を始めます。

<本文>

今週も先週の続きをやって行きます。

  • UE4C++GameModeBaseクラスでBeginPlay()関数をoverrideするとBPEvent BeginPlayが使用出来なくなる件について調べます。先週やり残した部分です。
  • 今の戦闘システムを見直して問題点やバグを探しまとめます。
  • その内のいくつかを直します。

それではやって行きます。

1.UE4C++GameModeBaseクラスでBeginPlay()関数をoverrideするとBPEvent BeginPlayが使用出来なくなる件

どうせなんで、4.26で新しいprojectを作成してそこで実験してみます。

TestGameModeを作成しました。そこにMyGameModeをUE4C++で作成します。

f:id:kazuhironagai77:20201122221531p:plain

そこから派生したBPクラス、MyGameModeBPを作成します。

f:id:kazuhironagai77:20201122221846p:plain

MyGameModeBPをこのマップのGameMode Overrideにセットします。

f:id:kazuhironagai77:20201122221934p:plain

この状態で、EventBeginPlayにPrintStringを実装します。

f:id:kazuhironagai77:20201122222005p:plain

テストします。

f:id:kazuhironagai77:20201122222032p:plain

普通にBeginPlayのeventは発動して、helloをprint しました。

次にUE4C++のMyGameModeクラスでBeginPlay()関数をoverrideします。

f:id:kazuhironagai77:20201122222101p:plain

f:id:kazuhironagai77:20201122222108p:plain

この状態でテストします。

f:id:kazuhironagai77:20201122222126p:plain

今度は何も表示されなくなりました。今のCh4_3と同じ状態が再現出来ました。

ここから本題なんですが、UFUNCTION()+何かのSpecifierでBPのBeginPlay()関数も動かせないのかなと思っています。

今のCh4_3の状態ではUE4C++の方のBeginPlay()関数を外す訳にはいかないんです。しかしBP側のEventBeginPlay()関数も使用したいんです。その方法を探したい訳です。

このサイトをみると

f:id:kazuhironagai77:20201122222204p:plain

位ですか。可能性がありそうなのは。

その前に一応、UE4C++のMyGameModeクラスのBeginPlay()関数が実行されているか確認します。

f:id:kazuhironagai77:20201122222224p:plain

別にUE_LOGでも良かったんですが、BPでいつもPrintStringを使用しているのでUE4C++でもPrintString()を使用してみました。

f:id:kazuhironagai77:20201122222254p:plain

はい。動いています。確認出来ました。

これで試してみます。

f:id:kazuhironagai77:20201122222330p:plain

エラーになりました。

f:id:kazuhironagai77:20201122222359p:plain

では、source fileの実装はcomment outします。

f:id:kazuhironagai77:20201122222418p:plain

今度はビルド出来ました。

しかし何も表示されません。

f:id:kazuhironagai77:20201122222438p:plain

このBeginPlay()関数は呼ばれていないみたいです。

f:id:kazuhironagai77:20201122222500p:plain

別のBeginPlay()関数が出来ていました。それにHello2をPrintさせてみます。

f:id:kazuhironagai77:20201122222524p:plain

やっぱりこっちの関数だけがBPで実行されているようですね。

f:id:kazuhironagai77:20201122222543p:plain

段々分かって来ました。SuperをUE4C++のBeginPlay()関数に追加すれば良いです。

f:id:kazuhironagai77:20201122222604p:plain

試してみます。

f:id:kazuhironagai77:20201122222626p:plain

はい。出来ました。最初にBPで実装した

f:id:kazuhironagai77:20201122222643p:plain

が実行されその後で、UE4C++で実装されたBeginPlay()が実行されています。

出来ました。

2. 今の戦闘システムを見直して問題点やバグを探しまとめます。

2.1 戦闘シーンを復習する

2.1.1 戦闘マップへの移動

f:id:kazuhironagai77:20201122222727p:plain

キーボードのIを押すと戦闘マップに飛びます。

2.1.2 戦闘開始前

f:id:kazuhironagai77:20201122222749p:plain

カーソルが表示されますが「読みましたボタン」は押せません。一回画面をクリックする必要があります。その後で「読みましたボタン」を押せるようになります。

カーソルが表示されたらボタンが押せるようにした方が良いと思いますがどう直せばいいのか分かりません。

コメント欄の文字はタイプライター効果で一文字ずつ表示された方が読みやすいですね。そして全部表示された後で「読みましたボタン」が表示されると、更に分かり易くなりますね。

「読みましたボタン」を押します。

2.1.3アクションの選択

f:id:kazuhironagai77:20201122222825p:plain

コメント欄には、攻撃、魔法、道具そして逃げるから一つを選択して下さい。とありますが、攻撃と逃げるしか表示されていません。

後、コメントの文字が全て表示される前に既に攻撃ボタンと逃げるボタンが表示されています。

攻撃を選択しました。

2.1.4 対象の選択

f:id:kazuhironagai77:20201122222851p:plain

攻撃対象のゴブリンが表示されました。コメント欄には「あなたは“攻撃”そして…」と文の途中まで表示されています。これは分かりやすいと思います。

ゴブリンを選択します。

2.1.5 今まで選択した内容がコメント欄に表示される

f:id:kazuhironagai77:20201122222916p:plain

コメント欄に「あなたは“攻撃”そして“ゴブリン”を選択しました。“KUMO”は次の行動を決定しました。」と表示されました。

この辺は、後で変更出来ると更に親切かもしれませんね。まあ出来なくても及第点でしょう。

「読みましたボタン」を押します。

2.1.6 モンスターのターン

f:id:kazuhironagai77:20201122222938p:plain

コメント欄に「“ゴブリン”は次の行動を考えています。」「“ゴブリン”は次の行動を決定しました。」と表示されます。

されますが実際には何も考えていません。攻撃するだけです。この部分をAIに連結させて、モンスターも攻撃、魔法、道具、そして逃げるの選択を出来るようにしたいです。

「読みましたボタン」を押します。

2.1.7 ユーザーの行動1(操作するキャラのアニメーション表示

f:id:kazuhironagai77:20201122223002p:plain

カメラの位置が変わり、ユーザーが操作するキャラを写します。カメラはキャラが攻撃するアニメーションを写します。

2.1.8ユーザーの行動2(結果の表示)

f:id:kazuhironagai77:20201122223022p:plain

コメント欄には「“KUMO”は決定した行動を実行しました。」「“KUMO”がゴブリンを攻撃しました。」「“ゴブリン”は30のダメ―ジを受けました。」「“KUMO”は行動の実行を終了しました。」と表示されました。

ゴブリンにdouble quotation が付いていないのが一つありますね。

「読みましたボタン」を押します。

2.1.9 モンスターの行動1(アニメーション)

f:id:kazuhironagai77:20201122223043p:plain

今度はカメラがモンスターを写します。そして攻撃用アニメーションを表示しました。こっちは、ウィジェットは消えていません。こっちの方がカッコイイです。

コメント欄には「“ゴブリン”は決定した行動を実行しました。」「“KUMO”は10のダメ―ジを受けました。」と表示されました。

ユーザーの操作するキャラには、「“KUMO”がゴブリンを攻撃しました。」のコメントがありますが、モンスターにはありません。

これはモンスターが攻撃するだけだからでしょう。

直す必要がある部分ですね。

2.1.10 モンスターの行動2(結果の表示)

f:id:kazuhironagai77:20201122223114p:plain

アニメーションが終わると元の画面に戻ります。

コメント欄には「“ゴブリン”は行動の実行を終了しました。」と表示されました。

2.1.11 戦闘の繰り返し

上の攻撃を3~4回ほど繰り返した後、敵のモンスターのHPが0以下になりました。

2.1.12 戦闘の終了

f:id:kazuhironagai77:20201122223143p:plain

コメント欄には「“KUMO”は勝利しました。」と表示されました。

ここでレベルが上がっていますが、コメント欄には何のコメントも表示されていません。これは直す必要があります。

「読みましたボタン」を押します。

2.1.13 勝利のアニメーション

f:id:kazuhironagai77:20201122223202p:plain

ユーザーが操作するキャラが勝利のポーズを取ります。カメラは後ろから写したままです。カメラの位置は変えるべきですね。

モンスターは倒されているのにその場に立っています。死んだときのアニメーションを追加すべきですね。

2.1.14  戦闘が終わってから元のマップに戻るまで

f:id:kazuhironagai77:20201122223223p:plain

戦闘は終わりました。Iボタンを押すと元のマップに戻れるはずです。

2.1.15  元のマップに戻る

戻って来ました。

f:id:kazuhironagai77:20201122223247p:plain

2.2 戦闘シーン毎の復習

前節で分けたそれぞれの戦闘シーン毎の分析を行っていきます。以下にまとめたように、目的、やっている事、改善点、バグ、そしてその他の5つの観点から分析します。

  • 目的: そのシーンでやりたい事を示します。
  • やっている事: 実際にそのシーンでやっている事を示します。
  • 改善点: 具体的にどこを直すのかを示します。
  • バグ: そのシーンでのバグを指摘します。
  • その他: 上記4点以外で指摘する必要がある事を書いておきます。

2.2.1 戦闘マップへの移動

目的:戦闘マップへの移動

やっている事:Iボタンを押す事で、戦闘マップへの移動

改善点:

  • 普段のマップでモンスターに捕まったら戦闘マップへ移動するようにする。
  • 捕まったモンスターによって戦うモンスターが変わるようにする。
  • キャラとモンスターの登場シーンをアニメーション化すべき。

バグ:

戦闘マップでの登場シーンで、キャラとモンスターが空から落ちてくる時、と来ない時がある。落ちてこない時は画面に引っかかって登場している。

f:id:kazuhironagai77:20201122223357p:plain

画面に引っかかって登場している時は、見た目も変だし不快に感じる。

その他:なし

2.2.2 戦闘開始前

目的:戦闘が開始した事をユーザーに知らせます。ユーザーが戦闘が開始した事を確認します。「読みましたボタン」を押します。

やっている事:

コメント欄に「戦闘が開始しました。」を表示します。これは戦闘が開始した事をユーザーに知らせるためです。

f:id:kazuhironagai77:20201122223424p:plain

「読みましたボタン」を表示し、このボタンを押すまで次のシーンに移動しないようにしています。これはユーザーが戦闘が開始した事を理解しているかどうかの確認のためです。

f:id:kazuhironagai77:20201122223450p:plain

改善点:

  • 画面が切り替わった瞬間に、コメント欄に全文章が表示されるため、コメント欄の文章が読みにくいです。タイプライター効果を使用すべきです。
  • 最初から「読みましたボタン」が表示されています。ユーザーが文章を読み終えた後に、「読みましたボタン」は表示されるべきです。
  • 読みましたボタンのデザインをRPG風に直しましょう。
  • ユーザーが戦闘に参加している感が少ない気がします。カメラを少し揺らしてみるのはどうでしょうか?

バグ:

このシーンだけではないですが、新しいマップが開始するたびにカーソルが表示されゲーム画面をクリックする必要があります。ユーザーの予測不可能な行動を引き起こしやすく、直せるならば直ぐにでも直したいです。

その他:なし

2.2.3アクションの選択

目的:キャラの一ターン目に取る行動をユーザーが選択します。

やっている事:

  • コメント欄に攻撃、魔法、道具そして逃げるから一つを選択して下さい。と表示。
  • 選択ボタン、「攻撃」、「逃げる」を表示。(「魔法」、「道具」は使用可能時のみ表示される。)
  • ユーザーは選択ボタンから一個をクリックする。

f:id:kazuhironagai77:20201122223614p:plain

改善点:

  • コメントの文字が全て表示される前に既に「攻撃ボタン」と「逃げるボタン」が表示されています。それらのボタンは、ユーザーが文章を読み終えた後に表示されるべきです。
  • 枠で覆われた絵の中に「攻撃ボタン」と「逃げるボタン」が表示されていますが、何のグループをまとめたものか分かりずらいです。選択などの題を表示すべきです。
  • 「攻撃ボタン」と「逃げるボタン」の色がバックの絵の色とほぼ同じで見にくいかもしれません。

バグ:なし

その他:「攻撃」ボタンを選択しました。

2.2.4 対象の選択

目的:攻撃対象を選択します。

やっている事:

  • 攻撃対象である「ゴブリンボタン」が表示されました。

f:id:kazuhironagai77:20201122223703p:plain

  • コメント欄には「あなたは“攻撃”そして…」と文の途中まで表示されています

改善点:

  • 攻撃の種類がないため、攻撃方法の選択は省かれています。何らかの形で攻撃の種類も考えるべきかもしれません。素手ならパンチ、キックとかもありかもしれません。
  • 攻撃対象もゴブリンしかいません。アイテムの時の様に、自身のキャラも選べるようにすべきです。
  • 攻撃対象を選ぶ枠も何のグループを示しているのか不明です。題をつけましょう。
  • ここでもボタンのデザインは見にくいです。

バグ:特にないと思われます。

その他:ゴブリンを選択します。

2.2.5 今まで選択した内容がコメント欄に表示される

目的:ユーザーの選択した結果を表示して確認する

やっている事:

  • コメント欄に「あなたは“攻撃”そして“ゴブリン”を選択しました。“KUMO”は次の行動を決定しました。」と表示

f:id:kazuhironagai77:20201122223827p:plain

  • 「読みましたボタン」を表示

f:id:kazuhironagai77:20201122223907p:plain

改善点:

  • 確認するのが目的ならばユーザーが選択を変更出来る方法を用意すべきでは?
  • コメント欄の文「“KUMO”は次の行動を決定しました。」は「“KUMO”は貴方の選択に従って次の行動を決定しました。」の方が正確に今の事態を表しているのでは?

バグ:なし

その他:読みましたボタンを押しました。

2.2.6 モンスターのターン

目的:モンスターのターンです。モンスターがどんな行動をとるのかを決定します。

やっている事:

  • コメント欄に「“ゴブリン”は次の行動を考えています。」「“ゴブリン”は次の行動を決定しました。」と表示します。

f:id:kazuhironagai77:20201122224010p:plain

  • 「読みましたボタン」を表示します。

f:id:kazuhironagai77:20201122224043p:plain

改善点:モンスターのターンですが、モンスターは実際には何も考えていません。攻撃するだけです。この部分をAIに連結させてモンスターも攻撃、魔法、道具、そして逃げるの選択を出来るようにしたいです。

バグ:特にありません。

その他:「読みましたボタン」を押しました。

2.2.7 ユーザーの行動1(操作するキャラのアニメーション表示

目的:ユーザーが操作するキャラの攻撃アニメーションを表示します。

やっている事:

  • カメラの位置が変わり、ユーザーが操作するキャラを写します。
  • キャラは攻撃のモーションをします。

f:id:kazuhironagai77:20201122224136p:plain

改善点:ウィジェットは表示したままの方が見栄えがします。

バグ:なし

その他:なし

2.2.8ユーザーの行動2(結果の表示)

目的:ユーザーの操作するキャラがモンスターを攻撃した事とその結果どうなったかをコメント欄で報告

やっている事:

  • 「“KUMO”は決定した行動を実行しました。」「“KUMO”がゴブリンを攻撃しました。」と攻撃した事をコメント欄で報告
  • 「“ゴブリン”は30のダメ―ジを受けました。」その攻撃でゴブリンがダメージを負った事をコメント欄で報告
  • 「“KUMO”は行動の実行を終了しました。」と攻撃の終了をコメント欄で報告

f:id:kazuhironagai77:20201122224222p:plain

  • 「読みましたボタン」を表示

f:id:kazuhironagai77:20201122224249p:plain

改善点:特にないです。

バグ:ゴブリンにdouble quotation が付いていないのが一つあります。

その他:「読みましたボタン」を押しました

2.2.9 モンスターの行動1(アニメーションの表示)

目的:モンスターの攻撃アニメーションを表示

やっている事:

  • カメラがモンスターを写します。
  • モンスターが攻撃用モーションに従って動きます。こっちはウィジェットが残ったままです。

f:id:kazuhironagai77:20201122224321p:plain

  • コメント欄には「“ゴブリン”は決定した行動を実行しました。」「“KUMO”は10のダメ―ジを受けました。」と表示します。

f:id:kazuhironagai77:20201122224346p:plain

改善点:

  • ユーザーの操作するキャラには、「“KUMO”がゴブリンを攻撃しました。」のコメントがありますが、モンスターにはありません。これはモンスターが攻撃するだけだからでしょう。モンスターにも攻撃だけでなく、魔法やアイテムが使用出来るようにしたいです。
  • ここで、コメント欄には「“ゴブリン”は決定した行動を実行しました。」「“KUMO”は10のダメ―ジを受けました。」と表示するのが良いのか、画面が切り替わった後で、これらの内容を示すのが良いのかを考える必要があります。

バグ:なし

その他:アニメーションが終わるとカメラは元の位置に戻ります。

2.2.10 モンスターの行動2(結果の表示)

目的:モンスターが攻撃した事とその結果をコメント欄で報告します。

やっている事:

  • コメント欄に「“ゴブリン”は行動の実行を終了しました。」と表示します。

f:id:kazuhironagai77:20201122224427p:plain

  • 「読みましたボタン」を表示します。

f:id:kazuhironagai77:20201122224452p:plain

改善点:前節で述べた点と同じです。

バグ:なし

その他:「読みましたボタン」を押しました。

2.2.11 戦闘の繰り返し

目的:戦闘を繰り返します。

やっている事:

  • 上記の3~10を繰り返します。
  • 敵のモンスターのHPが0以下になりました。

f:id:kazuhironagai77:20201122224529p:plain

改善点:

  • HPが0以下で表示されるのはおかしいです。0にしましょう。
  • HPの後の:が文字と被っています。直しましょう。

バグ:なし

その他:なし

2.2.12 戦闘の終了

目的:戦闘の終了を報告します。

やっている事:

  • コメント欄には「“KUMO”は勝利しました。」と表示しました。

f:id:kazuhironagai77:20201122224619p:plain

  • 「読みましたボタン」を表示しました。

f:id:kazuhironagai77:20201122224649p:plain

改善点:実際は、ここでレベルが上がっています。しかしコメント欄にはレベルが上がった事に対して何のコメントも表示されていません。詳しくユーザーに報告するべきです。

f:id:kazuhironagai77:20201122224722p:plain

バグ:なし

その他:「読みましたボタン」を押しました。

2.2.13 勝利のアニメーション

目的:戦闘後のアニメーションを表示

やっている事:

  • ユーザーが操作するキャラが勝利のポーズを取ります。

f:id:kazuhironagai77:20201122224756p:plain

改善点:

  • カメラは後ろから写したままです。カメラの位置はユーザーのキャラを正面から写すべきでしょう。
  • モンスターは倒されているのにその場に立っています。死んだときのアニメーションを追加しましょう。

バグ:なし

その他:なし

2.2.14  戦闘が終わってから元のマップに戻るまで

今の戦闘システムでは、戦闘が終わっても以下に示したように戦闘マップにそのまま残っています。

f:id:kazuhironagai77:20201122224828p:plain

隠れステージにして、回りの像と会話出来るようにします。

目的:隠れステージ

やっている事:今はない

改善点:

  • 有る条件でこのステージに残れるようにする。
  • それぞれの像と会話出来るようにする。

バグ:なし

その他:キーボードのIを押して元のマップに戻ります。

2.2.15  元のマップに戻る

f:id:kazuhironagai77:20201122224859p:plain

今回は確認しませんが以下の点は後で調べる必要があります。

  • アイテムや装備品、金貨そしてキャラのパラメーターなどが、戦闘マップに行く前と変化していないか。
  • 戻った先にいたモンスターは消滅しているか?
  • モンスターを倒して得た財宝を持っているか?

2.3 今の戦闘システムの問題点やバグまとめ

かなり大変でしたが、今の戦闘システムの改善点を抽出出来たと思います。これらを直していきます。

3. 戦闘システムの改善点の内の幾つかを直します。

ハッキリ言って今週直すのはきついです。戦闘システムの改善点は来週以降直していきます。

今週は、先週紹介した大量のインスタンスをマップ内に表示する技術を使用して、戦闘マップに沢山の骸骨を表示しようと思います。

f:id:kazuhironagai77:20201122224953p:plain

3.1動画の勉強

半分位動画を見たら作り方が分かったのでTestGameModeで作成してみました。

Static mesh は1M_Cubeを使用して10000個ほど作成しました。一個一個のcubeに自転を加えて更にHierarchical Instanced Static Mesh にも回転を加えました。

f:id:kazuhironagai77:20201122225017p:plain

f:id:kazuhironagai77:20201122225029p:plain

Static meshを一個かませる事でもっと複雑で迫力のある回転が作成できました。

f:id:kazuhironagai77:20201122225054p:plain

f:id:kazuhironagai77:20201122225105p:plain

4.まとめと感想

今週は、先週改善した戦闘システムの問題点を洗い出すのに時間が取られて、ほとんどプログラミング出来ませんでした。