UE4の勉強記録

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

「Unreal Engine 4.xを使用してRPGを作成する」の足りない部分を作成する Inventory Systemの改善

<前文>

f:id:kazuhironagai77:20200112211024p:plain

2020年になってしまいました。UE4におけるRPGゲームの作成は一向に完成する気配を見せません。しかし拙い歩みの中から、ある程度の成果も確実に出て来ています。諦めずに頑張る事にします。去年の一番の成果は、UE4C++とブループリントの関係がかなりはっきりした事です。今までは、UE4C++の資料しか基本的に参考にしませんでしたが、UE4C++とブループリントの関係がはっきりしたので、今年からはブループリントの資料もガンガン参考にしようと思います。

突然ですが、センター試験の英語で9割ぐらいは取れるのに、実際の英語の会話は、全く聞き取れないし、こっちの言っている事は理解してもらえないと言う人が、速攻で帰国子女並みの会話力を手に入れる方法を最近思いつきましたので、メモ帳替わりですが、ここに書いておきます。

と言っても、そのまま説明しただけでは、信じてもらえないので、最初に何故、私がそれを気が付いたかについて、まず書きます。

私は、典型的な陰キャですので、普段は決して人前で自慢話などはしませんが、今回の話は、多少自慢的な部分もあります。しかし全体的にはみんなの役に立つ情報が入っているのでそのまま書きます。

長くアメリカに住んでいても、パーティでの会話が苦手な日本人は結構います。アメリカ人同士が何を言っているのかが分からないからです。これは日本でしか暮らしたことがない人にはびっくりする話かもしれませんが、アメリカ人が話してくる時は理解できるが、アメリカ人同士が会話している時は何を言っているのか分からないと言う日本人は結構います。

しかし、私は完璧に分かります。別にパーティの会話だけでなく、映画でも、ニュースでも、電話でも、何でもです。

でも最初から出来たわけではありません。アメリカで暮らして最初の2年間くらいは、授業は理解出来ても、アメリカ人同士の授業と関係のない会話は全く分かりませんでした。

ある日、ルームメートと遊びに来ていたアメリカ人が、アニメの話をしたんです。内容はもう忘れましたが、その瞬間の事は今でも覚えています。一字一句聞き取れたんです。そしてその瞬間、頭に電撃が走ったような衝撃がありました。その瞬間から別にアニメの話だけでなくて、アメリカ人同士の会話が全部聞き取れる様になりました。更に、夢も全部英語になりました。

そうすると、自分の英語でアメリカ人に通じていない部分がある事も分かりました。衝撃的でしたが、カタカナ語はほとんど理解されていなかったです。アメリカと言ったのでは全く理解されていませんでした。メーリカとかエァメーリカと言わないと通じてなかったのです。

ここで、はっきり言っておかないといけないのですが、カタカナ語は通じませんが、カタカナでも結構通じるんです。これは大きな違いです。

つまり、アメリカと言ったのでは全く通じませんが、メーリカとかエァメーリカと言えばカタカナ発音でも大体通じます。

カタカナ語は英語の発音を表したものではありません。むしろ英語の実際の発音とは全く違うものです。これを英語の発音に近いと思っていると実際の会話でアメリカ人の言っている事が全く聞き取れないし、向こうもこっちの言っている事が全く分かりません。でもカタカナは違います。英語をカタカナでしゃべったり聞いたりするだけでかなり通じます。

ここからが役に立つ所です。

センター試験の英語で9割ぐらいは取れるのに、実際の英語の会話は、全く聞き取れないし、こっちの言っている事は理解してもらえないと言う人が、速攻で帰国子女並みの会話力を手に入れる方法です。

全てのカタカナ語の基の単語の発音をカタカナで覚え直してみて下さい。ネットで調べれば正しい発音はすぐに見つかるはずです。これやるだけで、ぶっちぎりで英語のリスニング力とスピーキング力が上がるはずです。映画とかニュースなんか滅茶苦茶聞き取れるようになると思います。電話も簡単に対応できるようになるはずです。体感ですが、85%ぐらいは理解出来るはずです。

