UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する Combat Engine自作の準備2

f:id:kazuhironagai77:20200426204616p:plain

<前文>

今週は、先週書き切れなかった事を書き残しておきます。

Tower of Godとか

遂に、韓国産の漫画(マンファと言うそうです。)に負ける日が来た。別にネトウヨと言うわけではありませんが、ショックがないと言えばウソになります。噂には聞いていたのですが実際にアニメが放映されるまでは「そんなにスゴイの?」位の感想しかありませんでした。進撃クラスのインパクトがあるんじゃないでしょうか?もう英語圏のアニメファンはこのアニメの話題で一色です。所でこの漫画Web Toonと言う携帯に特化した形式で描かれているそうです。

人に一生があるようにメディアにもコンテンツにも一生があるのでしょう。新しい時代には古いメディアは滅ぶ運命なのかも知れません。そう思ってWeb Toonをタブレットから読んでみたのですが、私にとっては単に読みにくいだけでした。更にビックリしたのがWeb Toonの作りです。こう言っては何ですが「こんなの一日で作れるんじゃね?」と言うくらいの簡単なサイトでした。これが時代を作るサイトなのか。と驚きです。ユーザーにとって本当に必要な物だけ残したデザインなんでしょうね。制作者はユーザーが本当に必要な物を完全に理解しているんでしょうね。

まあそれはともかくとして韓国勢に完敗しているのはアニメだけじゃないみたいです。ハイテク製品もそうですし、料理(ケジャン?が日本の若者の間で大人気らしいです。)やコロナ対策もです。来年以降、G7から日本が外されて韓国が代わりに入るとかも全然あり得ると思いました。

私見ですが、日本がこんなに負ける様になった一番の原因は会社のパワハラだと思います。衰退する会社は全部、仕事そっちのけで社内政治ばっかりしています。何でそんなに社内政治を頑張らないといけないのかと考えるとパワハラがあるからなんです。会社の業績を上げると評価される、下げると首にはならないまでも降格させられたり減給させられたりする。これが会社内の権力の基です。そしてその権力は究極的には全て社長に属し、会社を発展させるために使用されます。しかし上司がパワハラだと、部下は会社の業績を上げるよりもその上司のために働きます。パワハラと言う途轍もない賞罰を与える権限がその上司にはあるからです。これじゃ誰も会社のために働いたりはしませんよね。

私も今、作成しているゲームが商業的に成功して会社となったとしても、絶対にパワハラが発生出来ない会社にします。パワハラは会社の業績を悪くする原因ですし、何より会社内で私より権力を持つ事になりますから。

一言で語る

最近気が付いたんですが、一般的な人は全く関係のない人がしゃべっても一言だけは聞いてくれるみたいです。逆に言えば一言で説明出来なければ、人は無視すると言う事です。だからYouTubeのサムネなんかはその一言に物凄い労力を賭けるそうです。確かにサムネを見て何が言いたいのか分からない動画はクリックしませんね。

この一言に賭ける技術にこそ、これからの日本の未来がある気がします。欧米はプレゼンが全てです。しかし普通以下になった日本に沢山プレゼンする時間が与えられるとは思えません。だから一言に賭ける技術は日本が世界で戦うためにも必要になります。更に日本には俳句や川柳のように、短く要点をまとめて語る伝統があります。一言で説明するのは、日本人が得意とする所かもしれません。

〇〇ウィルスと言う人達へ

またC-何とかの話になりますが、結構重要な話なのでここに書く事にしました。

最近日本でも中国のC-何とかが発症したと言われる地名やあるいは中国そのものを、C-何とかの名称に使用する人達が出て来ましたが、本当にその行為がどんな結果をもたらすのか分かっているのでしょうか?

私の知る限り、その事について中国人は大激怒していますよ。もう完全に戦争コースです。

