2作目 「すべっておちてトラップをよけてワープするゲーム」ios

f:id:inuningyo:20210716095712p:plain

目的

 自分の2作目のゲームが完成したので、その振り返りをして次の目標を決めること

 

ゲームのURL:https://apps.apple.com/jp/app/id1575639601

プレイしていただけたら嬉しいです

目次

  1. 「すべトラ」はどんなゲームか
  2. 「すべトラ」をどう作ったか
  3. 新しく取り組んだこと
  4. 工夫したところ
  5. 次の目標

 

  • 「すべトラ」はどんなゲームか

  タイトルに要素は全部ぶっ込んだのでタイトルまんまのゲームなのですが、


www.youtube.com

 こんな感じのゲームです。縦スクロールアクションゲームって感じです。

       

f:id:inuningyo:20210719134225p:plain
f:id:inuningyo:20210721080955p:plain
ゲーム画面(左)、ステージ1の全体の様子(右)

 このゲームにはステージが全部で10こあり、1つのステージの大きさは最小で上の左画像*5、最大で*10の大きさがあります。

 

操作

 画面を左に引っ張ると右に、右に引っ張ると左にプレイヤーは進みます。

 ひっぱった長さによってプレイヤーの移動距離や勢いが変化します。長く引っ張れば引っ張るほど勢いは強く、距離は長くなります。

 下の画像のように引っ張った長さは視覚化されるので感覚的に操作できるようになっています。

f:id:inuningyo:20210719140108p:plain

f:id:inuningyo:20210719140116p:plain

 

ワープ

 画面右下のボタンを長押しするとプレイヤーのいる位置にワープを作ることができます。

プレーヤーがトラップに引っかかった時に戻ってくる復帰地点ですね。

f:id:inuningyo:20210721082155p:plain
f:id:inuningyo:20210721082454p:plain
ワープボタンを押している様子(左)、設置したワープ(右)

 ワープを設置するにはコストが必要です。画面左上のワープポイントを1つ消費することでワープは設置できます(プレイヤーが動いている間や特殊な床の上では設置できません)。

f:id:inuningyo:20210721082216p:plain
f:id:inuningyo:20210721082222p:plain
ワープポイントの消費

 このワープポイントはプレイヤーがトラップに引っかかっても1消費します。ワープポイントが0の時にトラップにぶつかるとゲームオーバーになります。

f:id:inuningyo:20210721083513p:plain

 このワープポイントをやり繰りしつつステージの一番下にあるゴールにたどり着くと、ステージクリアになります。

f:id:inuningyo:20210721083542p:plain
f:id:inuningyo:20210721083551p:plain

 右の画像綺麗にトリミングしすぎて境界が見えなくなってしまった。 

 

  • 「すべトラ」をどう作ったか

 自分がまだ2Dのゲームを作ったことがなかったので 、2Dのキャラクター操作について勉強していた(アニメーションやジャンプとか)時に「ジャンプキング」のようなゲームが作れそうだと思ったことがこのゲームを作るきっかけです(ステージ作りの難しさとかは置いておいて、操作感のみの話)。

 シャンプキングやツボのやつとか上に行くゲームはよくあるので、自分は下に行くゲームを作ることにしました。

 しかし、ジャンプキングなどのゲームの醍醐味は下に落ちてやり直しになるという緊張感だと思いますが、下に行くゲームではそれは取り入れられなさそうです。

 

 そこでワープの仕組みを考えました。

 まず最初に考えたのはプレイヤーが失敗した時のペナルティをどうするかについてです。ジャンプキングなどのゲームをベースに考えていたため、大落下のイメージがあったためです。上に行くゲームなら下に落ちてまたやり直しになります。これにならってペナルティはプレイヤーを下から上に戻すことにしました。そこで上に戻す方法としてワープを考えつき、ワープの発動条件としてステージにトラップを置くことにしました。

 大落下の緊張感の代わりにワープポイントの減少によるゲームオーバーの緊張感をとりいれました。こうして書くとマリオとかの残機システムになっただけのような気がしてきます。

 

 次に考えたのはこのワープの回数に制限をつけることです。

 今作の目標の一つに前回導入できなかったadmobのリワード広告をつけることがあります。前回のゲームでは企画の段階からリワード広告を入れることを想定してなかったせいでリワード広告を使用できませんでした。そこで今回はリワード広告を入れるために企画の段階で入れられそうなところを考えていました。そして、ワープ回数の成長要素に広告を絡めることができました。

 ワープ回数を増やすにはゲーム内通貨(ジェム)をショップで払う必要があるのですが、このジェムはステージ内で集めるものです。ステージクリアかゲームオーバー時にリワード広告を見ると集めたジェムを倍にできるようにしました。

 

 あとはワープは設置できる場所によっては完全に詰んでしまう可能性があったので、動く床の上や一部の特殊な床の上では設置できないようにしました。これは接触しているオブジェクトのタグで設置可能かどうか判定しました。

 

