そうだ、ゲームを作ろう

現状や学んだことなど記録するブログ。間違ってたらごめんね

第14回ぷちコン振り返り

というわけで今回9月1日締め切りのぷちコン第14回に「なつのはじまり(未完成)」を投稿いたしました。

  

はい、というわけでタイトルの通り今回は完成しませんでした。

いやー正直当初はかなり落ち込んでいまして、「ぷちコンロス」みたいな状態になっていましたが、今は少し回復しましたので反省点をば…

 

基本的には

・最初から大きな目標を立てすぎ(しかもその自覚がない)

・新しいことに挑戦しすぎ

・作業効率化が甘かった

これらが問題となっていたと思っています

 

まず最初、目標設定について。

恐ろしいことにこのゲームの最初の計画は4ステージ+1エクストラ。キャラは1プレイヤー+15雑魚敵(各ステージ3)+4ステージボス+2エクストラボス=22キャラでした。

開発中盤になってこれがとんでもないことだと気付きます。自キャラなどの人型キャラはアニメーションアセットを使用していますが、少なくとも雑魚は人型ではないため、自分でアニメーションを用意しなければなりません。

最低でも待機、歩く、攻撃*2、食らいモーション、死亡モーション、この6つは必要でしょう。死亡は物理に任せるという選択肢もありますが、モーション一つのためにPhysicsAssetを不自然でないまで弄るとなると、逆に手間は増大します。

はい、単純計算で15*6=90アニメーションです。これにより多くのモーションが必要であろう6体のボスが加わります。どう考えても無理じゃん!

一番まずかったのはこれに気付いたのが中盤だったということでしょう。結果的に路線変更により、折角作ったモデルを捨てなければならなかったりしました。前回(半分以上既製品のおかげで)上手くいったのを過大評価してしまっていて、「前回いけたんだからこれもいけるって!」と考えていたのがかなり裏目に出た感じです。

 

次に挑戦について。

ぷちコンはそもそも学習を目的としたコンテストでありますので、色々なことに挑戦する、その姿勢自体はとても良かったと思います。完成さえすれば。

とにかく初めてのことが多すぎる。まずキャラクタークラスを動かすようなゲームは「ペーパーニンジャ」以外作ったことがありません。アニメーション作成は初挑戦。インベントリは少し前にチュートリアルで作ったっきり。AIもまともなものは初挑戦。LevelStreamingも初挑戦。Spawnさせた敵キャラってどうやったら動かせるんだっけ?みたいな状態です。

結果的にあらゆる箇所で詰まりまくります。

Blenderでアニメーション作成中にFakeUserを掛けておらず、いくつかのアニメーションが消失する

Blenderで変な操作をしていたらNLAエディタに別のアニメーションが入ってしまい、これの消し方が分からない

・Spawnさせた敵キャラの動かし方がいくら調べても分からない

・LevelStreamingした時は事前ライティングってどういう扱いになるの?

・LevelStreamingした時はNavMeshってどうすれば機能するようになるの?

もうこんなんばっかですわ。

前回も詰まる箇所はいくつかありましたが、今回は特にそういう箇所が多かったです。

 

最後に作業効率化について。まあこれは前二者に比べれば副次的な要素が強いですが。

前項目で書いたとおり、色々なことが初めてなため作業効率化できるところができていなかったりします。

最たるものは全てのアニメーションの遷移をAnimationBPで行っている箇所でしょう。もうスパゲティすぎて、途中からAnimationBPを見るのが嫌になってしまうぐらい。

しかも攻撃が終わった後の状態遷移をNotifyで行っています。結果大量のNotifyが必要になり、それを書くために大量の時間が吸い取られていきます。

これも後で気付いたんですが、BTでもBPでもPlayAnimation(PlayAnimationWithFinishedEvent)を使えば楽だったんですね~。

アニメーションのブレンドができないので、少しカクつくなどの問題はありますが、一瞬ですから基本そこまで気にならないレベルですし…

それからインターフェイスなどの効率化要素もいつもより少なめです。これは比較的問題になりませんでしたが、やっぱり色々効率化できる箇所はあったと思います。

 

というわけで反省点でした。全体的には無謀な計画を立てたため、効率化もろくろくできず、そのまま押し切られてしまった感が強いです。

まああんまり反省点ばかり振り返っても暗くなるので、今回良かった点などを…

 

やはり前回よりも色々なことに挑戦したおかげで、かなり知識が深まりました。特に分かっていると思っていたけど、曖昧だったところ。Blender関連などは機能の一部しか使っていないということもありますが、まだまだなんとなくで使っているんだなあ、と。

まあ、AutoRigProは神ってことも分かりましたがね。あれは本当に神のツール。問題が起きなさすぎる。

あとは妥協することの大切さを学べたかな、と。自分を今回一番褒めたいのは、無理だと分かった時点でちゃんと路線を変更したことです。完成していないのでもっと妥協すべきだったかも知れませんが、「妥協したくない」という気持ちと「完成しないだろこれ」という現実を見比べて、曲がりなりにも後者を取れたことは悪いことではないかなと。

 

