TIME HACKER Version 1.4.0 バックアップ機能を追加しました!

いつもTIME HACKERをご利用いただきありがとうございます。

今回のバージョン1.4.0で以下の対応を行いました。

  • バックアップ機能の追加を行いました!

  • データを他の端末に移すことが可能になりました。

  • その他に、報告をいただいていた不具合の修正を行いました。

バックアップ機能の追加を行いました!

f:id:project-unknown:20190913210259p:plain:w500

TIME HACKERにバックアップ機能を追加しました!

このバックアップ機能はiCloud上にバックアップを作る手法を採用しています。

そのため、Apple IDにログインするだけでご利用いただけます。

バージョンアップを行なったら、
ぜひ一度バックアップを行い、みなさまの大切な記録の保護してください。

詳細はヘルプページをご確認ください。

データを他の端末に移すことが可能になりました。

f:id:project-unknown:20190909213844p:plain:w600

バックアップ機能を応用し、データを他の端末に移すことが可能になりました。

大まかなやり方は以下の通りです。

  1. Apple IDにログインし利用中の端末で「iCloudにバックアップ」を行います。
  2. 新たに利用したい端末でバックアップしたときに利用したApple IDでサインインします。
  3. TIME HACKERをインストールし、「iCloudから復元」を行います。

機種変更などにご活用頂ければ幸いです。

詳しくはヘルプページをご覧ください。

今後ともTIME HACKERを是非ご利用ください!


まだTIME HACKERをお使いでなければ、是非ともこの機会にTIME HACKERをご利用ください!

img


ヘルプページ
ご意見・ご要望
TIME HACKER関連記事

TIME HACKER Version 1.3.0 新規アイコンを追加しました

いつもTIME HACKERをご利用いただきありがとうございます。

今回のバージョン1.3.0で以下の対応を行いました。

  • ご要望のあったアイコン、並びに新規のアイコンを追加しました

ご要望のあったアイコン、並びに新規のアイコンを追加しました

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

今回はご要望のあったアイコンに加え、Project.Unknownとしておすすめしたい新規のアイコンを追加しました。

  • 交通系アイコンの追加
  • ペット系アイコンの追加
  • 家事系アイコンの追加

また、お店のアイコンが分かりづらかったので、一部修正を行っております。

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

是非ご利用ください!


まだTIME HACKERをお使いでなければ、是非ともこの機会にTIME HACKERをご利用ください!

img


ヘルプページ
ご意見・ご要望
TIME HACKER関連記事

TIME HACKER Version 1.2.0 Apple Watch対応を行いました

いつもTIME HACKERをご利用いただきありがとうございます。

今回のバージョン1.2.0で以下の対応を行いました。

  • Apple Watchの対応
  • 一部不具合の修正
  • パフォーマンス向上対応

Apple Watchの対応

トップ画面
f:id:project-unknown:20190309232306p:plain

計測中の画面
f:id:project-unknown:20190309232314p:plain

もちろん、Apple Watchで計測したデータはiPhone上に記録されますし、計測をiPhone上のアプリ、Widgetで終了する事もできます。
(逆もまたしかりです)

わざわざiPhoneを開かなくても簡単に行動を記録できるようになった世界観になっております。
是非お使いくださいませ!


まだTIME HACKERをお使いでなければ、是非ともこの機会にTIME HACKERをご利用ください!

img


ヘルプページ
ご意見・ご要望
TIME HACKER関連記事

TIME HACKER Version 1.1.0 ウィジェット対応と新規アイコンを追加しました

いつもTIME HACKERをご利用いただきありがとうございます。

今回のバージョン1.1.0で以下の対応を行いました。

  • ウィジェットでも記録できるようになりました。
  • ご要望のあったアイコンを追加しました。

ウィジェットでも記録できるようになりました。

ウィジェットにTIME HACKERを表示していただく事で、アプリを起動しなくても行動の記録が取れるようになりました。

これにより、更に日々の行動が記録しやすくなりましたので、是非ともご利用ください!

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

ウィジェットに表示されるアクションは、アプリに登録してあるアクションの上から6番目までが表示されます。

また、記録を計測している場合は、以下のような画面となります。

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

このように2件までの記録中のアクションが表示されます。

また、ストップボタンを押すことで、計測を終了することも出来ます。

ご要望のあったアイコンを追加しました

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

今回は育児系のアイコンのご要望を戴いたので、6種類のアイコンをご用意致しました!
是非ご利用ください!


まだTIME HACKERをお使いでなければ、是非ともこの機会にTIME HACKERをご利用ください!

img


ヘルプページ
ご意見・ご要望
TIME HACKER関連記事

TIME HACKER メイキング

TIME HACKERリリースしました!

img

TIME HACKERをめでたくリリースすることができました。
まだの人は是非この機会にお試しください!

今回は、TIME HACKERを作るにあたり、その制作過程について記載していこうと思います。
今回の記事では、

  • どんなUX思想で作ったのか?
  • 設計思想はどうしたのか?
  • アプリ実装面での設計は?
  • マネタイズについて

上記を、書ける範囲で載せましたので、 これからアプリを作ろうとしている人へは、制作過程の参考に、
同業者の方へは、苦難の共感が得られれば幸いです。

TIME HACKERを作ることとなった動機

時間が欲しい

世の中のサラリーマンの殆どがそうだと思いますが、とにかく時間が無い。
平日に、スキルアップのための勉強や、アプリ造りを行いたくても、家に着くのが日付をまたがる時間帯になる為、中々実施することができません。

休日にやろうと思うのですが、、いざ休日になったら平日の疲れを癒やすために、ガッツリ休んでしまう等、自分のやりたいことがやれない毎日でした。

もう社会人生活も10年を超えてきて、一向に改善しない毎日に諦めの気持ちすら抱いていた際に、一冊の本と出会いました。

ライフハック大全

ふと手にとった、以下の「ライフハック大全―人生と仕事を変える小さな習慣250」という本が私の中で革命的でした。

何個もあるライフハックは、殆どが私の血肉になる位に、良い知識を仕入れる事ができたのですが、その中でも、最も私の中でためになったのは、

自分の1日の行動ログを取って、無駄に過ごしているところは無いか?を見返すことで時間を捻出する術

これにものすごく感銘を受け、その時のツイートが以下。

実際にこのライフハックを実施してみました。
私は1日の中で、以下の時間をもっと取りたいと考えています。

  • 読書をして自己啓発と勉強
  • PCを使ってプログラムや新技術の勉強
  • 個人アプリ、ゲームの開発

