Unity 1 Week Game Jam お題「夏」

f:id:project-unknown:20170624232237p:plain Unity 1週間ゲームジャム | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

今回も性懲りも無く参加しました!
んで、性懲りもなくレポート書いてきます!

作ったゲーム

https://unityroom.com/games/patapata-unon

↑からPlayできるので是非遊んでみてください!

f:id:project-unknown:20170805131631g:plain

ずっとずっとやりたかった、我がProjectのマスコット(何もタイトル出してないのにマスコットだけは作っていた)のう〜のんを使ったゲームです。

企画

前回、ギリギリまで参加する/しないで悩んでいて、結果作業時間が殆ど確保出来なかったので、同じ轍は踏まないように、月曜の朝から通勤時間を用いてデザイナのぽぽたとSlackを用いて相談。

夏と言えば?でパッと思いついたもので以下のものが絞れました。

  • スイカ
  • 風鈴
  • 汗 (俺の一押し)

企画の詰め

スイカ

真っ先に考えたのが、スイカでFPSの案でした。

  • 主人公はスイカの種を口から発射してEnemyを倒す
  • スイカの種は、口の中からなくなったら、新しく食べてリロード
  • 腹がいっぱいの場合はスイカが食べられないから、動き回って空腹ゲージを増やす
  • スイカはお母さんから補充されて、たまに種無しスイカが出て来る所にイライラポイントを作る

