Garakuta開発メモ

忘れっぽい自分に向けた開発メモ

unity1weekお題「当てる」に参加したゲームの開発話

2ヶ月ぶりの更新です。

サイト unityroom にて2/19~開催された一週間ゲームジャム #unity1week に「魔物討伐」で参加させていただきました。

魔物討伐 | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

f:id:garakuta-works:20180304011808g:plain

このタイトルの開発話を書いてきます。

お題「当てる」

当てるというお題で、悩んだ挙句にひねらずに弓矢を使うゲームにしようと考えました。
開発毎に再利用を行うために部品化やライブラリ化はしているものの、今回は着手が遅くなったこともあり開発中だったランゲームをベースにして、以前作成したものを色々流用しつつ開発を進めました。

各要素について

  • キャラクタ操作処理:
    キー + マウス操作については、以前のunity1week「2017/07/24〜 お題:夏」で作成したビーチバレー[仮]他からの処理を使用しています。 キャラクタは物理で動作させているので、そのあたりの処理や設定値も使いつつ調整しました。
  • キャラクタの動き:
    敵キャラに使用したスケルトンは以前のお題でも使用していたものを今回も使用しました。
    キャラクタはボーンを埋め込んだポリゴンをfbxに出力してUnityでAnimationをつけています。
    キャラクタドットは新規に作成することも多いのですが、動きのAnimationは同じものを使用しています。 タイトル毎に都度調整をしているので、最新作になるごとにアクションが増えていきます。
  • 弓矢の処理:
    以前作成していたものからの流用です。弓もドットテクスチャのボーン在りポリゴンです。
    ドット絵的には邪道かもしれませんが、スケルタルアニメーションでの動作はドットパターンを描かない分工数が少なく済みます。
    融通が利きにくい面もありますが。

f:id:garakuta-works:20180304002656p:plain:w240

ステージについて

  • 背景、地形:
    作成中のランゲームで多重スクロールを実装していたので流用、地形ではFerr2DというAssetを使用させていただきました。
    樹木は以前作成したL-System2Dの生成処理を使用、楽ちんです。(GitHubにて公開中、更新してませんが)
    描画ではMeshRenderer、SkinnedMeshRenderer、SpriteRendererが混在している状態です。うまく管理しないとカオスに・・・。
  • ポストエフェクトシェーダー:
    本作も含め作成した大体のゲームには、画面を曲面の様にゆがませる自作のシェーダーを適用しています。
    ちょっと変わった画面効果が得られるかなと思ったためです。「地球も丸い、画面も丸い」な感じで。 ただ、シェーダーは理解不足なところもあるため、効率が悪かったり間違っている部分もあるかもしれません。

f:id:garakuta-works:20180304002725g:plain:w640

UIについて

  • uGUIの利用:
    Unity uGUIを使用したものは、unity1week「2017/08/21〜 お題:フロー」のあたりから作成したものを調整しつつ利用しています。
    最初はuGUIのButtonを拡張していましたが、MonoBehaviour に IPointerClickHandler 等のインターフェイスで拡張したコンポーネントを使用しています。
    これも回を重ねるごとに改良しつつ使用しています。
    本作ではボタンやポップアップのイージング等も少し対応。最初はDOTween等のAssetを使うことを考えたのですが、単純なものでしたのでコードで実装しました。
  • ツイート/ランキング機能: これはunity1week期間以降に追加した機能です。
    いずれもunityroom運営のnaichi (@naichilab) さんが提供されているライブラリを使用させていただきました。
    特にランキング機能は以前からつけてみたかったので、今回(期限後ですが)実装できたのはよかったです。
    これで次回以降も組み込めるかなと。

キャラクタ操作について補足

ADキーでの横移動、マウスでエイム、左マウス攻撃、右ジャンプという、FPSやテ○リア等のタイトルによく見られる操作かと思います。
個人的にスペースでのジャンプが苦手で、それよりも右クリックジャンプが楽な気がしているため、この操作方法が増えると良いなという思いもあります。
マウス併用はUI操作もしやすいですしPCでは標準的なデバイスなので、PC向けのタイトルを作成するなら、こういう構成が良いかなと考えていました。

ランキングについて

今回引っかかった部分を補足します。
使用させていただいたライブラリのスコア送信は double 型なのですが、スコア送信処理の際にタイムアタックの時間(float型ミリ秒)をそのまま使用していました。 ゲーム中はfloatだったため、何も考えずに値をセットしていたところ、ハイスコア更新判定で浮動小数精度による比較の問題が発生してしまいました。
(同数値のハズなのに、比較で一致しない) 結局、小数3位までの使用として、満たない桁を切り捨ててからdouble変換して使用しました。
切り捨て計算で誤差出るのも嫌なので、下記の様に一旦文字列にしてから対応にしました。(冗長かもしれません)

RankingLoader.Instance.SendScoreAndShowRanking(
    double.Parse(string.Format("{0:N3}", playTime)));

unity1weekについて感想

期限とお題が決まることで、普段なかなかできない「捨てる」判断が磨かれる気がしています。 また、回を重ねるごとに知見やコード、リソースが蓄積されていくので、いずれそれらを利用した集大成的なタイトルに仕上げることができればと思っています。 奇しくも今回はそんな感じになってしまいましたが。

作成したゲームがどなたかに遊んでいただけるというのも、非常にうれしいことです。
直接プレイヤーさんの反応を見ることはできませんが、様々な意見や感想をいただけるのは非常にありがたく嬉しく思いました。

謝辞

ゲームをプレイしていただいた方、感想・意見いただいた方、ありがとうございます。
また、開催・運営されているnaichi (@naichilab)さんにはこの場を借りて感謝申し上げます。