元々、この名称は、あるアメリカ人が中国にイチャモンを付けた時に、出てきた言葉でFo〇ニュースを通じて全米に広まりトランプ大統領まで使用するになった曰く付きの呼び名です。右派の連中は最初この感染症は風邪と同じと言っていて、途中で間違いに気付いて大慌てで対策に乗り出したのですが、右派が十何年もオバマ大統領が進めていた国民保健に反対していなければ、そもそもこんなに大変な事態に最初からならなかったと思うアメリカ人は大勢います。その責任を全て中国のせいにするために作成したのがこの名称です。なので中国人が大激怒している訳です。それだけでなくとも元々この右派の連中は有色人種を小馬鹿にするところがあってアジア系から嫌われていたのでとうとう堪忍袋の緒が切れたわけです。

あんまりにも中国人が激怒したので、最近は言い出した連中もあまり言わなくなりました。本当に戦争になると思ったからです。

以下にYouTubeに紹介されているC-何とか関連のニュースを示しますが、一個もそんな言い方をしているニュースはありません。

f:id:kazuhironagai77:20200426205035p:plain

所が、何を勘違いしたのか、日本でそういう言い方をする連中がネットや政界からぽつぽつと現れて来てます。日本の芸能人がこのウィルスが原因で亡くなった時、中国のせいで亡くなったと言う人達が突然出て来ましたが、直ぐに中国側は漁船を海上自衛隊の船にぶつけて日本側に警告しました。これは戦争行為だぞ。と言う警告です。これ分かっているんですかね。日本でC-何とかを〇〇ウィルスと言っている連中は。

戦争行為だと中国は言っているんですよ。

しかしそういう話は抜きにしても、病気に罹った弱い人を叩く発想自体が分かりません。

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

<本文>

1.先週の直し

先週、途中で止めたのは、エラーではないが原因不明の箇所が沢山出て来て、それを先に解決しないと後で困りそうと思ったからです。以下に先週出て来た原因不明の問題点を示します。

 1.キャラクターのジャンプ

 2.DefaultPawnClassについて

 3.Init()関数の呼び出し

 4. PureVirtualFunctionを呼び出している(おまけ?)

まず、これらを直していきます。

1.キャラクターのジャンプ

キャラクターのジャンプのアニメーションがスムーズじゃないです。上手くスクリーンショットが取れないので、ここに載せられないですが、突然、別の映像に切り替わる感じです。

突然、別の映像に切り替わる…。AnimationBPを直してみましょう。使用しているAnimationBPはMyThirdPersonAnimationBPでした。それのJUMPの所をみると以下のようになっていました。

f:id:kazuhironagai77:20200426205305p:plain

JumpStartからJumpLoopへの変化の条件を0.1から以下に示したように0.4に変更しました。

f:id:kazuhironagai77:20200426205331p:plain

0.4に設定するとジャンプのアニメーションがスムーズになります。0.3だと少しだけぎこちないです。

何かあっけないですけれどもこれで解決しました。

2.DefaultPawnClassについて

ゲームが開始してプレイヤーがコントロールするキャラクターの指定は、GameModeクラスのDefault Pawn Classで行っていると漠然と思っていました。この辺をしっかり理解します。

真っ白のThirdPersonテンプレートを作成してUE4C++のGameModeを見ると、

f:id:kazuhironagai77:20200426205401p:plain

となっています。そしてProject settingのDefault Modesには以下の様なセットになっています。

f:id:kazuhironagai77:20200426205419p:plain

ただし、Templateを全くいじらない状態、つまり最初に表示されるレベルのWorld SettingではGameModeは何もセットされていないようです。

f:id:kazuhironagai77:20200426205437p:plain

因みにそのままPlayをクリックしてゲームを開始してもWorld settingの設定は少なくとも表示は変化しません。

WorldOutlinerをみるとDefaultPawnTestGameModeが表示されています。

f:id:kazuhironagai77:20200426205456p:plain

選択してDetailをみると

f:id:kazuhironagai77:20200426205514p:plain

と表示されています。

後、レベルに配置されているThirdPersonCharcterを選択してDetailを表示させると、Pawnの項目に以下の表示がされています。