大変だったこと 反省点

 ゲーム全体のシステム作り(プレイヤーの操作やゲームのクリア条件など)をプログラムで実装するのは順調であまり時間もかからなかったのですが、ステージ作りが大変すぎてゲームの完成までめちゃくちゃ時間がかかってしまいました。

 これはステージ作りの経験が浅いくせにそこそこでかいステージを何個も作る必要があるように決めてしまったことが失敗でした。後から考えると小さいステージを何個もクリアするタイプのゲームにした方がよかったです。その方が面白いゲームになったと思います。

 

 ステージはプレイヤーはこういう動きをするだろうからこうしたら面白い、こういうトラップがあれば面白い、トラップをこう組み合わせたら面白い、こういう意地悪をしてやろうといった考えで作っていきました。あと前回のゲームでは難易度が鬼畜という評判があったので前半はかなり優しくしたつもりだったのですが、相変わらず難しいと言われました。

 

 後半のステージではワープポイントが最初(10ポイント)の何倍にもなるのですがその分トラップも難しくなります。ポイントの減少頻度が高くなると、ステージの途中で今回のクリアは無理だと感じられることがあります。後半のステージほど長くなるのでその分やり直すのがめんどくさくなってしまいます。そのぶんステージで手に入るジェムの量はかなり多くなるようにはしました。

 

 これらのことを考えるとステージは小さくして、ステージ内でワープポイントの回復手段を用意すればゲームのハラハラ感も残るし、リワード広告はゲームをコンテニューすることに使うようにすれば実装できます。

 こっちの方法でゲームを作ればステージの数も増えてより早くゲームを完成させることができたと思います。次回作では小さいステージをたくさん用意するタイプにしようと思います!

 

  • 新しく取り組んだこと

 とりあえず2Dのゲームを初めて作ったこと、Tilemap、アニメーションも初めて使いました。Particleも初めて使用したし、ゲーム内の演出としてフェードイン、フェードアウト、キャラクタースキンの変更(これは厳密にはスキンを変えたのではなく見た目の違うキャラクターを複数用意したのでスキン変更だけならもっと良い方法があると思う)も実装しました。

 ストアでのreview機能も初めて使用したのですがiosなら一行のプログラムで実装できることに驚きました。

 プロジェクトをURP化することによって簡単に2Dゲーム内に光と影の要素を実装できました。 

 あとはrayを使用したレーザーのトラップを実装しました。風でキャラクターが動かされる挙動を入れたくてAreaEfectorも使用しました。

 プレイヤー以外のものを動かすのも初めてでした(dotweenを使っただけですが)。

 UIのScrollViewも初めて使用しました。

 

  プロファイラーを使用して最適化の試みをしました。これによって日本語フォントが原因でメモリが重くなっていることが分かり、大量の漢字を削減することで400MBも軽くすることができました。スプライトの大きさの設定が2048*2048ばかりになっていたのでそれを変えることも覚えました。

 

