UE4の勉強記録

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

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

f:id:kazuhironagai77:20200209214832p:plain

<前文>

これからはゲームプログラミングだけでなくゲームデザインについても考えて行こうと思います。

今週は、キャラクターデザインについて考えてみました。といっても私はデザイナーではないので、実際のキャラクターをデザインする事は出来ませんがキャラクターのデザインの根本は理解出来たと考えています。

まず、キャラクターには以下の役割があると考えられます。

  • キャラクターはそのゲームが対象としているユーザーを表している。
  • キャラクターはそのゲームをしたいユーザーの客引きである
  • キャラクターはユーザーに解説する先生でもある。

いきなり、結論から書きましたが、キャラクターは上記の3つの役割を担当していると思われます。以下に解説します。

1.キャラクターはそのゲームが対象としているユーザーを表している。

あらゆる人は社会的、文化的に必ず何らかのグループに属しています。そしてこれはいけない事かもしれませんが、人は同じグループに属している人には優しく、違うグループに属している人には厳しく扱います。

良いキャラクターデザインは、そのキャラクターがどのグループに属しているのかがはっきり分かります。

ゲームだけに限らない一般的な例で考えてみました。

初音ミク

例えば、初音ミクです。ネットの文化に明るくアニメなどのサブカルチャーに詳しいグループに属している事を強烈に示しています。

アップル社のロゴ

ご存じアップル社のロゴです。齧られたリンゴをキャラクターと捉えると、アップル信者と言われる?ある特定の思想、哲学、ファッション、音楽を好むグループに属している事を示しています。

スラムダンク桜木花道

少年ジャンプで大人気だったバスケ漫画の主人公です。このキャラが、アニメが好きで夜中まで女の子のイラストを描いているようなグループに属していない事はパッと見ただけで分かります。

ゲームも同じと考えられます。ただし、私自身はゲームはしませんので、あくまで個人の意見です。

三國志シリーズ

コーエーテクモゲームスが発売している歴史シミュレーションゲームのシリーズだそうです。一見で歴史マニアや三国志好きなグループに属しているキャラと分かります。そういう人達向けのゲームである事もこのキャラから一目瞭然です。

FGO

FGOのイラストを見ると、正統なJRPGのように見えますが良く見るとキャラクターに女の子が多すぎます。JRPGをしているふりをして可愛い女の子のゲームで遊びたいグループが対象である事が分かります。後、異常なほどイラストが綺麗です。イラストを描くのが趣味の人達のグループに属しているのが分かります。

ポケモン

ポケモンのアニメからの一コマです。こちらは子供向けである事がはっきり分かるキャラになっています。イラストも上手ですが、FGOのイラストと比較すると手抜きに見えます。明らかにイラストを描く事を趣味にしている層を対象にはしていません。

このようにゲームのキャラクターはそのゲームが対象とするユーザーの属するグループと同じグループに属している事を強烈にアピールしています。ゲームのキャラクターを一見すればそのゲームが誰を購買層と見て作成しているのか簡単に分かります。

2.キャラクターはそのゲームをしたいユーザーの客引きである

親切そうなキャラクターが大切と言う事です。

例えば祭りの日に焼きそばが食べたくなって、目の前に焼きそばを売る二つの屋台があるとします。一つはサングラスをした強面のおじさんがブスッと立っています。もう一つは若いお姉さんが親切そうな笑みを浮かべて立っています。間違いなく若いお姉さんの方から焼きそばを買います。

ゲームにおけるキャラクターはこの客引きの役目を、望む望まないに関わらず担っていると思われます。

親切そうな見た目、もしくはかわいいキャラクターが大切です。

先程の例で言えば、強面のおじさんがブスッと立っていても、でっかいピカチュウのぬいぐるみが隣に置いて在ったらどうでしょうか?おじさんは見た目が怖そうなだけで、実は優しい人かもしれないと勝手に思って焼きそばを買う人が出てくるかもしれません。

3.キャラクターはユーザーに解説する先生でもある

最近は下火になったのですが、一時期、日本でmy name is …と言う言い方は「…でござる。」のようにアメリカ人には聞こえる。だからI am…と言うべきと信じられていました。