この観点を元に、1日の行動ログを記録し、時間を生み出すことが出来ないか分析してみます。
(メモ帳に走り書きしていた為、時間が入っていたり入っていなかったりしてます。)

  1. 8:00 起床
  2. 出る準備 20分 8:20
  3. 家を出てからバスにならぶ 10分 8:31
  4. バス乗車時間 13分 8:45
  5. 電車待ち時間 16分 9:02
  6. 特急 30分 乗り換え後、○○から△△ 20分 計50分 9:50
  7. 以降会社
  8. エレベーター待ちと朝の準備 16分 10:06
  9. タバコ 5分
  10. インシデント対応 41分 10:53
  11. 今日のタスクプランニング 9分 11:00
  12. ○○ミーティング 24分 11:27
  13. トイレとタバコ 15分 11:45
  14. 今年度のプロジェクト目標について議論 15分 12:00
  15. 昼飯と移動 30分 12:30
  16. タバコ 15分 12:45
  17. 目標についての議論 15分 13:00
  18. 溜まっていたSlackやり取り 21分
  19. タバコ 15分 13:40
  20. 雑務 15分
  21. 新規企画のKPI試算 vol1 45分 14:40
  22. タバコ 10分
  23. 新規企画のKPI試算 vol2 48分 15:45
  24. タバコ10分
  25. 部下面談 36分
  26. タバコ 10分
  27. ○○チーム向けプレゼン資料作成 10分
  28. △△MTG 40分
  29. ☓☓MTG 1時間30分
  30. タバコと帰る準備 10分 19:30
  31. ○○まで移動 20分
  32. △△まで 35分
  33. ジムで運動 1時間
  34. ジムの風呂 30分
  35. 買い物 10分
  36. バス停まで移動 5分
  37. バス待ちとバス乗車 18分
  38. タバコ 5分
  39. 家移動2分
  40. 家に着いて落ち着くまで 7分
  41. ダラダラ過ごす 2時間
  42. 風呂とダラダラ 30分
  43. 就寝 1:17

この日を振り返って見ると、例えば、以下を改善できそうです。

タバコ時間を読書時間に企てる

タバコの時間をタバコ + スキルアップのための読書(Kindle)を行うとしたら、80分読書時間が確保出来ます。
全てのタバコの時間を企てるのは難しいのと、読書の開始時には思い返しの時間も必要な事を鑑みても、50分は読書時間が確保できます。

移動時間を読書・勉強時間に企てる

また、バスの時間がトータル31分。電車の時間は特急が65分、在来線が40分。
バスと在来線は基本立つので、ここを読書に当てると71分。

特急は座ることが出来ますが、片道30分程度なので開発するには時間が足りなく見えるので、PCを使った勉強時間に企てると、65分勉強時間が確保できます。

ここまで考えると、家に帰るまでに、以下の時間を確保することがわかります。

  • 読書時間を121分
  • 勉強に65分

ただ、この勉強・読書時間は断片化した時間なので、効率は悪いですが、それでも家に変えるまでに、これだけの事が行えるので、

家では、アプリ開発に集中することができる。いやアプリ開発だけしていていいのです。

これまでだと、「勉強もしないと」「本も読まないと…」と考えがよぎって中々集中出来なかったのですが、
一日の無駄な時間、スキマ時間に十分に勉強を行えているので、家でやる必要が無いのです。

そして、家でダラダラとする時間を2時間から半分削るだけで、1時間確保出来ます。
更にストイックに削れば1時間半〜2時間確保できるでしょう。

ここまで見てわかるように、

1日の時間を細かく記録する事と、分析する事は、忙しいビジネスマンに取って、ものすごく有益である

ことがわかります。

そして、有益で有ることがわかった次は、もっと楽に記録したい・分析したいと思い、今回の「TIME HACKER」アプリに繋がります。

私自身の生活の質を向上させるために、どうしてもこの手のアプリが欲しかったのと、私の中でしっくり来るアプリがStoreに並んでいなかったので、何としてでも手に入れたかった。

気がつけば、全ての開発や勉強を停止して、着手していました。

(なんだかんだで7ヶ月も造ってた…)


仕様検討

コアバリューを決める

いつもは凄い悩む所だったのですが、ここは作り出した動機が動機なので、すぐに固まっていました。

アプリ制作初期は

無駄な時間を管理し、自分のスキルアップに企てたい時間を確保する

で、最後までここは変わらなかったのですが、
もっと範囲を広げて、以下を最終的なコアバリューとしました。

自分の時間を管理し、生活改善のサポートをするアプリ

ターゲット層を考える

ターゲット層は、女性でも・男性でもありませんし、
特段ペルソナも考えていません。

TIME HACKERでは、以下のユーザーをターゲットとして捉えています。

  • 気づいたら時間ばかり過ぎている人
  • 忙しくて自分の時間が確保出来ない人
  • 自分のスキルアップの時間を確保したい人
  • 日々の生活をもっと有意義に送りたい人

UXを検討する

大体のアプリに言えることですが、
このアプリはUXが特に肝となります。

  • 何より、毎日、しかも小刻みにアプリを立ち上げて行動のログを計測しないといけない。
  • それには、ユーザーのアプリ上の動作だけではなく、生活のリズムを一瞬でも妨げてはいけない。
  • 特に、行動ログを記録忘れた場合は、一気に記録するモチベーションが下がります。なので記録忘れを防がなければならない。
    • (結局、ここのサポート部分は1stリリースからは見送りました。)

上記をいろいろ考えてUXを造っている際に、取っていたメモが以下です。

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

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

結局、当時考えていた機能の半分くらいしか実現できていないのですが…。

UIを検討する

ここもUX並にメチャクチャ苦労しました。
なんだかんだで、2ヶ月近く、あーでもないこーでもないをやっていたんじゃないかしら。

ちなみに、最初期の頃に考えていたUI

f:id:project-unknown:20180713010102p:plain:w400

全く違いますね…。
今見ると、個人的に結構しんどいUIですが、当時はこれでいける!!と信じて止みませんでした。
結局、2日位、寝かせてから再度この画像を見て、くっそだせぇって思って、やり直しました
その時の温度感だけで決めるのではなく、一度寝かせるのは大事ですね。

次に考えたのが、以下のUIです。
文字情報を見るのではなくて、行動をアイコン化し、なれたら無意識で記録ができる事を狙っています。
また、無意識で押せる事を狙って、アイコンも結構大きめに設定してます。

f:id:project-unknown:20180713010403p:plain:w400

だいぶ、今の原型が見え隠れしていますね。
ここから、紆余曲折を経て、以下の様な画面で落ち着きました。

f:id:project-unknown:20180713010500p:plain:w400

マネタイズを検討する

TIME HACKERで、現在実装済みのマネタイズをご紹介します。
今後のマネタイズは敢えて載せません。
お金の匂いがプンプンする機能が追加されたら、「あっ、マネタイズに走ってるな」とでも思ってください。

  • アプリトップにバナー広告
  • 一定の回数計測を行った際のインタースティシャル

バナー広告

バナー広告は、KeyHolderでも実装しているのと、KeyHolderでも操作の邪魔にならないところに設置していますが、結構馬鹿にならないくらいの収益を上げてくれます。
UXの所でも述べていますが、TIME HACKERは、UXがとにかく命です。ユーザの行動を阻害する事をしようものなら、記録が面倒になり一気に使わなくなります
なので、バナー広告を設置するにあたり、アプリの操作を阻害する事はしないような画面設計にしています。

インタースティシャル広告

KeyHolderでは、インタースティシャル広告を出さずに本当に公開しました。
というか、KeyHolderはシンプルを極めすぎてインタースティシャル広告を入れる余地が無く、入れようものならアプリとしての価値を大きく欠損しかねるので、断念しました。

なので、TIME HACKERではインタースティシャルは仕様検討の総初期から、なんとかして入れられないかを深く検討しています。
(書けば書くほど、金儲けが全面に出てしまうので、引かれるリスクはありますが、それでもこの記事を記載しています)

バナー広告の項でも記載しましたが、TIME HACKERは何よりUXが命なので、インタースティシャル広告を入れる箇所には最新の注意を払っています。

TIME HACKERでインタースティシャスは、一定の時間、一定の回数、行動ログを取った際に、行動ログを記録したタイミングで広告表示を行っています。
これは、ユーザーとして考えた際に、行動ログを計測する直前に広告が表示されたら、ユーザーの行動を阻害するリスクが非常に高まる為、記録を開始したタイミングで広告を表示することにしました。