次に英語吹き替えの日本のアニメを見まくるんです。日本語と英語は全く違う言語です。単純な単語ですら、1対1の対応をしているのは稀です。抽象的な概念ならなおさらです。日系人やハーフの人でバイリンガルな人と会話する時、私は必ず頑張る、えらい、悔しいの英語訳を聞くんですが、みんな全然違う事を言います。ないんです。一対一で対応する言葉が。しかし最近の英語吹き替えの日本のアニメには絶妙な対訳がされています。これが日本人にとって真の英語と日本語のかけ橋になります。日本人には常識でもアメリカ人が知らない事はいっぱいあります。逆もしかりです。日本で飯を食べる時は、頂きますと言いますが、英語でそれに当たる言葉はありません。英語吹き替えの日本のアニメは何て言っているんでしょうか?

私のお勧めは、鋼の錬金術師brotherhood, Hunter x Hunter, Naruto, One pieceそして進撃の巨人です。これらの作品はコアなファンがいてかなり優れた英語吹き替えが付いています。だたしドラゴンボールの古いバージョンだけは見てはいけません。訳が滅茶苦茶です。はっきり言って上達の邪魔になります。ポケモンはかなり子供向けですので、大人が見るとちょっと物足りないと思います。

これらの作品の英語吹き替えを問題なく理解出来る様になったらちょっと上級の内容へ移ればいいです。もっとアニメが見たければDeath noteなどがありますし、洋ドラマをNetflixで見るのもお勧めです。

これだけです。これだけで、帰国子女並みかそれ以上の会話力を手に入れる事が出来ます。

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

<本文>

Inventory Systemの残り

f:id:kazuhironagai77:20200112211232p:plain

この部分をもう一度試します。

f:id:kazuhironagai77:20200112211250p:plain

OpenChestのActionMappingをOにしました。

更にPrintStringを追加して、まずOpenChestが発動してるか確認します。

f:id:kazuhironagai77:20200112211308p:plain

テストしてみます。

f:id:kazuhironagai77:20200112211325p:plain

OpenChestはOを押す事で発動してますね。

それではChest前で試してみます。

出来ませんね。

f:id:kazuhironagai77:20200112211359p:plain

ここでCast Failedになってしまいますね。

まあ、いいですわ。今日やりたい事は別にあるので、今回はここまでにします。

Inventory Systemのバグの直し

先週、道具袋に入っている回復薬を使用すると、

f:id:kazuhironagai77:20200112211423p:plain

というバグを発見しました。これを直します。

Itemブループリント内の以下に示す部分でField Playerの変数であるArrayItemにアクセスして使用した道具を消去する必要があるみたいです。

f:id:kazuhironagai77:20200112211446p:plain

以下に示すように変えてみました。

f:id:kazuhironagai77:20200112211505p:plain

最初は、Removeでアイテムを消そうとしたのですが、同じ名前のアイテムを全部消してしますので、FINDで同じ名前のアイテムの最初のindexを探してそのIndexを持つアイテムを消す様にしました。

テストします。

回復薬3個あります。

f:id:kazuhironagai77:20200112211527p:plain

一個使用します。

そして   pause画面を閉じます。

f:id:kazuhironagai77:20200112211546p:plain

もう一度道具袋画面を開きます。

f:id:kazuhironagai77:20200112211605p:plain

一個だけ回復薬が減っています。成功ですね。

もう少しテストしてみます。

f:id:kazuhironagai77:20200112211625p:plain

今度は、回復薬を3個、イーサーを2個買いました。

そして回復薬を2個、イーサーを1個使用します。

f:id:kazuhironagai77:20200112211651p:plain

一回道具袋を閉じてから、もう一度、道具袋を開きます。

f:id:kazuhironagai77:20200112211731p:plain
あれ、イーサーだけに成ってしまいました。