f:id:kazuhironagai77:20200426205534p:plain

昔、どこかで学習した事で記憶が曖昧ですが、このパラメーターとプレイヤーが操作するキャラに何か関係があったような気がします。

まず、基本的な情報を確認します。

公式のサイトのDefaultPawnClassの説明では、

f:id:kazuhironagai77:20200426205555p:plain

と説明されているだけでした。

ここの説明の方が具体的でした。

f:id:kazuhironagai77:20200426205616p:plain

Playボタンを押してゲームを開始するとUE4エディターが自動的にプレイヤーがコントロールするキャラを作成してくれます。あるキャラをプレイヤーが操作するキャラとして作成してほしいとの要望がある場合は、そのキャラをDefaultPawnClassに指定してください。と言う事みたいです。

となるとUE4C++とProject settingのどちらで指定しているのかが問題になると思います。

以下のようにUE4C++のDefaultPawnClassの設定をコメントアウトしてみます。

f:id:kazuhironagai77:20200426205645p:plain

ビルドして変化を確認します。

f:id:kazuhironagai77:20200426205703p:plain

ビルトは成功しました。

どこか変化した所はないかとまず、Project settingを確認したところ、以下に示すようになっていました。

f:id:kazuhironagai77:20200426205722p:plain

Default Pawn ClassにDefaultPawnがセットされています。以前は以下に示すようにThirdPersonCharacterがセットされていました。

f:id:kazuhironagai77:20200426205742p:plain

となるとどっちで指定してもいいのかもしれませんね。

この状態でプレイを押すと、エラーになるかと思ったのですが、普通に配置されているThirdPersonCharacterを動かせました。

f:id:kazuhironagai77:20200426205759p:plain

この配置されているThirdPersonCharacterがプレイヤーが操作するキャラに選ばれる理由は何でしょうか?

良く分かりませんので消してみます。

f:id:kazuhironagai77:20200426205819p:plain

この状態でplayしてみます。

f:id:kazuhironagai77:20200426205844p:plain

キャラクターがいない状態でplay出来ました。これらから推測すると配置されていたThirdPersonCharacterをプレイヤーが操作するキャラとして選択する何かあると考えられます。

次にThirdPersonCharacterをもう一度配置してみます。

f:id:kazuhironagai77:20200426205902p:plain

Playを押しても配置されたThirdPersonCharacterは操作出来ません。

f:id:kazuhironagai77:20200426205918p:plain

ああそうだ。と思い配置されたThirdPersonCharacter のAutoPossessPlayerをPlayer0にセットしました。

f:id:kazuhironagai77:20200426205939p:plain

Playボタンを押すと、今度は配置されたThirdPersonCharacterを操作出来るようになりました。

f:id:kazuhironagai77:20200426205957p:plain

大体分かって来ました。

今度は、UE4C++クラスのADefaultPawnTestCharacterクラスから派生したBP、BPTest1を作成します。ThirdPersonCharacterと全く同じなので、区別をつけるためにmeshをcubeに変更します。

f:id:kazuhironagai77:20200426210017p:plain

f:id:kazuhironagai77:20200426210028p:plain

これをUE4C++からDefaultPawnClassにセットします。

f:id:kazuhironagai77:20200426210047p:plain

更に、配置されたThirdPersonCharacter のAutoPossessPlayerはDisabledにセットします。

f:id:kazuhironagai77:20200426210105p:plain

ビルドします。

f:id:kazuhironagai77:20200426210125p:plain

まず、Project settingのDefault Pawn ClassにBPTest1がセットされていました。これは予想通りです。

Playを押します。

f:id:kazuhironagai77:20200426210140p:plain

BPTest1がplayerが操作するキャラに成りました。予想通りの結果になりました。

ここで、配置されているThirdPersonCharacterのAuto Process PlayerをPlayer0にセットしたらどうなるのでしょうか?

f:id:kazuhironagai77:20200426210201p:plain

どちらが優先されるのでしょうか?試してみます。