行動ログを記録した後に広告を表示しているので、マネタイズとしての期待値は大きく下がると思いますが、私が考えている一番のリスクは、

眼の前の収益に目がくらんで、ユーザの行動を阻害する事で、アプリをアンインストールされる事を一番のリスクとして捉えています

また、上記で一定の回数と記載しましたが、初回リリースまでにどの回数が妥当なのか?の結論を出すことが出来ませんでした。

ですので、FirebaseのA/Bテストを採用して、インタースティシャル広告を出すタイミングの検証を行っています。

www.project-unknown.jp

ここまでは、アプリ設計のお話でした。
次に、実装面でのお話をしていこうと思います。

実装開始

さぁ、ここからお祭りの始まりです。
いやぁ…とにかく紆余曲折しまくった…。

プロトタイプ開発

今回のアプリ開発では、特に真新しい事を中心に、やりたいことは何でもやろうと思い色々tryしました。

大きい所で言うと、

Carthageにも挑戦しましたし

www.project-unknown.jp

Quickにも挑戦しましたし

www.project-unknown.jp

RealmSwiftにも挑戦しました

www.project-unknown.jp

Firebaseにメインの解析機能を移管しましたし、
Firebaseを使ってA/Bテストにも挑戦しています。

www.project-unknown.jp

以下の「Code Complete」等の技術書も読み漁り、開発設計についての色々な挑戦も行いました。

そして気づいたのが、

tryばっかしていて、いつまで経っても完成しない

特に、開発設計のところは、色々な本を読みすぎて、読む本全てに影響を受けて設計が日々変わりすぎていっているのが色々と足を引っ張りました。
こんなところにもエターナル現象は顔をだすんですね。

なので、プロトタイプとしてある程度のものが出来上がったタイミングで、tryは封印し、アプリ完成にフォーカスする事にしました。

以後は、アプリ制作時に大きな節目について記載します。

DBシステムの変更

これまでDBをRealmSwiftで開発していたのですが、
諸々の事情で、結局CoreDataに移しました。

RealmSwiftはCoreDataと違い、Objectを生成して値を突っ込むだけで物理領域にも保存され、直感的にデータを扱うことができる優れもので、開発当初はRealmSwiftを崇拝してやまなかったです。

しかし、

  • DeleteRuleが使えない
  • マイグレーション時に、意図しないデータが潜り込む
  • トランザクション範囲が操作し辛い

等、不満が次々と湧いてきて、最終的にCoreDataにデータを移管しました。

ココらへんは、ここに詳細を記載しています

ただ、RealmSwiftとCoreDataとでは、やはりアプリ設計が異なってくる為、ここを直すために、結構作り直しを余儀なくされました。

(それでもDAOを全て直す気力は無く、一部のDAOはRealmSwift前提とした設計のままになってしまっています)

アイコンをやっぱり全部自分らで造ることにする

開発完了が大きく遅れたのは、ここが原因です。ですがこれは英断だと思っています。

これまで、アイコンをフリーで提供してくださっているサイト様から使わせてもらうつもりでおり、完成直前までこれで行くつもりまんまんでした。

ただ、せっかく造るんだからアイコンも自作する事に決め、ぽぽたが泣きながら作業開始しました。

元々100を超えるアイコンを他サイト様のフリー素材から用意していたのですが、
流石に、この量を開発過渡期に用意するのは無理があったので、数を70ほどにしぼりました。

https://cdn-ak.f.st-hatena.com/images/fotolife/p/project-unknown/20180716/20180716161615.png
(作成したアイコン一覧)

この辺の詳細については、ぽぽたが詳細の記事に起こしています。

www.project-unknown.jp

始まるエターナル化

今回一番厄介だったエターナル化は、機能のエターナル化より、コードのエターナル化でした。
一つの機能を造る度に、4,5回リファクタリングを行ったり。
一度仕上げたコードを、設計しなおしたり。
自分が満足するまで何度も何度も作り直してました。

ただ、これって、

システムの保守性だけ上がって、いつまで経ってもリリースできなくなる自体を引き起こしていました

確かに保守性は非常に大事なのですが、とにかく時間がかかる。
プライベート開発なので納期を気にしないというのが更に拍車をかけてしまっていました。

塩梅を調整するのが本当に難しい…。
このリファクタリングも最終的には自分の中で最低限に抑えるようにしました。

例えば、以下の時だけリファクタリングを行うようにしています。

  • DRYを守れていない
  • SOLIDの原則に準拠していない
  • ViewからModelクラスの細かいメソッドにまでアクセスしようとした時

観点は以下です。


DRYを守れていない

似た機能が乱立した場合、開発過渡期になればなるほど、修正漏れによるさらなる不具合、進捗の遅れに響きます。
ここは徹底的に潰しました。
ちなみにDRYが有名になったのは、以下の「達人プログラマー」からですね。この概念は道を踏み外しそうになった際の羅針盤になり得る考えでいつも大いに助けられています。


SOLIDの原則に準拠していない

iOSライクなMVVMとかではなく、またはプロトコル指向でもなく、オブジェクト指向の1つの考えであるSOLIDをとにかく大事にしました。

プロトコル指向で統一したかった所はありますが、Swiftのプロトコル指向は熟成されていません。これを守るがあまりに無駄で汚いコードになりがちです(会社の現場でこれに囚われて、意味不明なコードを書くエンジニアを散々見ています)。

また、何でもかんでもMVVMを採用するのは愚の骨頂です。ただクラスを増やすだけで、自己満足だけ満たされるコードになるでしょう。
こういうのは適材適所であるべきです。

なので、SOLIDの原則だけを準拠することにしています。
これはDRYを包括している思想ですので、DRYルールと非常に相性が良い。

以下は、SOLIDの原則について記載しています。

  • S - 単一責任の原則 (Single Responsibility Principle)
  • O - 開放・閉鎖原則 (Open/closed principle)
  • L - リスコフ置換原則 (Liskov substitution principle)
  • I - インタフェース分離の原則 (Interface segregation principle)
  • D - 依存性逆転の原則 (Dependency inversion principle)

当たり前だけど、気がついたら守れていない原則ですが、ちゃんと守れている時の効果は絶大です。
このルールには非常に気を使いました。


ViewからModelクラスの細かいメソッドにまでアクセスしようとした時

これはSOLIDの一種ですね。
ViewからModelのデータをごにょごにょするのはイケていません。
その場はそれで良いかもしれませんが、後ほど似たようなデータアクセスが必要になる度にインタフェースを作る羽目になります。


終わらないローカライズ

TIME HACKERは日本以外の世界で発信しています。
細かく言うと、GDPRを受け、EU諸国を除いた全世界に発信しています。

アプリ内のローカライズは、元々ローカライズを意識した実装を行う癖があったので、さほど問題無かったのですが、
問題は、ブログに紹介やらヘルプやらをやたらと親切に記載してしまっていた為、これら全てをローカライズする必要ができました

いやぁー、これはアプリをリリースするのを辞めるか悩むくらい霹靂しました。
最後の1ヶ月間は、このローカライズを延々とやっていた気がします。
実際にアプリ以外のローカライズは以下を対応しました。

繰り返しますが、、

アプリのローカライズ以上に、このローカライズの方が遥かにしんどかったです

しかも、後述しますが、最終的にこの1ヶ月の作業は殆ど無駄になり、申請日にプロジェクトメンバー総掛かりで作り直してます。