原因は以下に示すFindノードが0しか返さないためみたいです。

f:id:kazuhironagai77:20200112211750p:plain

うーん。どうやらFINDは同じオブジェクトを見つけるみたいです。回復薬でもイーサーでもテキストのインスタンスなので常に0を返すみたいです。

f:id:kazuhironagai77:20200112211813p:plain

こんな感じに作り替えてみました。これならテキストに書かれている名前をArrayItemから見つけて消すはずです。

テストしてみます。

f:id:kazuhironagai77:20200112211838p:plain

前と同じ様に回復薬を3個、イーサーを2個買いました。

そして回復薬を2個、イーサーを1個使用します。

f:id:kazuhironagai77:20200112211900p:plain

一回道具袋を閉じてから、もう一度、道具袋を開きます。

f:id:kazuhironagai77:20200112211930p:plain

今度は出来ているみたいですね。

私みたいなタイプは論理的に完璧だからテストして確認する必要はなし!と確信してあんまりテストしないですが、よくない癖です。ここはある意味バカになってテストしまくりましょう。

まず、道具を以下のように購入した場合のテストです。

f:id:kazuhironagai77:20200112212002p:plain

4つほどテストしました。

f:id:kazuhironagai77:20200112212023p:plain

もう飽きてしまいました。このテストは時間がある時にやります。

まだ、テストは不十分ですが、一応バグは直せました。

Inventory Systemの作成方法

Building an RPG with Unreal 4.x  でInventory Systemの作成方法を学びましたが、RPGにおいてInventory Systemとは道具袋の作成方法であるわけです。

しかしRPGにおける道具と言う概念を私は良く分かっていませんでした。まあ、あんまりゲームしないんで具体的なイメージが沸かなかったんです。

ここに来てやっと道具とは何かが掴めました。道具とは以下の要素で構成される物だったんです。

  • 名前
  • 効用
  • 値段

ここに書かれている要素は最低限の条件です。更に、イメージや解説、重量を追加する事も可能ですし、効能は具体的にHPやMPの回復になります。

しかしこれって、中学生ぐらいの時に、誰でも一度くらい落書き帳に書く、僕の考えた〇〇と同じですよね。

f:id:kazuhironagai77:20200112212057p:plain

この落書きレベルのアイデアが実は実際のゲームのプログラミングにおいても基礎に成っていたんですね。正直驚きです。さらに驚きなのがこれがオブジェクト指向プログラミングの考え方そのものだって事ですね。

「下手な考え休むに似たり」は珍しく対義語が見当たらない諺で、それはつまり誰もが正しいと思っている証拠なのですが、下手でない考えとは何なのかを定義していません。

それなのに中学生ぐらいの時に、誰でも一度くらい落書き帳に書く、僕の考えた〇〇は下手な考えの最たるものと勝手に思い込んでしまいました。それがInventory Systemの作成の基礎に成っているとは。

こんな事は思いつかないです。

思いつかないと言えば、ターン制の戦闘のプログラミングの書き方も思いつかなかったです。決断、戦闘、勝利、ゲームオーバーの4つの状態に分類する事で、Switchを使用してそれぞれの状態に必要な行動を実行する。

これも当たり前過ぎて、こんな単純な方法で最新のゲームは作成されているはずがないと勝手に思い込んでいました。

偏見や先入観でアイデアを過小評価する事は人の勝手かもしれませんが、そのためにそのアイデアを基礎にして発展させる事をしないでその結果、物として具現化する事が出来ずに、その物が持つ機能を得る事が出来ない結果になってしまうのは恐ろしい事です。

私はゲームにおける道具を理解する事が、道具が、名前、効用、そして値段によって構成される概念であると言う事実が、あまりに幼稚な発想に思えてなかなか受け入れる事が出来ませんでした。その結果、自分で独自にInventory Systemのアルゴリズムを作成する事が出来なくなってしまいました。

