1400字制限

最近の記事のほとんどが1400字を超えているのでタイトル無視も甚だしいが1400字「以下」に制限するとは言っていない

Unity 完全理解した

 

 

 

日曜日の朝に Kindle石黒正数の漫画を読んでいたら急にゲームを作りたくなったので Unity をダウンロードして作ってみた(ゲームの内容とは特に関係ないが石黒正数は最高である)。

作りたかったのは PC-98 時代の名作ゲーム「蟹味噌」みたいな単純なアクションゲーム。Unity のチュートリアルで玉転がしゲームがあるので、とりあえずこれを読んで基本操作を学習する。した。

 

unity3d.com

このチュートリアルは矢印キーを押すことでXZ方向の加速度が発生するだけの簡単な操作だが、これだけだと平面的で面白くないのでジャンプを追加する。床との接触判定がある時にスペースキーを押すとY方向の速度が発生する(ここは瞬発的な力であるため加速度ではなく速度)。あとジャンプの際に平面速度を半分にする。つまりジャンプがブレーキの代わりになる。マリオで氷の床が滑るときにジャンプで止まるのと同じ原理。

次に敵機の赤玉を作る。これは単純に青玉に向かってくるだけで、力のベクトルは自機-敵機間のベクトルの定数倍である。つまり遠くにいる程加速する。ただしベクトルの向きが乱数で±30度の範囲でブレる。各瞬間で別々の向きにブレるので平均化するとそこまでブレない。

あとは落ちた球体が消える処理だけ作れば完成。1日で出来た。WebGL でビルドしてPCブラウザで動かせるようにする。(キーボードがあればモバイルブラウザでも一応動くらしい)

「蟹湯葉https://yubais.net/game/KaniYuba/

f:id:yubais:20190416183929p:plain

この時点での不満点

  • 自機・敵機ともに制動力が弱いので、操作性が非常に悪く、敵をぶつけて落とすよりも敵を自滅させるゲームになってる。
  • 残機やタイムなどの機能がない。
  • PCブラウザでしか遊べないので昔作った「人を馬鹿にしたブロック崩し」のようにバズらせて広告収入を得ることができない。

とりあえず残機については static 変数を使えばシーンをまたいだ変数が実装できるらしいので作る。残機の表示には UI Text を使う。このへんは JavaScript で DOM を操作するのと似たようなノリだ。GUI はひとつわかれば全部わかる。

操作性の問題については「加速力と減速力と空中加速力を別々にする」とか「進行方向ベクトルと入力方向ベクトルの内積をもとに加速度を設定する」とか色々やったんだが結局調整すべきパラメータが多すぎて脳が破綻した。

最終的に自機は「矢印を押したら加速」「地上でも空中でも同じ」「ただし常に速度が数%ずつ減る」という単純きわまりない設定にしたら何かいい感じになってしまった。何事も単純が正義。各ボールには質量・加速度・減速率の3つのパラメータが設定されている。

敵機の追従は「距離に比例」はさすがに非物理的なので止めて、加速度の絶対値はボールごとに一定にする。±30度のブレはそのまま。

「蟹湯葉2」https://yubais.net/game/KaniYuba2/

f:id:yubais:20190416185708p:plain

 

ここで新たな問題が浮上。「床に接触しているときはジャンプできる」という設定にしたが、床の上ではなく床の側面でもジャンプできてしまう。しかしこれは緊急回避的なギミックとして面白いのでそのまま残す。

次に、縦と横の加速度と摩擦を独立に設定しているので、斜めの加速が縦横よりも√2倍速くなってしまう。このため敵機には斜めからぶつかって落とすべしという物理法則の等方性を無視した結果になってしまった。不満だが「単純が正義」と言ったばかりなので引っ込めるわけにもいかず放置。

あとはモバイルで遊べない点だが、Unity 自体は iOSAndroid 向けのバイナリを出力してくれるが公開手順がめんどいし、かといってブラウザ向けの WebGL 出力は現時点でモバイルブラウザに対応していないらしい(したとしても重すぎる)ので一旦諦める。ブラウザで気軽に遊べるミニゲームを作りたいなら Unity のようなシッカリしたエンジンよりも PlayCanvas とかそれ用のを使う方がいいのだろうか?

playcanvas.jp

とりあえず Unity の操作を覚えたので将来何か思いついた時にサッと取り組むことができるだろう。あとはアイデアが降ってくるまで寝て待つ(本業に戻る)。

 

※タイトルの「完全理解した」は「チュートリアルを完了した」を意味する界隈の隠語。