これ全く間違いなんですが、問題はもっと別な所にあって、それはI amが名前を言う時だけでなく、I am a doctorとか、I am 19 years oldと言う時も使うんで、アメリカ人が、名前だと認識出来ない事なんです。日本人がI am Suzuki Taroと言ってもそれがその人の名前であると思われる確率はかなり低く、ほとんどの場合、アメリカ人はSuzuki Taroって何、バイク?となって、ポカーンと成ります。だから要らぬ誤解を避けるために、自己紹介をする場合は必ずMy name isと言わなければならないんです。

で、日本に居る時は、私はいつもこの事を言っていたのですが、誰も聞いてくれないんです。ああそうですか。と口だけは返事しますが、顔を見れば納得していないのは明らかです。

所がです。同じ事を金髪のアニメキャラのイラストで言わしたら、みんな真剣に聞いている(読んでいる?)です。

幾ら設定上は金髪碧眼の白人だって絵じゃないですか?正直アホかと思いました。しかし現実はアニメのキャラの言っている事の方を日本人は信じるです。

この日本人のアホな信仰を本当に見事に利用したのが、漫画の美味しんぼです。初期の頃なんて架空のフランス人に日本料理を褒めさせて日本料理の権威を高めまくっています。このフランス人が存在するならば、まあ納得ですが、どう考えたってクサヤを美味しいなんて言うフランス人がいる訳ありません。

私なんか、半分以上美味しんぼの話を信じていて、フランス人がルームメートだった時に納豆食わして目の前で吐かれました。後から知ったのですがフランス人に限らず全ての西洋人にとって納豆の匂いはゴミ箱の腐った食べ物の匂いと同じで、その匂いを嗅いだだけで吐き気を催すくらい気持ち悪い匂いだったんです。

納豆ですらNGなのにそれ以上に臭いクサヤを食べようなんてフランス人がいる訳ないです。

しかしこれを騙されたと憤るのは間違っています。悪いのは絵を盲信している日本人の方です。我々はこの事実を最大限利用すべきなのです。

キャラクターのデザインはユーザーにとっての先生と言う立ち位置なれるデザインにすべきです。そうする事で、キャラクターはユーザーに解説すると言う、非常にマウントを取り易い地位を得る事が出来ます。

著作権について

今回、初めてゲームデザインについての考察をブログに書いたのですが、ゲームにおけるキャラクターについて述べたので、どうしてもそのキャラクターのイラストが必要になりました。

今までは引用する元はUE4の教科書がほとんどで、勿論著作者の権利を侵さないように最大の注意を払ってきました。しかし実際、アメリカ人が海外における著作権の侵害を訴えるためには、DMCAとか言う法律に基づいて、著作者の住所を著作を侵害していると思われる人に教える必要があるんです。これは嘘の著作権の侵害を訴える詐欺を防ぐために絶対必要なんですが、普通のアメリカ人にしたら海外の素性の分からない連中に自分の住所を教えるのは恐ろしいほどリスクが高いんです。のでよっぽどの事が無い限り、文句は言われないのも分かっていました。

しかし今回は日本のデザインを引用する必要があり、もう一度、著作権について調査しました。そしたら引用元をはっきり記入すればイラストの引用は問題ないとの結論に達したのですが、それならば何でWikipediaに一枚もアニメのイラストが引用されていないでしょうか。うーん。なんか危険な気がします。人生において危ない橋を渡らなければならない時はありますが、それが今回であるとは思えないので、アニメ、ゲーム関係のイラストは全て外しました。

<本文>

今週は、先週作成したInventory system内の装備欄のバグを直していきます。

  1. 同じ武器が何回も購入出来ます。
  2. ワープすると購入した装備品が消えてしまいます。
  3. 盾なのに武器に装備されている。
  4. 武器の名称がボタンに被っている場合がある。
  5. Healerの状態表示がそのまま残っています。
  6. 武器のイラストがない。
  7. 装備品の値段が分からない。
  8. 装備した時に今より何が強くなるのか不明。
  9. デザインの改善

