そうだ、ゲームを作ろう

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

「Flower Pinball」振り返り

ぷちコン第13回応募作品「Flower Pinball」について色々と…

 

まずはお品書き

・そもそも最初は全然違うゲームにする予定だったよ!

・「花が咲く」をどう表現する?

・「ピンボールでいける!」と思ったのはなぜか

・最初のピンボールとしての構想

・アートワーク変更

・ギミックの数が…

・スプラインの勉強になった

・また音関連か…

 

・そもそも最初は全然違うゲームにする予定だったよ!

テーマが発表されてからずっと構想を練っていましたが、最初の7日間は実はアイデアが全然決まりませんでした。それでも出したアイデアとして「(刺し身の)サク」をなるべく薄く切って競うゲームというのを考えたのですが…なんかTwitter見たら同じようなこと考えている人は結構いるし、そもそも変化球としてもそんなに面白くないし、なにより作り方のアイデアが微妙に湧いてこないし(当時ProceduralMeshSliceの存在を知らなかった)で没になり、結局自分が変化球してもあんまり面白くならないなと思い、王道っぽい「(花が)咲く」でいくこととなりました。

 

・「花が咲く」をどう表現する?

ただ、そもそもなぜ構想段階で「(刺し身の)サク」に行こうとしたのかというと、「(花が)咲く」ことをどう表現したらいいのか分からなかったという…当時は難しく考えすぎてまして、それこそぷちコンの他の作品でいえば、

www.youtube.com

こういうことやらなきゃ表現できないんじゃないの?、と。最低でもボーン組んでー、とかやらなきゃ駄目だよね?、と。

そんなんできねえよ!多分絶対時間足りねえよ!ということで悩んでいたんですが、そんな時に見付けたのがこのチュートリアルでした。

www.youtube.com

これはパーティクルのチュートリアルなんですが、これを見て僕は思いました。「あれ?もしかして花弁を別々に作って順々にScale弄るだけで結構「咲く」感じに見えるんじゃね?」、と。

やってみると理想的とまではいかないまでも、スタイライズドな表現としてはまあアリかなと思えました。ということで今回はこの表現を使うことにしました。

ふーよかったわい、一件落着、と思っていたのですが、実はこの時各花の親クラスを作らなかったという痛恨のミスをしています。(後で大変だった)

 

・「ピンボールでいける!」と思ったのはなぜか

「咲く」の方向性が決まってもゲーム自体の方向性はまだ決まっていませんでした。ピンボールももちろん候補には上がっていましたが、数ある候補の一つという感じです。

さて、僕はぷちコンは今回で2回目、前回は映像編だったのでゲーム制作の経験が他の参加者よりかなり不足しています。特に製作期間についての不安はかなり大きく、常に「これもしかして間に合わないんじゃないか?」と思って作っていました。そんな中ピンボール制作に大きな味方を見つけました。

forums.unrealengine.com

2015年UnrealFest横浜で発表、公開されたピンボールコンストラクションキット及びその動画です。はっきり言ってこのサンプルが無ければ今回の制作は間に合わなかったと思います。もちろん、そのままこれを使ったわけではなく要所を真似しただけですが、それでも大いに製作期間の削減に役立ちました。

・底板部分は斜めにせず水平にする(ボールに働く重力はBPで付ける)

・ゲート、スピナーの実装はほぼそのまま真似する

・ランプのスプラインを参考にする

・各種サウンドSuper retro audio bundleは買った)流用

などが参考にした部分です。

ただ一番の目玉であるプロシージャルな壁の生成は参考にできてない(特殊すぎる、難しいなどの理由で)んですけどね。まあそれでもスプライン使っているんである意味プロシージャル生成してますけど…(これはこれで見通しがいいなどの利点もあって採用した)

 

・最初のピンボールとしての構想

弾を撃ち出すのは実はかなり初期から決まっていました。ピンボールの一番の弱点は一回打つとボールが下りてくるまでの間は基本的には暇になってしまうということだと思います。有名なWindowsピンボールはその弱点を補うためにフリッパーを動かすとボールチャネル(一番上の仕掛け)のライトが入れ替わるという仕様になっていました。この仕組み自体は「Flower Pinball」にも実装しましたが、それだけではちょっと退屈になってしまう気がしました。

なので僕がSTGが好きであることも相まって、ボールから弾を出したらどうだろうと思いました。弾が当たると色々な仕掛けが作動してそれが高得点に繋がる。最初の構想では4属性の弾を特定の仕掛けに当てると作動し、全て当てると中央の花が開いて高得点チャンス!、というようなものを想定していました。

ただ弾の射程が長すぎると今度は安定した位置(例えばフリッパーを上げた状態での根元部分など)から仕掛けを狙うことができるようになってしまい、リスクを犯さず延々とスコアを稼げてしまいます。なので射程はかなり短くしました。また反動を付けることである程度ボールをコントロールする能力を付けました。これはゲームを面白くする要素であると同時に、仮にボールがどこかで止まってしまった場合に低リスクでその状況から復帰できるという保険でもあります。

 

・アートワーク変更