個人的に満腹ゲージの反対を行くと言う所と、スイカのFPSという所がおもろいやんと思ったのですが、
いかんせん開発が間に合いそうに無いと言う理由で見送りました(いずれ作ってみたい

通勤時間中、汗だくになっていたと言うのあって思いついた案でした。

  • 満員電車で汗が垂れ落ちてくるので、他の人に飛び散る前に拭き取る
  • あまりに連続して拭くと周りの女性から痴漢と勘違いされ人生が詰む

ここまで考えて、痴漢の所が最近話題と言うのと、社会的倫理としてどうよと思ったので没

風鈴

  • あるクーラーが買えない貧乏一家が暑くて耐えられなく、風鈴を拾ってくる。
  • ただ風が一切無い状態なので、風鈴が鳴らず哀愁を漂わせている。
    • 結局貧乏は止めて、おじいさんが風鈴が鳴らずに困っている設定になりました。
  • そこに主人公がこっそり影で風鈴を鳴らして涼しさを提供すると言うゲーム案が出ました。
  • パッと考えた感じでぽぽたと完全に意見があったのでこれで行こうと言う事になりました。

言い訳開始

前回でも載せてた以下のつぶやきですが、

完了と書いておきながら、現在この記事を書いている間も続行中です
なので、平日は家に帰るのが日付を超えてからじゃないと帰れなかったのでまったく作業出来ませんでした。

土曜

この日からガッツリ作業する予定だったのですが、

kenjin.unity3d.jp

上記に参加した為、作業を開始したのは夜でした。(凄い勉強になったので、個人的には行って良かったです。

夜から、ぽぽたと合流して、製作開始です。

折角、今回新規に参加するんだから、Unityのバージョンを上げてしまえと勢いで2017.1.03fへupdateを行ったら、ものの見事につまりました。
(以下の記事に詰まった詳細を載せております)

project-unknown.hatenablog.com

予めどんなことをやるのかの大枠を決めていたと言うのと、
主人公を我がProjectのマスコットである「う〜のん」を使うと言う所もあり、
あまり議論を交わさずとも、殆どゴールの共有が出来ていました。
↓う〜のんのイメージ図

f:id:project-unknown:20170806030024p:plain f:id:project-unknown:20170806030034p:plain

ここでなんとなくでゴールの共有が出来ていたのは、自分らの中でう〜のんのキャラ付けが強烈に出来上がっていた為、
う〜のんをゲームに登場させると言うだけで、どんなタッチのゲームになるのかが想像できていたと言うのがでかいです。
(こう考えると、インパクトの強いキャラから考えてもゲーム企画もそうですが、コミュニケーションコストがかなり軽減出来るかもですね

この日は画像を用意してもらって、Unity上でざっくり動作させる所(以下Gif参照)で力尽きる。

f:id:project-unknown:20170806030631g:plain

日曜(最終日)

この日はお昼からガッツリ開発開始。
bitbucketに並べたかんばんのタスクが30個から一切減らない(消化スピードより、新たに見つかるもののスピードの方が早い)という絶望を噛み締めながら仕上げていきます。
相変わらず夜になっても、半分くらいしか開発が終わっていなく、ゲームデザインの調整をしている暇も無く、締め切りの20時が過ぎ去っていきます。

23時頃にある程度の完成の目処がたち、WebGLに初めて書き出してみたのですが、ここでWebGLで表示するとuGUIが尽く想定の斜め上を行く現象が発生
おそらくLayoutあたりの指定が甘かったのがあるのだと思うのですが、尽く小さくなっちゃってUIとしての機能を果たしてくれない状態でした。
(結局四の五の行っている状況ではなかったので、全てのUIを固定幅で指定してUploadしました。

開発部分のお話

2Dを採用した理由

これまで世に出していないだけで、色々ゲームは作っていて、2Dの方が経験値として高かったと言うのと、やはりう〜のんのキャラ的に2Dの方が遥かに映えるので、ここは特に考えることも無く2Dで製造しました。

AI(おじいさんの実装)

  • 理想
    • 一定時間で振り向く
    • 引き戸を素早く開くと音に反応する
    • 風鈴が鳴りすぎると振り向く
  • 現実
    • 一定時間(乱数)で振り向く

余り作り込めて無いです。そのせいで挙動不審な勢いで振り向く時があります。

タッチ判定

なんだかんだでここに時間がかかってしまいました。(Asset買っておけば良かった...)
Eventシステムが余り使い慣れていないと言うのもあり、ドラッグとクリックでうまく処理を分ける所につまずいて居ました。
色々グーグル先生に尋ねたりして、UI周りのHandlerにDelegateを突っ込む形で実現

public class TouchEventHandler : BaseSingletonMonoBehaviourOnGameObject<TouchEventHandler>, IPointerDownHandler, IPointerUpHandler, IBeginDragHandler, IEndDragHandler, IDragHandler{

    //タップ中
    private bool _isPressing = false;
    public  bool  IsPressing{
        get{return _isPressing;}
    }

    //ドラック中か
    private bool _isDragging = false;
    public  bool  IsDragging{
        get{return _isDragging;}
    }

    //ピンチ中かのフラグ
    private bool _isPinching = false;
    public  bool  IsPinching{
        get{return _isPinching;}
    }

    //全フレームでのドラック位置(ワールド座標)
    private Vector3 _beforeTapWorldPoint;

    //ピンチ開始時の指の距離
    private float _beforeDistanceOfPinch;

    //タップ関係
    public event Action<bool> onPress       = delegate {};
    public event Action        onBeginPress  = delegate {};
    public event Action        onEndPress    = delegate {};

    //ドラッグ
    public event Action<Vector2> onDrag      = delegate {};
    public event Action<Vector3> onDragIn3D  = delegate {};
    public event Action          onBeginDrag = delegate {};
    public event Action          onEndDrag   = delegate {};

    //ビンチ
    public event Action<float> onPinch      = delegate {};
    public event Action        onBeginPinch = delegate {};
    public event Action        onEndPinch   = delegate {};

/* 以下省略 */

Animation

簡単なAnimationが多かったので、メカニムを使うのではなく、ここもコードでパラパラ漫画を使って乗り切ってます。
(どんだけ追い込まれているんだ…)
基本はAnimation部分をコルーチン化しておき、条件に応じてコルーチンを発動と言う形で動かしています。

利用したAsset

拡張しやすいFSM:『Arbor 2』

主に画面遷移、ボタン操作等に利用

このブログでも何度か登場していますので、以下も御覧ください。

www.project-unknown.jp

www.project-unknown.jp

www.project-unknown.jp

www.project-unknown.jp

DOTween

簡単なAnimation等は、Animator等を使うより、こっちでコードベースで書き起こしたほうが早いです。

Easy Save - The Complete Save & Load Tool for Unity

主に保存機能の時に利用。
ノリはiOSのUserDefaultsみたいに軽いノリで掛けるのが個人的に神がかっているAssetです。

Game Music Pack - SUITE

ゲームミュージックの詰め合わせです。
バリエーションが豊富で、1つ持っていれば大体のゲームに使えそうですし、何よりクオリティが高い。

4500 GUI Elements Pack

ひと昔前のゲームは全てこのAsset使ってたんじゃないのか?と言うレベルに見たことがあるパーツの組み合わせです。
ちょっと古いアイコンが多いですが、それでもまだまだ現役で使えるようなアイコンが数多くあり、重宝しています。

反省点

Unityの機能を使いこなせてない

Unityそこそこ使ってきたつもりで居たけど、まったく使いこなせていない。
Unityの機能を使うより、コードで書いたほうが早いと言う判断が出る時点で駄目。

息をするように使えるようにスキルを挙げないといかん

共通化処理をもっと纏める。

前回書いていた処理を今回も書いていたと言うところはいただけないので、共通化する。
また、今回詰まったドラッグ+クリック周りの処理は良く出てくるはずなので、これも共通化処理として纏めておく。
ちなみに、今纏め始めている最中で、以下の用に纏めつつあります。

f:id:project-unknown:20170806034123p:plain

オブジェクト脳を鍛える

やっぱりテンパると1つのクラスの処理を纏めがちになっており、現在リファクタしているのですが、非常に読みにくい。
もっとオブジェクト脳を鍛えていかないといけないなーと猛省しております。
(業務でもSwiftとかバリバリオブジェクト指向で書いているので、ここは自信があったのですがダメダメでした。

感想

前回と同じ所で、やっぱり期限とお題があるのは本当にありがたいです。
このイベントのお陰で、今自分が持っている武器はなんだろう?しかもその武器は速度が出るのか?を常に考えて実装に入っているので、今自分が置かれている状況・スキルセットを振り返る良い機会になります。
また、一緒に弱点も見えて来るのと、勉強したい事柄も見えて来ます。

ぱたぱたう〜のんの今後

前回のFallStoneもやろうとして出来て居なかったのですが、折角ここまでの形にしたので、アプリ化を目指して現在進めています。
以下は、開発中のかんばん f:id:project-unknown:20170806034259p:plain

(既にタスクが30個もツンである(;・∀・)

そこまでクオリティある所まで持っていくのは厳しいかもですが、より遊び要素を追加したものを開発中ですので、リリースできた際は是非遊んでみてくださいね!