先週、正しいinventory systemを作成するためにドラゴンクエスト5を見直してみると言いましたがやっていません。やる気が起きませんでした。今週は取りあえず上記のバグを直します。

1.同じ武器が何回も購入出来る

別に、これが悪い訳ではありませんが、武器を捨てたり売ったりまたは壊れたり出来ないのに、何個も購入出来るのは無駄です。装備していない武器は売れるようにします。

f:id:kazuhironagai77:20200209215200p:plain

まず、武器屋で売れる様にします。上の画面で売り物をクリックした時に、開くウィジェットを作成します。

f:id:kazuhironagai77:20200209215219p:plain

WeaponShopSellと名付けました。

f:id:kazuhironagai77:20200209215241p:plain

デザインは武器を買う画面とほぼ同じです。

f:id:kazuhironagai77:20200209215300p:plain

所有している装備品をScrollBox内に表示するようにブループリントでコードを書きます。

f:id:kazuhironagai77:20200209215319p:plain

短剣(小)を三本所有している状態でWeaponShopSellウィジェットを開いて見ました。見事に表示されています。

今度は、クリックするとクリックした武具が売れる様にします。

Weaponウィジェットにコードを追加します。

f:id:kazuhironagai77:20200209215344p:plain

細かい説明は省きますが、これでクリックした武具が売れた事になるはずです。

ここでは3つの事はしています。

  1. 売った武具の値段分所持金が増える。
  2. FieldPlayerの変数、ArrayWeaponsから売った武具の名前を一個消す。
  3. クリックした武具の名前が書かれたボタンをScrollBox内から消去する。

試してみます。短剣(小)を一振り売りました。

f:id:kazuhironagai77:20200209215404p:plain

三振りあった短剣(小)が二振りになっています。更に所持している硬貨が50に増えました。

一回武器屋から出てポーズ画面から装備品のウィジェットを開くと装備品の一覧でも、短剣(小)が二振りになっています。

f:id:kazuhironagai77:20200209215424p:plain

取りあえずはこれでOKとします。

だたし、今の状態では装備中の武具も売れてしまうので、所持していない武具を装備する事が可能です。

f:id:kazuhironagai77:20200209215452p:plain

このバグは後で直します。

更に素手を武具にしていますがこれもオカシイですね。装備を外すボタンの作成をする必要がありますね。これもバグとしておき、後で直します。

2.ワープすると購入した装備品が消えてしまう

これはアイテムの時にもあった問題でその時の解決方法をそのまま使用します。

まず、MyRPGGameInstanceBPに新しい変数、WeaponsDataを作成します。

f:id:kazuhironagai77:20200209215543p:plain

f:id:kazuhironagai77:20200209215551p:plain

FieldPlayerのeventGraphを開きます。

別なレベルにテレポートする前に、FieldPlayer内の変数、ArrayWeaponsのデータをMyRPGGameInstanceBPのWeaponsDataに移します。

f:id:kazuhironagai77:20200209215609p:plain

新しいレベルにテレポートした後で、FieldPlayerが作成される時にMyRPGGameInstanceBPのWeaponsDataをFieldPlayerのArrayWeaponsに移します。

テストします。

f:id:kazuhironagai77:20200209215628p:plain

今短剣(小)を三本持っています。

テレポートします。

f:id:kazuhironagai77:20200209215703p:plain

テレポートした後で、装備品を見ると、短剣(小)を三本持っています。

成功ですね。

f:id:kazuhironagai77:20200209215929p:plain

今、短剣(小)を装備しています。

テレポートします。

f:id:kazuhironagai77:20200209220013p:plain

テレポートした後は、短剣(小)は装備から外れてしまっています。しかし戦闘力はそのままです。新たなバグが発生しました。

これは今、直します。

パラパラとBPを見直すと、FieldPlayerの変数SoldierWeaponが装備している武器を管理している事が分かりました。

f:id:kazuhironagai77:20200209220037p:plain

f:id:kazuhironagai77:20200209220043p:plain

このデータをレベルが変わった時に保持するためにMyRPGGameInstanceBPに変数SoldierWeaponDataを作成します。

f:id:kazuhironagai77:20200209220103p:plain