f:id:kazuhironagai77:20200426210219p:plain

配置されているThirdPersonChracterが優先されました。

大体理解出来ました。以下にまとめます。

プレイヤーがコントロールするキャラクターを決めるのは、そのレベル上に配置されているキャラのAuto Process PlayerとGameModeクラスのDefaultPawnClassの設定によって決められます。

レベル上に配置されているキャラのAuto Process PlayerがPlayer0にセットされていた場合、そのキャラがプレイヤーがコントロールするキャラクターになります。

セットされていない場合は、GameModeクラスのDefaultPawnClassの設定によって決められます。この場合、UE4C++で設定すればProject settingのDefault Pawn Classにも自動的にUE4C++と同じ設定でセットされます。

これだけ理解出来れば十分でしょう。

3. Init()関数の呼び出し

RPGGameInstanceクラスの関数init()が勝手に呼び出されている理由が分かりません。

f:id:kazuhironagai77:20200426210244p:plain

元々、GameInstanceクラスにある関数をoverrideしているのでしょうか?それならoverrideを追加していると思うんですが調べて見ます。

公式のGameInstanceの解説ページにしっかりとありました。

f:id:kazuhironagai77:20200426210323p:plain

と言う事はoverrideしていると言う事?

f:id:kazuhironagai77:20200426210340p:plain

本当にoverrideしているのか確認するために、overrideしてみます。

f:id:kazuhironagai77:20200426210400p:plain

普通にビルド出来ました。間違いないですね。Init()関数はGameInstanceクラスの関数でゲームが始まると必ず呼ばれます。その関数を単にoverrideしていたのが、RPGGameInstanceクラスの関数init()でした。のでゲームが始まったら呼ばれるのは当然でした。

何か先週は原因不明の途轍もない問題のような気がしていたのですが、一個一個きちんと原因を究明したら簡単に解決しました。

2.Enemy の作成の続き

先週、Enemyを作成している途中で中止したんので、続きをやっていきます。

教科書をみたらenemy classは作成するのですが、それがきちんと作成出来るかテストする前にCombat engineを作成していました。

テストしないで先に行ってもいいですが、せっかくですので簡単にEnemyが作成出来るかどうかのテストをします。

教科書のサンプルコードをみるとGameModeのTestCombat()関数内で作成されています。

f:id:kazuhironagai77:20200426210426p:plain

同じ個所で作成する事にします。

まずTestCombat()関数をGameModeクラス内に作成します。

f:id:kazuhironagai77:20200426210445p:plain

取りあえずTestCombat()関数がコマンドで呼べるか確認するためにUE_LOGだけ実装します。

f:id:kazuhironagai77:20200426210509p:plain

ビルドします。

f:id:kazuhironagai77:20200426210532p:plain

成功しました。

PlayしてCommandを入力すると

f:id:kazuhironagai77:20200426210610p:plain

しっかり存在してますね。

そして

f:id:kazuhironagai77:20200426210637p:plain

あれ?

TestCombat is calledが表示されない。

Command not recognizedだって。何でしょう。

うーん。

こんな説明ぐらいしかググっても見つかりませんでした。

f:id:kazuhironagai77:20200426210658p:plain

このサイトからです。

うーん。良く分かりません。

Currently being used.

あ。

Ach3GameModeに書いていました。使用していない方のGameModeに書いてました。

直します。

今度は、使用するGameModeクラス、RPGGameModeBaseクラス内に作成します。

f:id:kazuhironagai77:20200426210719p:plain

f:id:kazuhironagai77:20200426210726p:plain

f:id:kazuhironagai77:20200426210726p:plain

これでビルドします。

f:id:kazuhironagai77:20200426210751p:plain

成功したのでテストします。

f:id:kazuhironagai77:20200426210905p:plain

今度は成功しました。

うーん。ケアレスミスと言ってしまえばそうですが、

f:id:kazuhironagai77:20200426210923p:plain