最後の追い込み

具体的な日付だと、2018/7/15(土)にプロジェクトメンバーで集まり、
最終テスト、ヘルプページやプロモーションページの仕上げを行って、
夜までに申請を上げて打ち上げを想定していたのですが…、

相次ぐ不具合
まさかの、申請日にUI変更
UI変更に引っ張られて、全ての画像変更

が発生し、気づいたら申請したのは、2018/7/16(日)の夜でした…。
特に、UI変更が本当にしんどかった…。
これにより、具体的には、

以下の、ストアキャプチャ作り直し

英語版iPhoneX

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

英語版5.5 inch

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

日本語版iPhoneX

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

日本語版5.5inch

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

というか、最後の2日間、殆ど画像の差し替えしかやってない気がする…。


くらうリジェクト

今書いているブログ記事もそうですが、
申請を待っている間に、私含め、ぽぽたもTIME HACKER関連の記事を色々書き溜め、申請が通ったらアプリのリリースも含め、ブログ記事のリリースをするために待ち構えていましたが、ものの見事にリジェクトをくらいました

内容は

2. 4 Performance: Hardware Compatibility
Guideline 2.4.1 – Performance – Hardware Compatibility

iPadでの表示が崩れているから、ちゃんとUI整えろよというご指摘です。

実は、リリース前にiPadで表示が崩れる事を知っていましたし、Appleの審査する人はiPadで審査するということも知っていました。

(iPhoneアプリであっても、iPadに内蔵されているiPhoneシミュレータで動くべきであるという考えなので、私が知る限りでは、iPadで審査を行っていそうです。)

ですが、まぁ、操作できない事ないじゃんという謎の過信で、対応を見送っていたところを、案の定指摘されました。

もう、目も当てられない…。

こちら、OSSを使ってUI表現していた所だったので、ライセンスの問題もあり、手を加えるわけにもいきませんから、その場しのぎとして、表示崩れが発生する端末では、一部機能を削除して再申請しました。

初回リリースで諦めた事

たくさんあります。
本当にたくさんあります。

何故か申請日にiTunes Connectの調子が悪くて、iTunes Connectにバイナリアップロードするのに数時間かかった為、
心が盛大にポッキリ折れて、気づいていた簡単なバグはそのままにしてしまっていたり、

UXの検討の時に記録忘れ防止のための通知機能も、
通知タイミングを間違えたらユーザーの不満がものすごく上がりそうという、チキンハートがひょっこり顔を出して見送ったり、

本当に色々積み残しています。

ざっくりと列挙すると、以下の機能を初回リリースでは諦めています。

通知機能

上述した通りです

Apple Watch

Twitterに思いっきりApple Watch化すると記載しているのに、工数の兼ね合いという大人の都合で諦めてます。

Widget対応

大人の都合

分析機能の何点か

最終的にTIME HACKERの押しにしていきたいのですが、
まずは、ユーザーの行動ログを貯めることが何より優先すべき事だったので、ここの機能も結構諦めています。

アプリ内課金

やりたかった…。
本当にやりたかった…。
できなかった…。

KPT

締めくくりとして、今回のTIME HACKERのKPTを考えたいと思います。

Keep

自分の信念を最後まで貫いた

ライフハック大全を読んで、是非このアプリを使いたい、そして造りたいと言う思いを最後まで貫けたのは良かった。

このアプリは、万人受けするアプリではないという事はわかっています。
しかし、ターゲット層項目に記載した人に長く使ってもらう事だけを想定して造っています。

エターナル化を防いだ

本当はAppleWatch、Widget、分析機能の強化、Push等もっとやりたかったけど、これを全て捨てました。
初回リリースでは、ユーザーのログを貯めることを何より重要視し、それ以外の機能は二の次にしました
結果として、この判断を行わなければ、リリースは来年になっていたでしょう。

Problem

何でもかんでもやりすぎた

最低限の事だけしかやっていないつもりだったのですが、今考えると色々手を広げすぎたと思います。

特にローカライズはリリース後でも良かったかもしれません…が、iTunes Connectの仕組み上、プライマリー言語を最初から英語に指定していないと、後々更に面倒な事になっていたので、これでよかったのかもしれませんが…。

またヘルプやプロモーションはやりすぎました、これこそリリース後でも良かった。

至る所でチキンハートが顔を出した

RealmSwiftをやめたのも結局の所、チキンハートが問題でしたし、
チキンハートが顔を出したせいで、ハレーションを生みそうな機能を見送ったり、もっと強気に造っても良かった。

プロジェクトとして、集まって作業する頻度が少なすぎた

最近はリモートワークが流行っていますが、やはり対面でやり取りする作業だと、それぞれのクオリティ・速度が全然違います。

特に申請日に集まって、最後のテストを行った際の不具合の出方がやばかったです。
もうちょっと早めに集まってテストするなどすれば、問題の早期発見に気づけたでしょう。

明らかにリスクがあるとわかっていた不具合を放置した

最後のリジェクトの所ですね。
これは本当にもう愚かだったとしか言いようが無い。
面倒くさがって、対応を先送りにした結果としか言いようが無い。

Try

プロジェクトとして集まる頻度を増やす

これはProblemの裏返しですね、クオリティ・速度を上げる意味で、無理にでも集まって集中して造る時間を確保したほうが良いです。

チキンハートをどうにかする

なにかする度に、いや契約が…とかいや請求一気にきたら怖いしー…とか、
出す前にでもでもだってを発揮して、チャンスをことごとく逃しているのがとにかくもったいない。
やる前に後悔するなら、やって後悔するの精神を持とうと思います。

多少面倒でも正しいことをする

これは最後のProblemの不具合と気づいていて目を背けたものに掛かります。
結局バグの放置や不具合の放置は、問題の先送りでしか無いですし、別な言い方をすれば、ローンと同じで先送りにすれば金利(より面倒な工数)が増えるものとし、リスクがあるものに関しては、速攻潰していくマインドは持ち続けなければと痛感しました。

最後に

自分たちで言うのも変な話ですが、TIME HACKERは、自分の時間を生み出す為に有用なツールに仕上がっています。
また、ユーザーの声を聞いて、機能追加やアイコン追加も行っていこうと思いますので、気になる事などありましたら、いつでも、以下のフォームよりお問い合わせください!

TIME HACKER ご要望・お問い合わせ

是非、TIME HACKERを使って、毎日の生活を少しでも改善していきましょう!

Unity 1 Week Game Jam お題 「当てる」

今回も参加しました

Alt text

今回も参加させてもらいました。
今回は反省すべき点が多くある(期日から1週間遅れた)ので、レポートを書いていきます。

作ったゲーム「BountyBommer」

Alt text

↑画像クリックでプレイできます。
爆弾を武器に戦う主人公が、マフィアに選挙された街を救うけど、
爆弾の取扱に失敗すると逆に街を破壊して賠償金を請求されると言うゲームです。 (過去にゲームセンターにあった、リアルドライブライクなゲーム)

1週目 月曜〜水曜

この時期はずっと企画を考えていました。
今回の企画は、個人的に考えやすそうだけど、色んな案を考えていると大体似たり寄ったりな着地点に行き着いてしまい、難易度が高かったです。
幾ら考えてもよくありそうな企画に行き着いてしまい、考えては消してを繰り返しました。

以下は実際に企画を考えてた際のマインドマップ

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

1週目 木曜〜土曜

建物が爆破された際の表現をどうするか考えたのですが、以下のAssetを採用しました。