レベルが変更する時に、FieldPlayerのSoldierWeaponのデータをMyRPGGameInstanceBPのSoldierWeaponDataにパスします。

f:id:kazuhironagai77:20200209220123p:plain

新しいレベルに移った時に、FieldPlayerは新しく作成されます。その時にFieldPlayerのSoldierWeaponのデータをMyRPGGameInstanceBPのSoldierWeaponDataからコピーします。

f:id:kazuhironagai77:20200209220158p:plain

これで、完成です。

テストしてみます。

f:id:kazuhironagai77:20200209220214p:plain

短剣(大)を装備しています。

ワープします。

f:id:kazuhironagai77:20200209220230p:plain

ワープした後も短剣(大)を装備しています。

素手に装備しても戦闘力は減りません。

f:id:kazuhironagai77:20200209220248p:plain

これを直します。

ATKの値を管理している箇所がFieldPlayerのBP内にある

f:id:kazuhironagai77:20200209220310p:plain

C++のGameCharacterクラス内の

f:id:kazuhironagai77:20200209220325p:plain

があり、どちらがどのように管理しているのか完全は理解出来なかったのですが、

MyRPGGameInstanceBP内に、FieldPlayerのSoldierbaseAtk変数とSoldierWeaponEquipped変数の二つの値を保持するための変数

f:id:kazuhironagai77:20200209220341p:plain

を作成して、FieldPlayerのBPで

f:id:kazuhironagai77:20200209220357p:plain

f:id:kazuhironagai77:20200209220402p:plain

適切な個所で値のやり取りを行います。すると

f:id:kazuhironagai77:20200209220417p:plain

の状態でワープしても、

f:id:kazuhironagai77:20200209220432p:plain

ままで、

f:id:kazuhironagai77:20200209220451p:plain

更に、装備を変えても戦闘力の数値は正しく変化しました。

ので今回はこれでOKとします。

しかしATKの値をGameCharacterクラスのATKで管理するのかFieldPlayerのSoldierbaseAtkするのかはっきりさせないと混乱する事になる事が分かりました。この問題は来週考えます。

3.盾なのに武器に装備されている。

これは、武具のデータテーブルの元になっているFItemsDataに武器なのか防具なのかアイテムなのかを示す変数を一つ追加して解決しようと思います。

武器なのか防具なのかアイテムなのか、3つの状態を示すので当然enumを作成します。

で、UE4C++でenumの作成方法を忘れてしまったので調べます。

f:id:kazuhironagai77:20200209220526p:plain

あれ、Googleの一番最初に表示されたサイトをクリックしたら懐かしい名前が。どうやらこの教科書に載っているみたいですね。

8章のブループリントで使用出来るC++構造体の作成(Creating C + + enums that can be used in Blueprint)に作成方法が載っていました。その他UE4Wikiにもenumの作成方法が載っていて、微妙に違いますが、今回は教科書の方法でやります。

f:id:kazuhironagai77:20200209220545p:plain

と作成します。

ビルドしたら成功しました。

f:id:kazuhironagai77:20200209220602p:plain

これ実は、成功したのですが、最初にビルドした時は、エラーになりました。エラーの説明文が意味不明な事を言っていたので、詳しいエラーの理由の説明を見ようと、UE4エディターの方でコンパイルしたら、

成功しました。

あれ。と思ってもう一度、VSからビルドしたら、今度は成功したんです。

それ以降、何回ビルドしても成功します。

良く分からんですが、一応記録として残しておきます。

f:id:kazuhironagai77:20200209220627p:plain

そしてFItemsDataにこのEnumの変数を追加しました。

前回、FItemsDataに新しい変数を追加した時、FItemsDataから派生したBPで、変数を追加する前に作成したBPには新しい変数が表示されなくで困ったのですが、一回UE4エディターを起動し直せば直る事が分かりました。

今回は、前回のようなメンドクサイ事にならないように、最初にUE4エディターを再起動してしまいます。

f:id:kazuhironagai77:20200209220644p:plain

Weaponsを開くと見事にItemTypeの項が追加されています。

f:id:kazuhironagai77:20200209220701p:plain

