<前文>
今週もゲームデザインについて書きます。先週は群れの順位とアニメ好きなアメリカ人のキャラクターの評価方法を元に好かれる主人公について考察しました。結構な収穫があり真面目にやるのが大切だと分かりました。
今週はJRPGの主人公に必要な要素について書き残しておきたいと思います。
正し、私ゲームはあまりやらないので、良く知りません。のでアニメや漫画で代用して考えます。
1. 覚悟
これはアニメや漫画の駄目な主人公を見て思ったんじゃなくて、日本で結構英語を勉強したのに、全然喋れない人たちを見て思ったんです。覚悟がないんだと。最初から外国語を上手く喋れる人はいません。しかし喋らなければ上手くなる事は絶対にありません。そりゃ、最初は笑われるかもしれません。全然通じなくて落ち込んで、ひょっとしたら悔しくて泣いたりするかもしれません。だからと言って喋らなければ永遠に下手なままです。でその人たちを見て思ったんです。格好悪いなと。
そこに気が付いてもう一度、アニメや漫画を見ると、やっぱり面白くないマンガやアニメの主人公は覚悟を決めないです。
2. 冒険に出る理由
JRPGの主人公は基本的に少年です。これって結構盲点でした。先週、あんまりにも好かれる主人公の考察が良く出来たので、アメリカ人と日本人の評価をミックスして、それについて考察したらまた素晴らしいのが出来るのではと思い、小説好きなアメリカ人が嫌いな主人公と言う括りで色々探したんです。そしたら、奥さんが殺されて復習を誓う主人公とかが出てくるです。あんまりにも世界観が違うんで呆然としました。
少年が危険を顧みず、冒険に出る理由って結構難しいと思うんです。子供ですから責任を負わなくていい代わりに権利が制限されている訳です。これが大人だったら、会社で犯罪しろと要求されて嫌なんで会社止めます。が通るです。しかし子供がYouTuberになるんで小学校止めますは中々難しいと思います。
HxHはその点を上手くやったなと思いました。育児放棄した父親に会いたい主人公が、父親を捜しに旅に出る訳です。メイドインアビスでは母親を探しにです。ただしメイドインアビスは完全に家出で、孤児院からと言え100%納得出来るかと言えば難しい部分もあります。家出と言えば、ムーミンパパも孤児院から家出して海賊になるんですが、あの温厚そうなムーミンパパにそんな激しい過去があったのを知った時はかなり衝撃でした。
鋼の錬金術師は、子供といえども能力的には十分に大人ですし、One pieceのルフィもそうです。更にルフィに至っては死んでもいいと覚悟まで決めてます。彼らを少年の枠に収めるのとはちょっと違うと思います。
色々探したんですが、少年が危険を顧みず、冒険に出て良い理由って両親のどちらかに会いに行くしか見つかりませんでした。
3.報酬
これは、アニメ好きなあるアメリカ人の言葉が残っていて結構大切な事なのかなと思ったんです。その人は、結構アニメファンにしては結構、年行った人だったんですが、異世界転生が大好きなんです。日本人から見たら本当に糞みたいなヤツでも大好きなんです。何でって聞いたら、異世界に行って無敵になった主人公が全員人助けするからと。今まで見た異世界転生もので一個も主人公が無敵なのに悪い事するのを見た事ない。無敵なんだからどんな悪い事しても罰せられないのにね。と。それ聞いて私ドキッとしましたよ。何だって無敵の国の人の言葉ですから。
人の本質って隠せないですよね。特に異世界ものみたいな欲望や妄想を全て詰め込みましたみたいなストーリーは。そういう中で、無敵になった主人公が全員人助けするのは彼にとっては非常に素晴らしい事だったんです。(多少例外的な作品もある気がしますが、ここでは無視します。)
ここで思ったのは、主人公が本当にほしい報酬は何なのか?をはっきりさせる事とその報酬が実は人助けだったみたいな善性が主人公には必要と言う事です。
4.知性
標準的な知性が必要です。何故か主人公が標準よりアホな方が好まれると言う錯覚がプロの間にあるようですが、全然違います。特別に頭が良い必要はありませんが、標準的な知性は必要です。大学でコンピュータサイエンスが専攻だったので、非常に頭のいい生徒が沢山いたのですが、ある中国人の友達はその中でも群を抜いて頭が良かったです。ある日その友人とWi-Fiの設定をしたのですが、暗証番号を見ないでタイプしているです。それを指摘したら、彼は暗証番号みたいな大切な番号は一瞬見れば写真みたいにずっと記憶に残す事が出来ると言いました。素の頭の良さにここまで違いがあるのかとその時、驚いたんですが、暗証番号に限らないですが、数字の繰り返しの場合ならば、同じ数字が繰り返す間で分割して、その間の数字をゴロで覚えて、とか一寸工夫すると一般的な頭の良さでも一瞬で覚えられるです。私がしたのは、Narutoのキャラクターに0から9まで番号を振ってそれで暗記する方法です。我ながらオタクですが、誰かに言うわけではないので全然問題なかったです。そうすれば普通の頭でも一瞬で覚えれるんです。
人間としての標準的な知性があれば、このような工夫は普通に思いつくので、主人公がそういう事をしないのは、非常に間抜けなのか、目的に嘘偽りがあるのかのどちらかです。どちらも一瞬でファンを失う要因です。
今週は、先週の続きで、主人公に必要な要素について、覚悟、冒険に出る理由、報酬そして知性について考察しました。
それでは今週の勉強を始めます。
<本文>
1.装備する武器に応じて、表示される武器を変える。
まず、武器を装備するたびに、FieldPlayerのSoldier Weaponに武器の名前が保持されます。
表示する武器の3DイメージはFieldPlayerのShortSwordSmallに保持されます。
このShortSwordSmall変数は、ShortSwordSmallクラスから作成されたので、それ以外のクラスから作成されたインスタンスは保持できません。
Polymorphismを使用する事で、ShortSwordSmall変数に違う武器を保持させる事が出来れば、後は何とか出来そうです。
ShortSwordSmallクラスの名前をBaseWeaponクラスに変更します。
BaseWeaponクラスからShortSwordSmallクラスを派生させます。
派生したクラスShortSwordSmallからアクターをSpawnします。
そのインスタンスのリファレンスをFieldPlayerクラスの変数、ShortSwordSmallの名前を変更したBaseWeapon変数に保存します。
これで保持出来るならば、BPでもPolymorphismを使用する事が出来ると言う事になるはずです。
試してみます。
出来てますね。
外します。
エラーになりました。
どうもFieldPlayerクラスのBaseWeapon変数にアクセス出来ないみたいです。
これは前もあったエラーで、直し方は単にもう一度FieldPlayerクラスのBaseWeapon変数を作成し直せば良かったはずです。
直りました。
武器を外す事が出来ました。
Polymorphismを使用する事で、BaseWeaponクラスから派生したあらゆるクラスをFieldPlayerクラスのBaseWeapon変数に保持する事が可能みたいですね。
今度は、BaseWeaponクラスからSword02SMを表示するShortSwordBigを作成します。
この剣を表示するように設定します。
テストします。
明らかに前とは違う剣を装備しています。
外しても問題起きません。
後は、武器の名前からBaseWeaponクラスの派生クラスの名前を返す関数を作成すれば完成のはずです。
まず関数から作成します。
その関数を使用して装備している武器と同じ名前の武器を3Dで表示するようにします。
テストします。
まず短剣(小)を装備します。
外して、短剣(大)を装備します。
出来てますね。
しかし大変なバグを発見してしまいました。
まず何でも武器を装備します。
そしてその武器を外さずに別な武器を装備します。
ここでは分かり易いようにハンマーを装備させています。そしてもう一度短剣(小)に戻すと、
ハンマーのままです。更に、外すボタンを押しても武器を外しません。
このバグを直します。
ぱっとWeaponのBPを見たら、FieldPlayerのBaseWapon変数が既に初期化されている場合、そこにあるアクターを破壊せずに新しいアクターを作成してそれをBaseWapon変数にセットしてました。
のでFieldPlayerのBaseWapon変数が既に初期化されている場合はそこにあるアクターをまず破壊する事にしました。
これで出来るはずです。
テストします。
一端、短剣(小)を装備させ、短剣(大)を装備しました。分かり易いように短剣(大)の3Dモデルをハンマーに変更しています。
もう一度短剣(小)を装備します。
出来ました。今度は武器を外します。
外しましたね。直ったみたいです。
それでは武器の3Dイメージを一気に作成します。
武器の名前からBaseWeaponクラスの派生クラスの名前を返す関数に全ての武器を呼べるようにします。
テストします。
装備出来てますね。
一応ここまでで完成とします。
2.装備する防具に応じて、表示される防具を変える。
やり方は武器と一緒なので結果だけ記録します。
まず、防具を装備したまま、他の防具を装備すると防具が外れなくなるバグを直しました。
次にベースとなるStatic mesh actorの名前をBaseArmorに変えます。
全ての防具をこのクラスから派生させます。
次に、防具の名前からBaseArmorクラスの派生クラスの名前を返す関数を作成します。
この関数を装備した防具の3Dを表示するコードに追加します。
テストします。
出来てますね。
うーん。今週はこれで終りにする予定だったのですが、思ったより早く終わってしまったので武器を装備した時に移動のアニメーションを変更出来るか確認します。
3.移動する時のアニメーションの変更
アニメーションの変更以前にどうやってアニメーションを作成したのか全部忘れてしまったので、その復習から始めます。
2019-11-10のブログにどうやってアニメーションを作成したのかが、まとめられていました。
ざっと読見直して見た所、Animation BPクラスの以下の部分が実際のモーションを指定しているみたいです。
Idle/Runのモーションに付属のモーションが使用出来るのか試してみます。
スピードとは滅茶苦茶ですが、取り敢えず使える事は分かりました。
次に、Animation BPクラスに作成した変数の値を他のBPから変更出来るのか調べます。
以下に示すように、WeaponクラスからFieldPlayerにアクセスしてそのMeshにアクセス、更にその中のAnim Instanceにアクセスします。
それをcast してAnimation BPクラスに作成した変数にアクセスしました。
一応出来るみたいですね。
試してみます。
実際に使用しているAnimation BPクラスであるMyThirdPerson_AnimBPの変数にTestを追加します。
MyThirdPerson_AnimBPのAnim Graph内のAnimation State Machine内に以下に示すように新たなstateを追加します。
Idle/Run 状態からtest状態に移行する条件を以下のようにします。
Test状態に移行した場合、以下に示すように剣と盾を装備した状態で歩くアニメーションに切り替わるようにします。
今度は、Weaponクラスで武器を装備した時に、MyThirdPerson_AnimBPのTest変数にアクセスしてTestをTrueにセットします。
これで私の考えが正しければ武器を装備した時にはプレイヤーの操作するキャラのモーションは別なヤツに代わってくれるはずです。
テストしてみます。
変わりました。
何か呆気ないですが出来ました。これをコアにして進めます。
次は武器を外したら元のモーションに戻るようにします。
まず、外すボタンを押した時に、Test変数がfalseになるようにセットします。
更に、MyThirdPerson_AnimBPのAnim Graph内のAnimation State Machine内に以下に示すようにTest状態からIdle/Run状態に戻る条件を追加します。
勿論、条件は、Test変数がfalseになる事です。
テストします。
戻りました。
あっけないですね。これも出来ました。
次はBlend Space 1Dを使用して剣と盾を装備した状態での歩きと走りのモーションを作成します。
まず、武器防具なしの歩きと走りのモーションがあるのでこれを複製して改良して作成してみます。
出来ました。
モーションを付属のヤツに変えただけです。
止まっている時です。
歩いている時です。
走っている時です。
スクリーンショットだとアニメーションの凄さが全く伝わらないですが、かなりカッコイイです
MyThirdPerson_AnimBPのAnim Graph内のAnimation State Machine内のTest状態に上のアニメーションをセットします。
これで剣と盾を装備した状態での歩きと走りのアニメーションが完成したはずです。
テストします。
出来てますね。これなら走っている時も剣が体に刺さらずに済みますね。
因みに盾も持たせてみました。
問題ないですね。
4.まとめと感想
これでInventory systemは一端終わりにして、次回からターン制の戦闘システムについてやります。
今週は量が少ないかなと思いましたが、何か咳が出て来ましてちょっと怖いのでこれで終了して早く寝る事にします。