このエラーが表示された時に、使用していないクラスにCommannd用の関数を書いてしまったと理解出来るかと言えば出来ないでしょうね。

こんな感じで実装しました。

f:id:kazuhironagai77:20200426210943p:plain

f:id:kazuhironagai77:20200426210951p:plain

これでTestCombat()関数が呼ばれたらGameCharacterクラスの関数CreateEnemyMonster()を使用してEmenyMonsterをGameCharacterクラスから作成するはずです。

以下のコードをレベルBP上に作成しました。

f:id:kazuhironagai77:20200426211016p:plain

これでEmenyMonsterがGameCharacterクラスから作成された場合、確認出来るはずです。出来ていれば作成されたモンスターの種族名を表示して、されていない場合はNo enemy createdと表示されるはずです。

テストします。

TestCombat()関数を呼ぶ前にIを押すと、

f:id:kazuhironagai77:20200426211035p:plain

EmenyMonsterはまだ作成されていませんので、No enemy createdと表示されました。

次にTestCombatと入力してからもう一度Iを押します。

f:id:kazuhironagai77:20200426211054p:plain

と表示されました。以下に示すようにデータテーブル、EnemyMonstersのS1はゴブリンです。

f:id:kazuhironagai77:20200426211117p:plain

EmenyMonsterはきちんと作成されたようですね。

EnemyModel の追加

本来ならば自作のコンバットエンジンの作成をここから始めても良いのですが、今週まではCombat Engine自作ための準備としたので、敵のモンスターでも配置します。

敵のモンスターの部分をどのように作ったのか忘れてしまったのでまず復習します。

私のブログのこの辺で敵のモンスターを作成しています。

軽く読み直してみたら、この辺は全部自作でした。今、コードを見直して見ると、何で敵のキャラの基をUE4C++で作成したのかといか色々疑問が残る作りになっていますが、せっかく自分で考えた方法なので今回も同じやり方で作成する事にします。

この時の私のブログは途中でAIの勉強に代わってしまっていますが、この時全くAIについて知らなかったので、何でUE4のAIはIF節で作成しているの?これってAIなのと疑問に思って勉強し始めたのでした。その辺が理解出来たら、すっかりAIの勉強に興味が無くなってしまい教科書もお蔵入りしてしまいました。まあそれは別にどうでもいいです。

まず、SkeltenCrew bundleをCh3に追加します。

f:id:kazuhironagai77:20200426211144p:plain

次にUE4C++内にCharacterクラスからMonsterCharacterクラスを作成します。

f:id:kazuhironagai77:20200426211202p:plain

このクラスにコードが追加された訳ではないのでこれでUEC++の方はお終いみたいです。

このクラスからBPを作成します。名前はMonsterCharacterBPです。

メッシュにSkelton_Swordmanを付加しました。

f:id:kazuhironagai77:20200426211224p:plain

f:id:kazuhironagai77:20200426211231p:plain

専用のアニメーションがないのでch2からインポートします。

f:id:kazuhironagai77:20200426211250p:plain

をインポートします。

全部はコピー出来ませんでした。と出て来ましたが、どうでしょうか。一応見た感じは全部インポート出来たような気がします。

Animationもセットしました。

f:id:kazuhironagai77:20200426211310p:plain

SpawnするためのコードをGameModeクラスのBeginPlay()関数に書いて行きます。

f:id:kazuhironagai77:20200426211329p:plain

f:id:kazuhironagai77:20200426211337p:plain

更にGameModeBPの方でMonsterToSpawnにMonsterCharacterBPをセットします。

f:id:kazuhironagai77:20200426211357p:plain

テストします。

f:id:kazuhironagai77:20200426211416p:plain

浮いている。

私の書いたブログを読み直すと、AIを搭載すれば自然と地面に着地するらしいのでこのままにしておきます。

もう少しやりたかったのですが、時間が無くなってしまったので今週はここで中止します。

3.まとめと感想

今週までは、自作のCombat engineを作成するための準備をしました。来週からCombat engineを作成していきます。