ItemTypeの選択項を見ると、Item、Weapon、そしてArmorになっています。取りあえずWeaponに変数を一つ足す所までは出来ました。

f:id:kazuhironagai77:20200209220718p:plain

こんな感じにそれぞれの武具のitemTypeを振り分けました。

素手は武器の装備を外すために考えたので、装備を外すボタンを作成した後は消します。

まず、武器だけ装備できるようにします。

f:id:kazuhironagai77:20200209220741p:plain

WeaponのウィジェットにBranchを足しました。これで武具のタイプがWeaponの時のみ装備出来るはずです。

テストします。

f:id:kazuhironagai77:20200209220800p:plain

木の盾を装備します。

出来ません。木の盾のitemTypeはarmorですので武器に装備出来ないのは正しいです。

次に魔法の杖(初心者向け)を装備します。

f:id:kazuhironagai77:20200209220816p:plain

文字がはみ出していますが、装備出来ました。魔法の杖(初心者向け)のitemTypeはweaponなのでこれも正しく出来ています。

残りの武具も試しましたが、全部期待した通りの結果になりました。

これ以上先を進めるためには、ATKの値をGameCharacterクラスのATKで管理するのかFieldPlayerのSoldierbaseAtkするのかはっきりさせないと出来ないので、今週はここでpendingしておきます。

4.武器の名称がボタンに被っている場合がある。

これってどう直すのが正解なんでしょうか?武器の名前が長い場合でもボタンと被らない様に、ボタンの位置を移動させるのが正解なんでしょうか?それとも武器の名前のフォントのサイズが自動で小さくなるように設定を変えるのが正解なのでしょうか?

UE4の使用者としては、武器の名前のフォントのサイズが自動で小さくなるように設定を変える方法を知っておくべきなのかもしれませんが、個人的に文字の大きさが統一されていないのが大嫌いなので、今回はボタンの位置を移動させます。

f:id:kazuhironagai77:20200209220853p:plain

一番文字数が多い魔法の杖(初心者向け)がボタンと被らないのでこれでOKとしておきます。

5.Healerの状態表示がそのまま残っています。

これも今の段階ではどうするべきか決まっていません。キャラクターを増やすつもりはありませんが、今の時点で消してしまうと、combat systemで複数の味方と共に戦うようにコードが書かれている部分を完全に理解する前に消す事になってしまいます。今の時点ではそのままにして置くしかありません。

6.武器のイラストがない。

作ります。武器の3Dモデルは既にプロジェクトにインストールされているので、それのスクリーンショットを取って代用します。

f:id:kazuhironagai77:20200209220931p:plain

作りました。

f:id:kazuhironagai77:20200209220953p:plain

こんな感じで表示されています。

f:id:kazuhironagai77:20200209221009p:plain

装備画面からだと武器のイメージは表示されません。

これも後で直します。

7.装備品の値段が分からない。

DisplayWeaponImageウィジェットが表示される時に武器の値段も表示されるようにします。

f:id:kazuhironagai77:20200209221037p:plain

こんな感じに武具の値段が表示されるようになりました。

f:id:kazuhironagai77:20200209221052p:plain

8.装備した時に今より何が強くなるのか不明。

これも表示するだけなら簡単ですが、実際の値をどこに保存しておくかを明確にしておかないと訳が分からなくなります。

現在、雲の職業である兵士のそれぞれのパラメーターはClassInfoデータテーブルによって以下のように設定されています。

f:id:kazuhironagai77:20200209221123p:plain

これに基づいて、実際の雲のパラメーターはGameCharacterクラスをRPGGameInstanceクラス内でインスタンス化した

f:id:kazuhironagai77:20200209221143p:plain

PartyMembersが管理しているはずです。

新しいGameCharacterが作成される時、そのキャラクターが持つそれぞれの属性の値は以下のように、ClassInfoデータテーブルから指定されます。

f:id:kazuhironagai77:20200209221159p:plain

これらの値はGameInstanceクラスの変数に保持されるので、レベル(マップ)が変わっても問題はないはずです。しかしそれなら、何故、新しいレベルに移る時に、FieldPlayerのSoldierbaseAtk変数とSoldierWeaponEquipped変数の二つの値を保持する必要があったのかが分かりません。これを理解しておかないと、武器や防具の装備を変更するたびに混乱する事になります。