それから、分かったことを少し備忘録代わりに書き留めておきます。

Spawnさせた敵キャラですが、SpawnDefaultControllerを繋げばAIControllerも合わせてSpawnさせられる、というところまでは結構色々なサイト書かれているんですが…

f:id:wvigler:20200907071445p:plain

しかし実際やってみると何故か動かない。それどころかBlackBoardにアクセスできないらしく、エラーすら吐く。原因はRunBehaviorTreeとUseBlackBoardのノードがEventBeginPlayに繋がっていることでした。

f:id:wvigler:20200907071107p:plain

敵キャラをSpawnさせない場合(Levelに直接配置する場合)、ゲーム開始時にもうAIControllerはPawnをPossessした状態になっています。なのでEventBeginPlayでいきなりRunBehaviorTreeしても問題が起きません。

しかしSpawnDefaultControllerでSpawnしたAIControllerはまだPawnをPossessしておらず、そこにはほんの僅かですがタイムラグがあります。この瞬間にRunBehaviorTreeしても紐付けするPawnが見つからないので動きません。

なのでこういう場合、色々解決方法は考えられますが、一番良いのはRunBehaviorTree(とUseBlackBoard)をOnPossessイベントに繋ぐことですね。

f:id:wvigler:20200907071001p:plain

AIを扱うためには基本的なことかもしれませんが(というかもしかして極め本に書いてあるんじゃ…)、今回詰まった箇所というわけで紹介しました。

 

それからLevelStreamingした際のNavMeshですが、そのままだとMainLevelとSubLevel双方にNavMeshを配置しないと動きません。しかし配置するのも面倒ですし、スマートではないやり方なので

f:id:wvigler:20200907072159p:plain

ProjectSettingsでEngine->NavigationMesh->Runtime->RuntimeGenerationをStaticからDynamicに変更します。これによってNavMeshが動的に変化するようになり、新たにStreamingしたSubLevelに合わせてNavigationが生成されるようになります。…まあ負荷の問題は発生しますが。

 

タイトル画面について。

タイトル画面では今回VolumetricClouds(多分ver4.25からの新機能?)を使用しています。利用の仕方ですが、まずはプラグインでVolumetricsのプラグインをチェックします。

f:id:wvigler:20200907074034p:plain

再起動したらCtrl+NでDefaultLevelを作成し、ContentsBrowserのShowPluginContentとShowEngineContentのオプションをチェックし、VolumetricsContent->Content->Sky->Blueprints内にあるBP_Volumetric_Cloud_Layerを作成したDefaultLevel上に配置します。ちなみにこの時点ではまだ何も起きません。

f:id:wvigler:20200907075609p:plain

次にBP_Volumetric_Cloud_LayerのShowSkyDomeをチェックします。

f:id:wvigler:20200907075924p:plain

まだ何も起きませんが、これはパラメーターが初期状態だとめちゃくちゃな数値になっているからです。こんな感じに設定すれば…

f:id:wvigler:20200907081030p:plain

こうなります。

f:id:wvigler:20200907081109p:plain

はい、何か変ですね。原因はデフォルトのBP_SkySphereが小さすぎて雲の一部がその外側に出てしまっていることです。BP_SkySphereのScaleを10倍ぐらいにしてみましょう。ついでにBP_SkySphere自身の雲は邪魔なのでCloudOpacityを0にします。

f:id:wvigler:20200907081807p:plain

これできちんと表示されるようになりました。

これの利点としては、見た目通りかなり「厚み」を持った雲を表現できるのと、太陽光を遮るような表現が可能になる点です。どうしてもテクスチャによる表現だと「厚み」が0になってしまいがちですが、これならそういう不満点を解消できます。

ただし、注意点もいくつかありまして…

f:id:wvigler:20200907082340p:plain

はい、この通り。ShaderComplexityが真っ赤です。ぶっちゃけ現状ゲーム内でバリバリ使うのはかなり厳しいんじゃないかと…なので今回はタイトル画面のみの採用となりました。動かなければ問題ないはず、との判断です。

あともう一つ、この雲はDirectionalLightの色などにもちゃんと反応するお利口さんですが、反応するのはデフォルトの「LightSource」のみとなっています。PlaceActorsから新しくDirectionalLightを配置しても、雲が真っ黒になってしまい反応しないので注意しましょう。プロジェクト開始時のデフォルトのレベルやCtrl+Nで作成するDefaultLevelでの使用以外では、どこかから「LightSource」をコピペして持ってくる必要があります。

ということでVolumetricCloudsでした。パラメーターの調整でかなり色々な雲を表現できるのでぜひ色々弄ってみることをおすすめいたします。

それでは。

 

ご意見、ご質問等ありましたらお気軽にどうぞ。