このAssetはSpriteを簡単に細切れに破壊する表現を行うことが出来る為、今回のゲームには打ってつけのAssetです。

詳細な使い方はまた別途纏めようと思うので、どんなイメージで作るのかをサマリますが、

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

Inspector上で、爆破の範囲や細切れにするフラグメント等の見た目の制御を行い、
例えば、以下のコードをGameObjectとしてScene上に配置してあげれば、Scene上のSpriteはどんなものでも破壊できます。

public class SpriteExplode : MonoBehaviour {
    private Exploder2DObject _Exploder;

    void Start () {
        _Exploder = Exploder2D.Utils.Exploder2DSingleton.Exploder2DInstance;
    }

    public void ExplodeObject(GameObject obj) {

        var explodeObject = obj.GetComponent<SelfExplode>();
        if (explodeObject != null) {
            explodeObject.ExplodeObject();
        }
        _Exploder.transform.position = Exploder2DUtils.GetCentroid(obj);

        _Exploder.Radius = 0.1f;

        // DONE!
#if ENABLE_CRACK_AND_EXPLODE
        _Exploder.Crack(OnCracked);
#else
        _Exploder.Explode(OnExplosion);


#endif
    }

    /// 爆破完了後に呼ばれるコールバック
    void OnExplosion(float time, Exploder2DObject.ExplosionState state) {
        if (state == Exploder2DObject.ExplosionState.ExplosionFinished) {
            // Debug.Log("finish!");
        }
    }
}

※爆破の挙動はInspectorだけではなく、コード上からも柔軟に変更できます。

ただ、このAssetは1つだけ使いにくい所があって、このAssetのオブジェクトはシングルトン設計になっているため、複数Objectを指定した所で結局同じところで処理されてしまいます。
これが何を意味するのかと言うと、2D開発時にLayerを用いて奥行きや段差を意識する設計で作ってしまうと、Exploderが作用するLayerを切り替えて実装する事になるのですが、爆破解体されたSpriteまでExploderのLayerを引き継いでしまうため、挙動がおかしくなります。

今回のゲームでは最前面のLayerにだけExploderを作用させ、後ろのLayerはExploderを使わない方向で対応しています。

とまぁ、Exploder2Dの使い方に苦戦しつつも、1週目の土曜にはある程度ゲームとして形になる所までは完成していました。

1週目 日曜

通しでプレイした際に、ゲーム2週目で以下のErrorが出まくる事態に遭遇しました。

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.

エラーログそのままなのですが、2週目でとあるGameObjectにアクセスしようとした際に、既に開放されたGameObjectにアクセスしようとしてエラーが発生しています。
この不具合が本当に厄介で、別なオブジェクトからアクセスする時のみ発生して、例えば自分のライフサイクル(StartやUpdateメソッド)でアクセスすると、問題なく値が入っている事。
となると、古い参照が残ってしまっているのかと思われるのですが、その参照を残してしまっている所が具体的に分からず、
また、この不具合の質が悪い所は、WebGLの場合、ブラウザリロードしても参照を維持してしまう事です。

似たような所で、以下でも語られていましたがどれも効果はありませんでした。

answers.unity.com

answers.unity.com

answers.unity.com

stackoverflow.com

この日はほぼ、この不具合の調査を行っていたのですが、解決することが出来ず、締め切りの20時に。
まさか間に合わないと思っていなかったので、かなりショックを受けながら他の皆さんのゲームをプレイして癒やされてました。
いやーみなさん本当に凄い…。

2週目 月曜〜金曜

仕事が忙しく、基本終電帰りとなり殆ど着手出来てません…。

2週目 土曜〜日曜

この日にやっと原因がわかりました。
過去にiOSで言うNotification, Androidで言うEventBusライクな実装についての記事を書いたのですが、

www.project-unknown.jp

今回もこの設計を使っており、Scene切り替えのタイミングで通知の解除をし忘れていて、2週目以降は古い参照を保持し続けてしまった為に、古いGameObjectに通知されnullとなっていました。
まさかSubscribeして、Unsubscribeし忘れると言う初歩的なミス…。

この原因に気づいたのは本当にたまたまで、思考整理の為にリファクタしている最中に気づきました。

ここからは、残っていたUIを整えたり、WebGL用に解像度調整を行ったりして、やっとリリースすることが出来ました。

今回の反省点

過去の挑戦でも色々学ぶ事が多かったのですが、
今回は色々と反省すべき点が多い点で、物凄く自分の糧となったと思います。

後学へつなげる為に、反省点とその分析、next tryについて記そうと思います。(主に自分向け)

とにかく、今回は1つのバグを解決するのに凄い時間がかかったが、次回以降も何かに詰まってしまう事は大いに起こり得ると思ってます。
そこにどれだけ時間を掛けることが出来るかが大事で、他の難易度が低い所を以下に効率よく開発するかがポイントになりそうです。
(詰まる内容は読みにくいから、解決する時間を確保する方向で考える)

エターナル現象

今回は、企画の段階でエターナル化していました。
平日開発する時間が無いサラリーマンに、この規模を1週間で作るのは結構しんどいです。
システム開発に必要な不足な事態に対応できる程度のBufferの概念は持ち続けないといけないので、そうなると「捨てる判断」と「捨てる勇気」を成熟させる必要がありそうです。
ただ、逆に良かったのは作っている最中にあれもこれもはやらないように注意していたので、開発中のエターナル化が起きなかったのは良かったと思ってます。
と言うか、作ってる最中にもエターナル化してたらもっと時間がかかっていた事でしょう…。

どうすれば改善できるだろうか?

上記でも書きましたが、企画を作ったら、

  • 何を捨てるか?
  • 作るゲームのコアバリューは何か?

を考え、いちばん大切な所に時間を掛けて作るようにする。
それ以外は捨てる勢いで考えれるようにする。ここが私がかなり弱い所。

ただ、最低限の所(トップやらリザルトやら)は捨てにくい。
こういう所は、他でも使えるようなPrefabやPackage化して使いまわせるようにするべき。

資産を使いこなせていない

ゲームジャムが始まってから必要なアセットを見つけ出して勉強しだすのは効率が悪い。
企画を元に新規のアセットを導入する必要があるのならわかるけど、今まで購入したものについても、これまで一切触っていなくて、必要になって勉強し始めるのでは、ゲームジャムでは間に合わない

どうすれば改善できるだろうか?

  • やはり日々利用するアセットは勉強しておく必要がある。
  • Unityの勉強の意味で1から開発するでも良いが、私の目的はゲームを作って世に出す事。
  • その上で、車輪の再発明となることは可能な限り避けたい。
  • また、これをやる上で、平日取れて1時間くらいしか開発時間の確保が出来ないがここはどうするか。
    • 時間を分割するのが一番手っ取り早いが、そうなると30分がアプリやゲーム開発、もう30分が勉強となると、どちらもエンジンすらかからないと思う。
    • 日ごとに勉強の日、開発の日と分けるのがベスト。
      • 例えば、平日はゲームアプリ開発
      • 休日は半分が開発、もう半分が勉強
  • アセットのドキュメントを読むだけでは駄目。
    • 使っても忘れるのに、読むだけだと頭から速攻抜ける。
      • 実際にアセットを使って開発すべき。
      • 使った内容を、更にブログ等でアウトプットする事で、記憶の定着化を図る。

過去に開発したものを再開発している

アセットと同じ問題だが、過去に作ったものを新しいゲームでも再開発していた。
思い出して作る分、経験値稼ぎには良いが、こんなことをするくらいなら、やった事が無いことに力を注いだほうがスキルアップになりそう。