話がちょっと変わりますが、僕は最初にタイトル画面から制作を始めました。実はこのゲームのタイトル画面ですが、個人的にかなり気に入っています。

f:id:wvigler:20200407071423p:plain

すりガラスの細工物っぽい花の中心からぼんやり光が放たれている」といった感じの絵を頭の中に描いていたのですが、StationaryLightとSubsurfaceを使うことでかなり近い感じになってくれました。

さて、当初の予定ではタイトル画面はともかくとしてゲーム画面は現在よりかなり「植物的」な見た目になる予定でした。Megascansから引っ張ってきた草木や蔦をそのままの形でもりもりと並べるつもりでした。恐らくですが「Megascansを使えば手間を節約できるし(タダだし)、盛れば色々至らなくても隠せるだろ」とか考えたんだと思いますが、結局の所タイトル画面との融和性も考えて、タイトル画面側の冷たい感じのアートワークに寄せることにしました。

ただし、今もその時の名残は残っています。枠に貼り付けられた蔦のデカールや、寂しいなと感じた所には草花を植えています。当然Megascansから引っ張ってきたものを使用しています。

 

・ギミックの数が…

今回一番大変だった部分です。一本のゲームを、しかも独自アートワークで統一、ということになると、とにかく沢山のギミックを作らなくてはならず、かなりの回数Blenderを起動しました。作ったのはベース、スリングショット、プランジャー、ボールチャネル、ランプレーン、バンパー類など。花のモデリングが見た目ほど難しくなかったのは救いでした。

こことか

f:id:wvigler:20200407091349p:plain

プランジャーの柄の部分なんですが、結構リアリティ持たせたのに1ミリも映らない。

悲しい。

まあ作ってる途中で「ここ全然映らなくない?」とは思ったけれども…

 

・スプラインの勉強になった

ここからは少し技術的な話もします。

今回最も勉強になったのはスプラインの扱い方です。いやーこれぶっちゃけ便利ですね。

今回使っているのは壁、ランプレーン、左側のサブレーンの三箇所です。

まず基本的な使い方を見ていきましょう。

スプラインをループさせないアクタの場合、ConstructionScript内でNumberOfSplinePointsから2を引いてForLoopでAddSplineComponentを回します。

f:id:wvigler:20200407151907p:plain

生成されたComponentをSetStartAndEndでこんな風にSplineの位置とタンジェントに指定してやればOK。

f:id:wvigler:20200407152618p:plain

基本の使い方はこれです。

ループさせる場合は2ではなく1を引きます。

f:id:wvigler:20200407152842p:plain

もちろんですがClosedLoopにチェックを入れるのを忘れないように

f:id:wvigler:20200407153045p:plain

LoopIndexで指定することで途中から生成されるMeshを変更したりすることが容易にできます。また一つ一つのSplineMeshComponentに対してHitEventやOverlapEventなどを持たせたい時は、

f:id:wvigler:20200407153648p:plain

ConstructionScriptで最初に配列化したMesh等に対してDelegateで指定することで持たせることができます。ただこういうことをやる時にちょっと注意なんですが…

f:id:wvigler:20200407154046p:plain

ConstructionScriptで配列にAddする場合、最初にちゃんと配列を初期化しないと処理が走るたびに配列に新しい要素が追加されていってしまいます。気づいた時に要素数300とかなってて焦りました。画像ではClear関数を使って初期化してますが、もしかしてこういうのってAddUniqueとかで解決できるんですかね?

左側のサブレーンのようにお互いのSplineMeshComponentを少し離して配置したい場合は、透明なMeshを用意するとかも一つの手立てではあると思いますが、僕は少し違う方法を取っています。

f:id:wvigler:20200407155023p:plain

MeshのBoundsを弄って実現しています。これがいい方法なのかはよく分かりませんが、とりあえず今の所問題は無さそうです。

 

・また音関連か…

前回の反省を踏まえ、今回は音楽をかなり最初の方に選び、その雰囲気にある程度合わせてゲームを制作していくという形を取っています。事実拙いながらもBGMに関しては前回よりミキシングが格段に良くなったと思います。そう、BGMに関しては

問題だったのはSEです。前回よりも効果音系アセットは増えているにも関わらず、それでも「これだ!」と感じるSEって無かったりするんですよねぇ…もうSE自分で作れるようになりたいよなあ…結局あるものをPitchを弄ったりして間に合わせましたが、「もうちょっとだけこう…」みたいに感じるSEも無くはないです。どうにかしたいですねこれ。

 

以上、「Flower Pinball」振り返りでした。正直最初辺りの構想段階よりもいいものは出来たとは思います。なのである程度満足するべきなのか知れませんが、まぁ、作ってるとね…欲がね…不満がある所をピックアップすると、音関連は当然として、Particle関連、そもそものアイデアの貧弱さとか…後はゲームバランスですかね。

ピンボールは延々続けられてしまうというのが慢性的な問題となっているゲームなので、この辺りに切り込めれば良かったのですが、今回はその辺はこれまでのピンボールと変わりません。タイムアタックモードを構想した時期もあったんですが、期間が足りませんでしたね。