これは良くなかったですね。アイデアは幼稚かも知れないですが、偉大な機能を持つ物として具現化するための基礎に成り得る可能性がある宝でもある。と認識すべきでしたね。

別に意識したわけではありませんが、今年最初のブログは、何か新年最初のブログに相応しい内容になっていますね。今年の目標的な。

今年の目標として、一応まとめときますか。

イデアは幼稚かも知れないが、偉大な機能を持つ物として具現化するための基礎に成り得る可能性がある宝でもある。思いついたアイデアはどんなに下らないと思ってもメモに残しておく。

New year’s resolutionと言うやつですね。

Building an RPG with Unreal 4.x における道具の作成

Building an RPG with Unreal 4.xでは、道具はFTableRowBaseを使用して作成されています。具体的には、

UE4C++を使用してFTableRowBaseを継承したUStructを作成します。

このUStructはFItemDataと名付けられ以下に示す変数を保持します。

f:id:kazuhironagai77:20200112212138p:plain

このItemData構造体を元にItems_Shopをブループリントで作成します。

f:id:kazuhironagai77:20200112212208p:plain

Items_Shopを開くとFItemDataが保持している変数が以下に示すように現れますので、

f:id:kazuhironagai77:20200112212226p:plain

+を押して新しいアイテムを作成する事が可能になります。新しいアイテムの効果をそれぞれの変数に対して指定する事がここで出来ます。以下に回復薬の場合の例を示します。

f:id:kazuhironagai77:20200112212246p:plain

うーん。なるほど。色々考えさせられますね。この作成方法は。

まず言える事は、ゲームバランスの調整がプログラミングのコンパイルを必要としないようにするのは大原則ですが、UE4ではBP内のデータの値を調節するだけで道具の効果を調節出来るように設計されていますね。

しかしその最新のゲームプログラミングも道具の概念を構成する要素で表すと言う、一見幼稚とも言えるアイデアから発展して作成されています。

さらにここでSTRUCTを使用しているのも、ポイントです。私散々、クラスには人のイメージが重なるが、構造体には人のイメージはないと言ってますが、道具は人ではありませんし、構造体を使用するのに相応しいと思います。

ついでに先週勉強したInventory Systemも見てみます。

Inventory Systemにおける道具の作成

Inventory systemは以下に示すように、EnumであるEItemとData TableであるDT_Itemsを使用して作成しています。

f:id:kazuhironagai77:20200112212319p:plain

f:id:kazuhironagai77:20200112212325p:plain

更に、DT_Itemsは、

f:id:kazuhironagai77:20200112212344p:plain

を使用して作成されています。

まず、EItemsで道具の名前を指定します。

f:id:kazuhironagai77:20200112212402p:plain

次に、DT_Itemsで、その道具の効果などを指定します。

f:id:kazuhironagai77:20200112212421p:plain

Inventory Systemはブループリントのみで作成されていますので、どうやってData Tableの要素を決定しているのかと思ったら、Structブループリントで指定していました。

f:id:kazuhironagai77:20200112212443p:plain

うーん。こっちは更に本格的ですね。ここにTexture2DクラスとMaterialInstanceクラスが使用されているのが興味深いです。これらを使用する事で2Dのイメージや3Dのモデルも表示できるようになるからです。

ただし、基本は、Building an RPG with Unreal 4.xと同じです。

  • ゲームバランスの調整がプログラミングのコンパイルを必要としないようにする。
  • 道具の概念を構成する要素で表すと言う、一見幼稚とも言えるアイデアから発展して作成されている。

は厳しく守られています。

まとめと感想

今週は、去年やったバグだしからInventory Systemのバグを直しました。更に、Inventory systemの中心に位置する道具について考察しました。最後にその道具をどのようにプログラミングに落とすのかについて2つの例を勉強しました。

特に、新年初めだから何かをする予定はなかったのですが、今年の目標として、

  • イデアは幼稚に見えても必ずメモする。

を定めました。