どうすれば改善できるだろうか?

  • 他でも使えそうなものはprefab化や、package化する。
    • 実はやっていたけど、管理の自分ルールが凄いことになっていて、いくつもプロジェクトが分岐し、何を使って良いのか、また管理コストが凄い事になっていた。
      • まずは、1つのプロジェクトに全てを纏める。

Unityを久々に触った

他のツール系アプリを開発しており、Unityを2,3ヶ月ぶりに触ったので思い出しに時間が掛かった。

どうすうれば改善できるだろうか?

  • 他のアプリを作っている時はUnityを触らないのは仕方ない
    • 上述した勉強の時に触ることで、忘れを防ぐ
    • アセットや共通処理の勉強やってりゃ忘れるのは防げるはず

利用Asset

主にSpriteの爆破解体に使っています。
こちらは主に2D用ですが、以下の用に3D用もあります。

ステートメントAssetです。PlayMakerが有名所ですが、Arborは自分での拡張が本当にやりやすいので、こちらを愛用させてもらっています。

保存機能を簡単に実装、Debugする為のAssetです。

KeyHolder Version 2.4.0 更新情報

いつもKeyHolderをご利用いただき有難うございます。
まだお使いになられていない方は、是非 こちらよりダウンロードください!

今回のVersion 2.4.0で、マスターパスワードをFace IDやTouch IDで解除する事が出来るようになりました。 以下に詳細な機能説明を記載します。

Face IDやTouch ID

Face IDやTouch IDはiPhone(iPad)が提供している生体認証で、Face IDはiPhone Xで利用出来る顔認証、Touch IDは指紋認証の事を指します。
今回のバージョンアップで、このFace ID, Touch IDを利用してKeyHolderを起動した際に表示されるマスターパスワードが解除出来るようになりました。

以下は、利用に当たっての注意事項です。

Face IDやTouch IDは端末に登録されていないと使えません

端末に登録されたFace IDやTouch IDを利用してKeyHolderのパスワードを解除しますので、端末に登録されていないと本機能はご利用頂けません。

まだ登録されていない場合は、iPhone XでFace IDを使うや、iPhone や iPad で Touch ID を使うを参考に、登録をお願い致します。

KeyHolderの内部でもFace IDやTouch IDを利用するか否かの設定を保持しています

例えば、端末に Face IDやTouch IDは登録しているけど、KeyHolderでは利用したくない等のニーズに応えるため、KeyHolderの内部でもFace IDやTouch IDを利用するか否かの設定を保持しています。

このKeyHolderで保持するFace IDやTouch IDは端末のFace IDやTouch IDとは結びついていませんのでご注意ください

ですので、KeyHolderでFace IDやTouch IDを利用する場合は、
端末の設定でFace IDやTouch IDを許可している且つ、KeyHolderアプリの設定もONにする必要があります

また、KeyHolderで保有するFace IDやTouch IDの設定はデフォルトでONになっております
この設定をOFFにしたい場合は、以下のキャプチャの通り、設定 -> Face ID / Touch IDの設定をOFFにしてください。

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

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

ご不明な点等御座いましたら、いつでもお問い合わせくださいませ。

written by Project.Unknown運営

KeyHolder Version 2.3.4 更新情報

いつもKeyHolderをご利用いただき有難うございます。
まだお使いになられていない方は、是非 こちらよりダウンロードください!

今回のVersionで、以下の対応を行いました。

  • パスワードリストの自動並べ替え機能
  • 更新情報を確認できる機能の追加
  • 一部不具合の修正

それぞれ、以下に詳細を記載致します。

パスワードリストの自動並べ替え機能

機能について

今回のパスワードリストの自動並べ替え機能で、KeyHolderは大きく分けて3つの並べ替えが行えるようになりました。
これにより、手動の並べ替えが大変で、パスワードリストがぐちゃぐちゃになってしまった場合、感覚的に並べ替えることができ、よりパスワードが探しやすくなりました。

  • カスタム
    • これまで通りの並べ替えの仕方です。
    • 新規に登録されたパスワードが上に並び、手動で並べ替える事が出来ます。
  • 五十音順 (辞書順)
    • アルファベット → 五十音順 → 漢字の順番にパスワードが並びます。
    • 手動での並べ替えは出来ません
  • よく使う順
    • よく閲覧する順にパスワードを並べます。
    • 手動での並べ替えは出来ません

使い方

設定メニューから設定します。

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

これまでの設定メニューに、並べ替え機能が追加されています。

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

上記からお好きな並べ替えを選択することで、パスワードリストが並び替わります。

更新情報を確認できる機能の追加

アプリのバージョンを上げて、初回立ち上げた際に、更新情報が表示されます。

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

ここで見逃しても、以下で確認できます

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

KeyHolder2.3.0 リリース前情報やら、今後の展望、今のKeyHolderのユーザ数等のKPIについて展開

はじめに

今日はKeyHolderについてです。
もうすぐKeyHolder - 2.3.0をリリースできそうなので、その前記事になります。
この記事では、2.3.0でやったことや、今後の展開、ずっと公開していなかったKeyHolderのKPIについてさらっと紹介します!

http://project-unknown.hatenablog.com/entry/2015/04/18/201907project-unknown.hatenablog.com

Version 2.3.0について

Version2.3.0で何をやったの?

見た目の変化は殆どありません。

  • これまでIDとパスワード、タイトル全てを入力しないと保存できない仕様だったものを、タイトルのみ必須とし、他は任意にしました。
    • (これが何気に一番要望が多かったので…)
  • 後、強いて言うなら設定のレイアウトを今時なものに変更し、公式・TwitterへのURLを追加したくらいです。

じゃあ何が変わったの

内部は全て変わりました。
KeyHolderはこれまでObjective-Cで記載されていた(リリースが2015年なので仕方ないのですが)ものを、swiftにフルスクラッチで書き直しました。
どれくらい変更が加わったかと言うと

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

KeyHolderはBitbucketで管理しているのですが、ざっくり344ファイル分のコードが書き換わってます。
(;・∀・) こんだけ変更を加えているけど、見た目が変わっていないのでメジャーバージョンを変更できないジレンマ。
他ゲーム開発やUnityの勉強と並行して1日辺り30分ずつKeyHolderの対応を行い、約1月位対応に時間がかかったと言う…。

全てSwift化する事によって

Objective-Cでも勿論出来るのですが、今後の機能拡張がすごくしやすくなりました。
どうしてもObjective-Cだとコードが煩雑になって拡張し辛かったのですが、それがなくなったことで、以後のVersion up時の工数負荷が多少なりとも軽減する事が出来ました。

今後の展望について

以下に記載している内容はお約束は出来ません、ただ対応の検討を考えている次第です

バックアップ機能

非常に要望の多い機能ですので、是非とも提供したいとずっと考えています。
が、バックアップ/復元を行うと言う事は、ユーザのデータをAppから外に出す事になるので、セキュリティ上本当にやっても良いのか?に結論が出せておりません。
また、少しでもセキュリティを向上させる意味で、iCloud連携を行い、同一AppleIDでなら復元できると言うところも視野に入れているのですが、
内部のデータロジックがiCloudに対応していない為、中々着手できていない次第です。

ただ、最低限、tsvやcsvで出力だけでも良いから…と言う声も多いので、
責任を丸投げしているようにも聞こえるかもしれませんが、ユーザの責任下の元メールかなにかで外部に出力すると言うところは対応を入れたいと思います。
(ただ、この場合機種変等で復元をしたいとなると思うのですが、このやり方も考えないとですね)