EasySaveを初めて使用しました。auto saveの使用ができれば楽ができそうだと思って使ったのですが、auto saveはできたのですがsceneを移動するときちんどロードできず、最終的にはauto saveを諦めてプログラムで普通にsaveしました。

  • 工夫したところ

 キャラの移動メーターの位置、カメラの動き、ワープによるステージに詰みができないように工夫しました。

 

 移動メーターとは下の画像のキャラクター右上のUIです。

 キャラクターが画面右半分にいる時は左上、左半分にいる時は右上、画面上部でこのUIが見切れてしまいそうな位置にいる時は右下か左下に表示されるようにしました。

 指でタッチしたところに表示されるようにするか迷ったのですが、タッチした場所ではなくキャラクターの周りにUIを固定しました。このゲームは指を離してキャラクターが移動するタイミングが非常に重要なことがあるため、プレイヤーの視線はキャラクターとキャラクターの移動先に固定された方がプレイしやすいと考えたからです。指でタッチした場所にこのUIが表示されると視線が行ったり来たりしてプレイしづらくなると考えました。

f:id:inuningyo:20210719140116p:plain

 

 カメラの動きはプレーヤーについて動くのではなく、プレイヤーが境界を越えたら次の位置に動くようにしました。プレイヤーは左下の画像の一番下の空間より下にいくと右下の画像の一番上から落ちてくることになります。その切り替えのタイミングでカメラを動かしました。 

 プレイヤーとカメラの位置が一定以上離れたらプレイヤーがいるエリアにカメラが移動するようになっています。ワープでプレイヤーが移動しても同じ理由でプレイヤーのいる画面が表示されます。

 

 カメラの移動をプレイヤーについていくのではなくこのような形にしたのはプレイヤーにこの下はどうなっているのだろうと思わせるためです。右下の画像を見ると左から落ちていた場合にトラップに引っかかっていたことがわかると思います。

 こういう初見殺しの場面を実装するのもワープをプレイヤー自身で設定することができるからこそできたことです。

f:id:inuningyo:20210719134225p:plain
f:id:inuningyo:20210724084031p:plain
一つ目の画面(左)、二つ目の画面(右)

 ワープが設置できることによって詰みができないようにするために一部の床の上と動く床の上ではワープが設置できないようにしました。まあここはやって当たり前のことなので工夫したところではないかもしれないです。むしろもし予想外の詰みが発生してしまった場合のためにトラップに当たらずに自発的にワープできるようにもした方が良かったかもしれません。

f:id:inuningyo:20210724090833p:plain

 

  • 次の目標

 書き忘れていましたが今回作ったゲームの初期の目標は、覚えている限りでは

  • 2dゲームを作ること
  • ショップ機能の導入(スキンとか)
  • admobリワード広告の導入
  • SNSでの共有の仕組み

でした。SNS以外は達成できたので、次回作ではSNSを達成したいですね。ステージ作りに時間がかかりすぎたせいでSNSに時間を割きたくなくなってしまいました。調べてみたら案外簡単にできてしまう可能性もあるのかもしれません。

 

 

 細かい演出面をもっと頑張りたいですね。UIに表示されている数字が減る時にでかくしたりとか。キャラクターが動く時にエフェクトをつけるとか。

 

 チュートリアルで重要なところを目立たせる。チュートリアルのやり方をもっと工夫してみることが必要だと感じました。ワープの仕組みなどをきちんと伝わる形で伝えられていない気がしたのでもっと工夫したいです。

 

 今回のゲーム作りではプログラミング面で力不足を感じることがありました。unityの機能で分からないことがあれば調べれば大体のことは分かるのですが、それとは別に自分で「こういう機能を作りたい」と思った時にスマートに実装できずにごちゃごちゃしながら苦労して作ったことがあったためです。

 

長々と書きましたが、たぶんまだ書ききれていないことがあると思います。でもだいたい書きたいことは書けたので以上となります。

 

ゲームのURL:https://apps.apple.com/jp/app/id1575639601

プレイしていただけたら嬉しいです