来週考えます。

今週は、Widgetだけ直します。

f:id:kazuhironagai77:20200209221216p:plain

所有している装備品から装備をするウィジェットの画面です。まずマウスをボタンの上においても、絵が表示されません。

調べたら、絵を表示するウィジェット、DisplayWeaponImageはItemWeaponウィジェットから呼ばれていて、この画面を作成しているPause_EquipmentウィジェットはボタンをWeaponウェジェットから作成している事が分かりました。

Weaponウェジェットからも武具の絵が表示されるようにコードを追加します。

f:id:kazuhironagai77:20200209221239p:plain

テストします。

f:id:kazuhironagai77:20200209221255p:plain

これは...

武器の絵が被ってしまっていますね。

f:id:kazuhironagai77:20200209221311p:plain

今度は綺麗に表示されています。今回は、武具の絵を表示するDisplayWeaponImageウィジェットの方を直しました。

DisplayWeaponImageウィジェットは、武器を買うときにも使用されるのでその場合も確認しておきます。

f:id:kazuhironagai77:20200209221334p:plain

大丈夫そうですね。

話は変わりますが、この画面、雲の装備している武器や防具、現在の戦闘力などは表示されないのですね。これは先にデザインをもう少し考えた方が良いみたいですね。

デザインをやります。

9.デザインの改善

武具を売り買いする場合と、装備する場合のウィジェット画面の現状と問題点を把握して問題を解決するデザインを考えます。

武具を買う場合

f:id:kazuhironagai77:20200209221740p:plain

値段が表示されるようになったのは大きな改善ですが、まだまだ必要な情報が足りません。

  • 選択している武具を既に持っているのかどうか?
  • 既に装備している武具と比較して、今選択している武具の方はどの程度の性能なのか?

最低でもこれらの情報は必要と思われます。

うーん。でもこれらの情報が必要なのは返品不可だからですよね。

日本だと、基本的に買ったら返品出来ませんが、アメリカは結構返品出来るんです。

中でも凄かったのは友達が釣りに連れてってくれるので、釣り道具一式必要になり、買いに行ったら、店員から「君はどうせ今回しか釣りに行かないのだろう。釣りから帰ってきた後で、釣り道具一式返しに来たら、お金返してあげるよ。」と言われた事です。

結局、この話は友達が時間の都合がつかなくなって、お流れになってしまったので、その店員が言っていた事が本当なのかどうか確認出来ませんでしたが、返品がいつでも可能なら買うときにそんなに真剣にならなくてもいいと言う事は分かりました。

こはちょっと掘り下げて考える箇所のような気がします。

まず、JRPGで参考にすべきなのは、ドラゴンクエストシリーズなはずです。ゲームはあんまりと言うかほとんどしない私は、うろ覚えな部分でしか語れませんが、ドラゴンクエストでは買った武器を売ると半額になってしまったはずです。これってよく考えるとおかしいですようね。ドラゴンクエストの世界では、武器が使用によって劣化する事はありません。武器の性能は全く変化しないのに売る時は買うときの半分の値段になってしまう。これはおかしくないですか。

でもドラゴンクエストの世界では、基本的に買ったものの返品が出来ないと考えれば、おかしくないのかもしれません。

これもまた聞きなのでどこまで正しいのかは知りませんが、トレーディングカードは同じカードでもお店で買うときの値段は、同じお店で売るときの3倍らしいです。カードの性能は紙に書かれている言葉なんだから劣化する訳はありません。なのにそんなに値段が変わるのはそうしないとお店の経営が成り立たないからだそうです。

だったらカードを売るときはネットで売ればいいじゃないかと思ったら、ネットで売買する場合も送料や使用料が掛かるみたいで、信用度まで加味して考えると一概に安くはないみたいです。

思ったより正しいデザインを考えるのも難しいですね。

うん。デザインも来週考えます。

まとめと感想

今週はInventory systemの装備品関係のバグを直しました。更に今週はゲームデザインについても考察しました。