ちなみに機種変時ですが、iTunesのバックアップから復元でパスワードを移すことも出来ますので、新規iPhoneが出るまでにこの対応が間に合わなかった場合は、そちらをお試しください。

指紋認証でマスターパスワードを解除する

これも要望の多い機能ですね。
こちらに関しては前向きに実装していこうと考えてます

2018/1/8 機能実装しました!

www.project-unknown.jp

検索機能の提供

私が一番やりたい機能ですというか、私がまず欲しいです。 KeyHolderはシンプルさを一番のウリにしており、余分な情報は登録出来なくしている為、登録は非常に簡単なのですが、パスワードを探すのが大変になっていると思っています。
実際にカテゴリ機能を提供しておりますが、パスワードの量が多くなると、カテゴリ機能もあまり機能して来なくなると思ってますし、
また並べ替え機能も提供していますが、これに関しては並べ替えに手間がかかる分、KeyHolderのコンセプトと逆行しているんですよね…。
なので、Spotlightライクな検索機能を用意して、文字を入力する毎に絞り込まれていくようにする事で、パスワードを取り出す作業もシンプルに高速に行えるようにしていきたいと考えております。

鍵生成

以外だったのですが、これについても要望がそこそこあります。
KeyHolderのコンセプトを壊さないように機能追加の方向で考えてます。

カテゴリの見た目

これもご要望戴いている所の機能です。
今のところ、どうするのか固まっていない状態ですが、

  • 色の付け方を変える
    • ただ、塗りつぶし等を行ってしまうと、文字色と似た色が設定されている場合、逆に見にくくなってしまう為、慎重に検討中
  • 画像を入れれるようにする
    • 凄い見やすくなって、個性が出るようになるのですが、、、
    • 最初は頑張って登録するんだと思うのですが、数が増えてくると画像を登録するのが億劫になってパスワードを登録しなくなるんじゃないか?の懸念が強いです
  • 文字を1文字 -> 2文字まで表示するようにする
    • AppleやGoogleはこの方式ですね。確かに1文字だけだとわからない時が多いので、これも対応しようと考えてます

広告

インタースティシャル入れたいです。本当に入れたいですが、、実際邪魔だし、KeyHolderは必要な時にさっと取り出して、さっと去っていくアプリで、
他のアプリやWebサイトからKeyHolderでパスワードを見て、またそのアプリやWebサイトに戻っていくまでが一連のUXなんですよね。
インタースティシャルを入れる事で、そのUXを崩してしまう事になり、KeyHolderの価値を確実に崩しかねないので、実装出来ていないです。

ただ、我々もボランティアでやっている訳では無いし、広告収益が無いと確実に赤字なので、広告収益をもっと増やしたい…。
今の画面下部の広告でもそこそこの収益は出していますが、活動資金の確保としてはまだまだ足りていません。

今のKeyHolderのユーザ数等のKPIについて

どこまで情報を出して良いのか判断しきれないので、凄いざっくりと展開します。

DL数

約13,000

DAU

約1,100DAU

MAU

平均7,000MAU

月の収益

ゲームソフトは余裕で余裕で買える程度

総評

DL数は約13,000なのですが、MAUが約7000なので、一度DLして使って頂ければそのままお使い続けて戴いていると言う事がわかります。
アプリの性質上、Push通知などは打ってないので、ユーザが自分の意思でアプリを立ち上げると言う意味で、必須アプリの1つになりえていると伺えて、これは本当に嬉しい限りです。
(ツール系のアプリなので、使ってもらえれば息は長いですしね)

最後に

いつもKeyHolderをご利用戴いている皆様。
本当に有難うございます!これからもご愛用の程宜しくお願い致します!

何か問い合わせしたいこと等ありましたら、以下の公式Twitterか中の人の一人であるゆう@あんのうん宛にご連絡いただくか、「project.unknown.cs@gmail.com」までご一報くださいませ!

twitter.com

twitter.com

まだお使いになられていない皆様。

是非とも使ってみてください!w

http://project-unknown.hatenablog.com/entry/2015/04/18/201907project-unknown.hatenablog.com

他のサイト様に掲載されてました

有難うございますmm

applinote.com

http://trafalbad.hatenadiary.jp/entry/2016/09/17/215656trafalbad.hatenadiary.jp

app-field.com

isuta.jp

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個もツンである(;・∀・)

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

Unity 1 Week Game Jam お題「積む」

出来の良いゲームじゃないけど、生意気にも参加レポート書いていきます。

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

作ったゲーム

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

よくありがちな、足場を作って下に降りていくゲームです。

https://unityroom.com/games/fall-stone/webgl
↑からPlay出来ます。

はじめに(言い訳)

Unity 1 Weekにずっと参加したかったのですが、中々時間を捻出する事が出来ず、今まで見ているだけでしたが、
今回は中途半端になっても良いので参加しました!

(踏ん切りが付いたのが木曜日、既に大分日数が過ぎています)

ただ、運が無いと言うかなんと言うか、職場のアプリで大規模障害が発生し、そのヘルプに駆り出されて全く作業が出来ませんでした。
と言うのは言い訳ですね。

というわけで、土曜の夜から製作開始です。

企画開始

元々Unityはちょくちょく触っているのですが、

  1. 企画する
  2. プロトタイプを作る
  3. 絶望的につまらない
  4. 1に戻る

上記でエンドレスな為、これまで一度もゲームをリリースしたことがありません。

というわけで、壊滅的に企画力に自信がありません
それに加えて、期間が残り1日しか無い。

ここで既に思考停止気味ですが、色々と開き直って企画開始。

まず思い浮かんだもの。

とにかく足場を造りながら下に降りて行くもの。

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

(キャラクターライセンス© UTJ/UCL)

やばいものすごくつまらない (これはユニティちゃんに失礼なゲームになってしまう)

練り直し

落下して且つ、ある程度の高さから落ちたらGameOverにしようと考えました。
となると、少しの段差から落下したらOUTなものってなんだろうか…
(速攻でスペ○ンカーが思いつきましたが流石にまずい)

後は、人がモン○ンみたいに卵を持って落下すると割れてしまうと言うのも思ったのですが、

絶望的にモデリング(その前の絵心)のskillが無い

もう時間も無いので、ガラス玉と言う想定で進めます。

勝手にPlayer(ガラス玉)があるきだすので、足場を作ったり、ブロックで壁を作ったりして誘導しながら降りていくものを造ります。

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

いい感じにカオスになった

(この時点で土曜の23:30 blog書いてる余裕無いな…)

詰む現象

お題が積むだから、そのままでも良い気がしてもないですが、

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

こうなると完全に詰んだ状態になりまた思考停止。

うし、足場が一定時間経ったら壊れるようにしよう

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

とんでもないことになった…。

寝る

全く進捗が無く、且つ、モンスターにゼナを摂取しても眠気がひどくガッツリ寝る。

落ちる時の制限を考えてみる

別なアプローチとして、落ちる時に即座に落ちてしまうんじゃなくて、
落下できる状態になったら、落下してみる方向で考えてみる。
ついでに、ある程度落下したらゲームオーバーもやめる方向で。

f:id:project-unknown:20170625135452g:plain (Scoreも入れてみた)

なんか一歩前進した気がする。
ただ、衝突判定がうまく言っていないのか、床抜けするバグが中々直せない。
(やばい、後6時間や)

煮詰まって来たので、デザインの方を考えてみる

キャラを作る余裕が無いので、このまま球体をPlayerとして扱う方向で。
となると、はじめはファンタジックな見た目にしようと思っていたのですが、幾何学的な見た目の方にしようと、
ウチのデザイナーのぽぽたに依頼。

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

かなり良さげな背景が仕上がって来ました。
(これを見て、足場とかも全て立方体に直そうと思ったのですが、時間が無くてそのままに。)

タイトル画面を作る

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

カジュアルさと、一貫性を担保する意味で、ゲームの背景とタイトル画面を同一なタッチで仕上げる。
タイトル画面だけ見ると、スタイリッシュに仕上がったなーと。
(期限まで残り30分)

仕上げ

もうここからの追加のゲーム性を求めるのは無理なので、気になるバグ取りと、UI、レベルデザインの方にフォーカスしていきます。

心残りな所

敵キャラ的な位置づけのものや、今はただ平たいステージだけですが、斜めの物を用意したりと、
ちょこちょこと追加要素は企画まで出来ていたのが作り込めなかったのが心残り。
後は最低限Twitter機能は入れたかった…。

感想

期限があり、お題があるって本当に良いなーと言うのが素直な感想で、
期限があると、エターナル現象が発生していても目を瞑って先に突き進むしか出来ないし、お題があると「あれも」「これも」と放散しまくるアイデアにやんわりと制限を加える事ができ、物を生み出す上で、凄い大事なことだなと。
今まで終わりまでゲームを仕上げたことがなかった自分にはものすごい刺激になり、
また、途中多少つまらないと思っても、推敲を繰り返していくことで、なんとか遊べる程度のゲームが出来ると言う所で感動した次第でした。

次回ですが、今回で時間が無い中でもなんとかなったと言うのもありましたし、
ものすごい勉強になったのもあるので、可能な限り参加させていただきたいと思いますヽ(=´▽`=)ノ


以下蛇足

unityroomに投稿

なんとかゲームとして動くようになってUploadしようとしたら、なんぼやっても502 Bad Gatewayで弾かれる…。
期限過ぎてから出そうとしたので、他の方がガッツリゲームをやっている時間帯だったし、サーバの負荷的な問題か、Upload容量制限なのかなと思い、
自分で出来る解決策としたら、使っていないファイルを削除して可能な限り軽くしようと不要そうなファイルを削除していった所。
ガッツリモデリングファイルまで消してしまって、ゲームが動かなくなる
一応git管理をしていたので、ゼロと言う事はなかったけど、それでも結構な手戻りが発生し、リリース直前に心が折れかかりました(;・∀・)
(なんとか復元したけど

そんな中、@naichilab さんのメッセージが、参加者を大事にしてくださっているんだなーと凄い嬉しかったです。

利用したAsset

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

今回のゲームでちょこちょこAssetは使ったのですが、その中で一番お世話になったのはarbor2ですね。
これのお陰で、何回も作り直しをしたのですが、ぱっと組み立てられるし、ある程度自分専用の拡張をしていたので、構築がメチャクチャ早かったです。
素敵なAsset有難うございます!

www.project-unknown.jp

www.project-unknown.jp

www.project-unknown.jp

www.project-unknown.jp

First Fantasy for Mobile

主にステージや、爆発などの表現に利用してます。

FX Mega Pack

エフェクトのAssetです。カートゥーンな表現のエフェクトが盛りだくさんで、使い所は限られてるかもしれませんが、世界観さえ合致すればかなり有用性の高いアセットです。

KeyHolder - お問い合わせのページ

KeyHolder お問い合わせのページ

現在公開中のKeyHolderへ、頂いているご意見の返答ページです。

頂いたご意見・ご感想は、全てスタッフ一同目を通しておりますので、 このblog記事へのコメントもしくは、AppStoreへのレビューにて書き込んで頂ければと思います。


使いやすい(App Storeより)

何も考えずに、パッと登録出来るのが、最近の多機能な流れと逆境してて使いやすい。 ただ、最初のパスワード入力の所が入力し辛いのは直して欲しい。

ありがとうございます! 最初のパスワード入力の項目は、確かに入力し辛い所がありましたので、修正して最新版では改善しているかと思います。 まだ入力し辛い等ありましたら、お申し付けください。

とても素晴らしいです

楽しく使っていますありがとう

ありがとうございます!スタッフ一同励みになります。

シンプル

早くて簡単入力! メモ書き程度のものならこれで。

ありがとうございます! 本アプリのウリの部分が刺さって感謝カンゲキです。

良い

単純で使いやすいです。

ありがとうございます! 今後共KeyHolderをご利用いただけましたら幸です。

iPod touch5,ios8.4にて

…3つしか登録できないので、残念デス。

ご連絡ありがとうございます。 最初に申し上げて置きますと、KeyHolderは無料でも無制限にパスワードを登録できるようになっております。 こちら、手元のiPod touch5, iOS8.4で確認しました所、問題なく3つ以上登録できることを確認しており、問題が再発しておりません。 可能でしたら、以降の調査に役立てますので、別途細かい条件等を提示頂ければ幸です。

ウィジェットも使えてGood

以前使ってたID PW管理アプリのIDBoxというものにとても近くシンプルで使いやすいです。 要望としては、どんどん増えるアカウント等の管理は階層分けやカテゴリー分け出来た方が目的のID PWを探しやすいです。 あと、最近はYahooの二段階認証のように、メールアドレスが基本IDでもログインの際には別の英数字の羅列を入力するという形もありますので、ただのメモ欄ではなくID PWの入力項目を自由に増やせるとありがたいです。 普段利用しているID PW管理アプリと合わせて、保険的に使わせて頂こうと思います。 アプリ埋め込み型の広告が好きではないので、アドオン購入で広告非表示が実装される事も切なる願い。 強力な暗号化とiCloudやDropboxと同期してくれる、または選択出来るという形が実現すれば、この手のアプリでは間違いなく誰にでも勧められる素晴らしいアプリになるでしょう。 要望ばかり書いてしまいましたが悪いアプリではないし使えますので、ダウンロードして損はありませんよ。

建設的なご意見ありがとうございます!

  • カテゴリ分けに関しまして
    • こちらスタッフ内でも度々議論に上がる所で、シンプルをウリにすると言う所でカテゴリ機能も落とした次第であります。今後もカテゴリのご要望が増えましたら実装しようと思います
  • ID, Passwordの入力項目を自由に増やす件に付きまして
    • ご意見ありがとうございます。以後の追加改修項目として検討致します
  • アドオン購入で広告非表示
    • こちら、絶賛開発中です。
  • 強力な暗号化
    • 現在KeyHolderはDataProtectionと言うiOSで提供されております暗号化機能を実装しております。ご提案にありました通り、iCloud等の外部連携機能を追加する際は、別途暗号化技術(AES等)を実装しようとしております
  • iCloudやDropboxと同期
    • Dropboxは検討モレでしたが、iCloudは追加機能の視野に入れております。いずれ、iPad最適化・Macアプリ最適化で、端末間でKeyHolderを連携できればと思っております。

いまいち

タイトル、ID、パスワードの3つ入力しないと保存出来ない。IDが無い場合もあるでしょう?人それぞれでしょ。何とかして。使えん。

ご意見ありがとうございます。 本件に関しまして、要望が増えましたら実装項目に加えようと思います。

大変使いやすい

まっすぐなアプリで最高

ありがとうございます! スタッフ一同励みになります!