HACKERをご利用いただきありがとうございます。今回のバージョン1.4.0で以下の対応を行いました。バックアップ機能の追加を行いました!データを他の端末に移すことが可能になりました。その他に、報告をいただいていた不具合の修正を行いました。HACKERにバックアップ機能を追加しました!このバックアップ機能はiCloud上にバックアップを作る手法を採用しています。IDにログインするだけでご利用いただけます。バージョンアップを行なったら、ぜひ一度バックアップを行い、みなさまの大切な記録の保護してください。詳細はヘルプページをご確認ください。データを他の端末に移すことが可能になりました。バックアップ機能を応用し、データを他の端末に移すことが可能になりました。大まかなやり方は以下の通りです。IDにログインし利用中の端末で「iCloudにバックアップ」を行います。IDでサインインします。HACKERをインストールし、「iCloudから復元」を行います。機種変更などにご活用頂ければ幸いです。詳しくはヘルプページをご覧ください。HACKERをご利用いただきありがとうございます。今回のバージョン1.3.0で以下の対応を行いました。ご要望のあったアイコン、並びに新規のアイコンを追加しましたご要望のあったアイコン、並びに新規のアイコンを追加しました今回はご要望のあったアイコンに加え、Project.Unknownとしておすすめしたい新規のアイコンを追加しました。家事系アイコンの追加また、お店のアイコンが分かりづらかったので、一部修正を行っております。HACKERをご利用いただきありがとうございます。今回のバージョン1.2.0で以下の対応を行いました。Watchで計測したデータはiPhone上に記録されますし、計測をiPhone上のアプリ、Widgetで終了する事もできます。(逆もまたしかりです)わざわざiPhoneを開かなくても簡単に行動を記録できるようになった世界観になっております。HACKERをご利用いただきありがとうございます。今回のバージョン1.1.0で以下の対応を行いました。ウィジェットでも記録できるようになりました。ご要望のあったアイコンを追加しました。ウィジェットでも記録できるようになりました。HACKERを表示していただく事で、アプリを起動しなくても行動の記録が取れるようになりました。これにより、更に日々の行動が記録しやすくなりましたので、是非ともご利用ください!ウィジェットに表示されるアクションは、アプリに登録してあるアクションの上から6番目までが表示されます。記録を計測している場合は、以下のような画面となります。このように2件までの記録中のアクションが表示されます。ストップボタンを押すことで、計測を終了することも出来ます。HACKERをめでたくリリースすることができました。HACKERを作るにあたり、その制作過程について記載していこうと思います。同業者の方へは、苦難の共感が得られれば幸いです。時間が欲しい世の中のサラリーマンの殆どがそうだと思いますが、とにかく時間が無い。平日に、スキルアップのための勉強や、アプリ造りを行いたくても、家に着くのが日付をまたがる時間帯になる為、中々実施することができません。休日にやろうと思うのですが、、いざ休日になったら平日の疲れを癒やすために、ガッツリ休んでしまう等、自分のやりたいことがやれない毎日でした。社会人生活も10年を超えてきて、一向に改善しない毎日に諦めの気持ちすら抱いていた際に、一冊の本と出会いました。」という本が私の中で革命的でした。「自分の1日の行動ログを取って、無駄に過ごしているところは無いか?を見返すことで時間を捻出する術」これにものすごく感銘を受け、その時のツイートが以下。ライフハック大全読んだ。どれも良かったけど個人的に「時間は分•秒まで正確に意識する」が革命的で、数日全ての行動を秒単位まで測定して振り返ると無理なく余裕な時間が生まれて衝撃だった。実際にこのライフハックを実施してみました。私は1日の中で、以下の時間をもっと取りたいと考えています。個人アプリ、ゲームの開発この観点を元に、1日の行動ログを記録し、時間を生み出すことが出来ないか分析してみます。(メモ帳に走り書きしていた為、時間が入っていたり入っていなかったりしてます。1:17この日を振り返って見ると、例えば、以下を改善できそうです。スキルアップのための読書(Kindle)を行うとしたら、80分読書時間が確保出来ます。全てのタバコの時間を企てるのは難しいのと、読書の開始時には思い返しの時間も必要な事を鑑みても、50分は読書時間が確保できます。移動時間を読書・勉強時間に企てるまた、バスの時間がトータル31分。電車の時間は特急が65分、在来線が40分。バスと在来線は基本立つので、ここを読書に当てると71分。特急は座ることが出来ますが、片道30分程度なので開発するには時間が足りなく見えるので、PCを使った勉強時間に企てると、65分勉強時間が確保できます。ここまで考えると、家に帰るまでに、以下の時間を確保することがわかります。家では、アプリ開発に集中することができる。いやアプリ開発だけしていていいのです。一日の無駄な時間、スキマ時間に十分に勉強を行えているので、家でやる必要が無いのです。家でダラダラとする時間を2時間から半分削るだけで、1時間確保出来ます。ストイックに削れば1時間半〜2時間確保できるでしょう。ここまで見てわかるように、1日の時間を細かく記録する事と、分析する事は、忙しいビジネスマンに取って、ものすごく有益であることがわかります。HACKER」アプリに繋がります。私自身の生活の質を向上させるために、どうしてもこの手のアプリが欲しかったのと、私の中でしっくり来るアプリがStoreに並んでいなかったので、何としてでも手に入れたかった。気がつけば、全ての開発や勉強を停止して、着手していました。(なんだかんだで7ヶ月も造ってた...)仕様検討コアバリューを決めるいつもは凄い悩む所だったのですが、ここは作り出した動機が動機なので、すぐに固まっていました。アプリ制作初期は「無駄な時間を管理し、自分のスキルアップに企てたい時間を確保する」で、最後までここは変わらなかったのですが、もっと範囲を広げて、以下を最終的なコアバリューとしました。特段ペルソナも考えていません。HACKERでは、以下のユーザーをターゲットとして捉えています。日々の生活をもっと有意義に送りたい人UXを検討する大体のアプリに言えることですが、このアプリはUXが特に肝となります。何より、毎日、しかも小刻みにアプリを立ち上げて行動のログを計測しないといけない。それには、ユーザーのアプリ上の動作だけではなく、生活のリズムを一瞬でも妨げてはいけない。行動ログを記録忘れた場合は、一気に記録するモチベーションが下がります。記録忘れを防がなければならない。(結局、ここのサポート部分は1stリリースからは見送りました。)上記をいろいろ考えてUXを造っている際に、取っていたメモが以下です。結局、当時考えていた機能の半分くらいしか実現できていないのですが...。UIを検討するここもUX並にメチャクチャ苦労しました。なんだかんだで、2ヶ月近く、あーでもないこーでもないをやっていたんじゃないかしら。ちなみに、最初期の頃に考えていたUI全く違いますね...。今見ると、個人的に結構しんどいUIですが、当時はこれでいける!!と信じて止みませんでした。結局、2日位、寝かせてから再度この画像を見て、くっそだせぇって思って、やり直しました。その時の温度感だけで決めるのではなく、一度寝かせるのは大事ですね。次に考えたのが、以下のUIです。文字情報を見るのではなくて、行動をアイコン化し、なれたら無意識で記録ができる事を狙っています。無意識で押せる事を狙って、アイコンも結構大きめに設定してます。今の原型が見え隠れしていますね。ここから、紆余曲折を経て、以下の様な画面で落ち着きました。HACKERで、現在実装済みのマネタイズをご紹介します。今後のマネタイズは敢えて載せません。お金の匂いがプンプンする機能が追加されたら、「あっ、マネタイズに走ってるな」とでも思ってください。一定の回数計測を行った際のインタースティシャルバナー広告バナー広告は、KeyHolderでも実装しているのと、KeyHolderでも操作の邪魔にならないところに設置していますが、結構馬鹿にならないくらいの収益を上げてくれます。HACKERは、UXがとにかく命です。ユーザの行動を阻害する事をしようものなら、記録が面倒になり一気に使わなくなります。バナー広告を設置するにあたり、アプリの操作を阻害する事はしないような画面設計にしています。インタースティシャル広告KeyHolderでは、インタースティシャル広告を出さずに本当に公開しました。いうか、KeyHolderはシンプルを極めすぎてインタースティシャル広告を入れる余地が無く、入れようものならアプリとしての価値を大きく欠損しかねるので、断念しました。HACKERではインタースティシャルは仕様検討の総初期から、なんとかして入れられないかを深く検討しています。HACKERは何よりUXが命なので、インタースティシャル広告を入れる箇所には最新の注意を払っています。HACKERでインタースティシャスは、一定の時間、一定の回数、行動ログを取った際に、行動ログを記録したタイミングで広告表示を行っています。これは、ユーザーとして考えた際に、行動ログを計測する直前に広告が表示されたら、ユーザーの行動を阻害するリスクが非常に高まる為、記録を開始したタイミングで広告を表示することにしました。眼の前の収益に目がくらんで、ユーザの行動を阻害する事で、アプリをアンインストールされる事を一番のリスクとして捉えていますまた、上記で一定の回数と記載しましたが、初回リリースまでにどの回数が妥当なのか?の結論を出すことが出来ませんでした。FirebaseのA/Bテストを採用して、インタースティシャル広告を出すタイミングの検証を行っています。www.project-unknown.jpここまでは、アプリ設計のお話でした。次に、実装面でのお話をしていこうと思います。実装開始さぁ、ここからお祭りの始まりです。いやぁ...とにかく紆余曲折しまくった...。今回のアプリ開発では、特に真新しい事を中心に、やりたいことは何でもやろうと思い色々tryしました。大きい所で言うと、Carthageにも挑戦しましたしwww.project-unknown.jpQuickにも挑戦しましたしwww.project-unknown.jpRealmSwiftにも挑戦しましたwww.project-unknown.jpFirebaseにメインの解析機能を移管しましたし、Firebaseを使ってA/Bテストにも挑戦しています。」等の技術書も読み漁り、開発設計についての色々な挑戦も行いました。気づいたのが、tryばっかしていて、いつまで経っても完成しない特に、開発設計のところは、色々な本を読みすぎて、読む本全てに影響を受けて設計が日々変わりすぎていっているのが色々と足を引っ張りました。こんなところにもエターナル現象は顔をだすんですね。プロトタイプとしてある程度のものが出来上がったタイミングで、tryは封印し、アプリ完成にフォーカスする事にしました。以後は、アプリ制作時に大きな節目について記載します。諸々の事情で、結局CoreDataに移しました。RealmSwiftはCoreDataと違い、Objectを生成して値を突っ込むだけで物理領域にも保存され、直感的にデータを扱うことができる優れもので、開発当初はRealmSwiftを崇拝してやまなかったです。DeleteRuleが使えないマイグレーション時に、意図しないデータが潜り込むトランザクション範囲が操作し辛い等、不満が次々と湧いてきて、最終的にCoreDataにデータを移管しました。ココらへんは、ここに詳細を記載しています。RealmSwiftとCoreDataとでは、やはりアプリ設計が異なってくる為、ここを直すために、結構作り直しを余儀なくされました。(それでもDAOを全て直す気力は無く、一部のDAOはRealmSwift前提とした設計のままになってしまっています)アイコンをやっぱり全部自分らで造ることにする開発完了が大きく遅れたのは、ここが原因です。これは英断だと思っています。これまで、アイコンをフリーで提供してくださっているサイト様から使わせてもらうつもりでおり、完成直前までこれで行くつもりまんまんでした。造るんだからアイコンも自作する事に決め、ぽぽたが泣きながら作業開始しました。この量を開発過渡期に用意するのは無理があったので、数を70ほどにしぼりました。(作成したアイコン一覧)この辺の詳細については、ぽぽたが詳細の記事に起こしています。今回一番厄介だったエターナル化は、機能のエターナル化より、コードのエターナル化でした。一つの機能を造る度に、4,5回リファクタリングを行ったり。一度仕上げたコードを、設計しなおしたり。自分が満足するまで何度も何度も作り直してました。これって、システムの保守性だけ上がって、いつまで経ってもリリースできなくなる自体を引き起こしていました。確かに保守性は非常に大事なのですが、とにかく時間がかかる。プライベート開発なので納期を気にしないというのが更に拍車をかけてしまっていました。塩梅を調整するのが本当に難しい...。このリファクタリングも最終的には自分の中で最低限に抑えるようにしました。以下の時だけリファクタリングを行うようにしています。DRYを守れていない似た機能が乱立した場合、開発過渡期になればなるほど、修正漏れによるさらなる不具合、進捗の遅れに響きます。ここは徹底的に潰しました。この概念は道を踏み外しそうになった際の羅針盤になり得る考えでいつも大いに助けられています。SOLIDの原則に準拠していないiOSライクなMVVMとかではなく、またはプロトコル指向でもなく、オブジェクト指向の1つの考えであるSOLIDをとにかく大事にしました。プロトコル指向で統一したかった所はありますが、Swiftのプロトコル指向は熟成されていません。これを守るがあまりに無駄で汚いコードになりがちです(会社の現場でこれに囚われて、意味不明なコードを書くエンジニアを散々見ています)。何でもかんでもMVVMを採用するのは愚の骨頂です。クラスを増やすだけで、自己満足だけ満たされるコードになるでしょう。いうのは適材適所であるべきです。SOLIDの原則だけを準拠することにしています。これはDRYを包括している思想ですので、DRYルールと非常に相性が良い。以下は、SOLIDの原則について記載しています。principle)当たり前だけど、気がついたら守れていない原則ですが、ちゃんと守れている時の効果は絶大です。このルールには非常に気を使いました。ViewからModelクラスの細かいメソッドにまでアクセスしようとした時これはSOLIDの一種ですね。ViewからModelのデータをごにょごにょするのはイケていません。その場はそれで良いかもしれませんが、後ほど似たようなデータアクセスが必要になる度にインタフェースを作る羽目になります。HACKERは日本以外の世界で発信しています。細かく言うと、GDPRを受け、EU諸国を除いた全世界に発信しています。問題は、ブログに紹介やらヘルプやらをやたらと親切に記載してしまっていた為、これら全てをローカライズする必要ができました。いやぁー、これはアプリをリリースするのを辞めるか悩むくらい霹靂しました。最後の1ヶ月間は、このローカライズを延々とやっていた気がします。実際にアプリ以外のローカライズは以下を対応しました。繰り返しますが、、アプリのローカライズ以上に、このローカライズの方が遥かにしんどかったです。後述しますが、最終的にこの1ヶ月の作業は殆ど無駄になり、申請日にプロジェクトメンバー総掛かりで作り直してます。相次ぐ不具合まさかの、申請日にUI変更UI変更に引っ張られて、全ての画像変更が発生し、気づいたら申請したのは、2018/7/16(日)の夜でした...。UI変更が本当にしんどかった...。inch日本語版iPhoneX日本語版5.5inchというか、最後の2日間、殆ど画像の差し替えしかやってない気がする...。HACKER関連の記事を色々書き溜め、申請が通ったらアプリのリリースも含め、ブログ記事のリリースをするために待ち構えていましたが、ものの見事にリジェクトをくらいました。CompatibilityiPadでの表示が崩れているから、ちゃんとUI整えろよというご指摘です。実は、リリース前にiPadで表示が崩れる事を知っていましたし、Appleの審査する人はiPadで審査するということも知っていました。(iPhoneアプリであっても、iPadに内蔵されているiPhoneシミュレータで動くべきであるという考えなので、私が知る限りでは、iPadで審査を行っていそうです。)ですが、まぁ、操作できない事ないじゃんという謎の過信で、対応を見送っていたところを、案の定指摘されました。目も当てられない...。こちら、OSSを使ってUI表現していた所だったので、ライセンスの問題もあり、手を加えるわけにもいきませんから、その場しのぎとして、表示崩れが発生する端末では、一部機能を削除して再申請しました。初回リリースで諦めた事たくさんあります。本当にたくさんあります。本当に色々積み残しています。列挙すると、以下の機能を初回リリースでは諦めています。Watch化すると記載しているのに、工数の兼ね合いという大人の都合で諦めてます。HACKERの押しにしていきたいのですが、まずは、ユーザーの行動ログを貯めることが何より優先すべき事だったので、ここの機能も結構諦めています。アプリ内課金やりたかった...。本当にやりたかった...。HACKERのKPTを考えたいと思います。Keep自分の信念を最後まで貫いたライフハック大全を読んで、是非このアプリを使いたい、そして造りたいと言う思いを最後まで貫けたのは良かった。このアプリは、万人受けするアプリではないという事はわかっています。ターゲット層項目に記載した人に長く使ってもらう事だけを想定して造っています。エターナル化を防いだ本当はAppleWatch、Widget、分析機能の強化、Push等もっとやりたかったけど、これを全て捨てました。初回リリースでは、ユーザーのログを貯めることを何より重要視し、それ以外の機能は二の次にしました。結果として、この判断を行わなければ、リリースは来年になっていたでしょう。Problem何でもかんでもやりすぎた最低限の事だけしかやっていないつもりだったのですが、今考えると色々手を広げすぎたと思います。Connectの仕組み上、プライマリー言語を最初から英語に指定していないと、後々更に面倒な事になっていたので、これでよかったのかもしれませんが...。ヘルプやプロモーションはやりすぎました、これこそリリース後でも良かった。至る所でチキンハートが顔を出したRealmSwiftをやめたのも結局の所、チキンハートが問題でしたし、チキンハートが顔を出したせいで、ハレーションを生みそうな機能を見送ったり、もっと強気に造っても良かった。プロジェクトとして、集まって作業する頻度が少なすぎた最近はリモートワークが流行っていますが、やはり対面でやり取りする作業だと、それぞれのクオリティ・速度が全然違います。申請日に集まって、最後のテストを行った際の不具合の出方がやばかったです。早めに集まってテストするなどすれば、問題の早期発見に気づけたでしょう。明らかにリスクがあるとわかっていた不具合を放置した最後のリジェクトの所ですね。これは本当にもう愚かだったとしか言いようが無い。面倒くさがって、対応を先送りにした結果としか言いようが無い。Tryプロジェクトとして集まる頻度を増やすこれはProblemの裏返しですね、クオリティ・速度を上げる意味で、無理にでも集まって集中して造る時間を確保したほうが良いです。出す前にでもでもだってを発揮して、チャンスをことごとく逃しているのがとにかくもったいない。やる前に後悔するなら、やって後悔するの精神を持とうと思います。多少面倒でも正しいことをするこれは最後のProblemの不具合と気づいていて目を背けたものに掛かります。結局バグの放置や不具合の放置は、問題の先送りでしか無いですし、別な言い方をすれば、ローンと同じで先送りにすれば金利(より面倒な工数)が増えるものとし、リスクがあるものに関しては、速攻潰していくマインドは持ち続けなければと痛感しました。HACKERは、自分の時間を生み出す為に有用なツールに仕上がっています。HACKER完成までのいろんなことを紹介させていただこうと思います。HACKERの紹介ページはこちらになります。Unknownはじめにロゴデザイン決定までの流れ作成したアイコンアクションアイコンのデザインについてレポートアイコンのデザインについて最後にう〜のん語録ロゴデザイン決定までの流れロゴのデザインは、ゆう@あんのうんさんとの度重なる話し合いで決めていきました。自分の時間を管理し、生活改善のサポートをするアプリということで、ゆう@あんのうんさんから時間や計測のイメージと聞き、いろんなサイズや色違いのアイコンを作ってみました。テーマカラーになる青は割と早い段階にノリで決まった気がします。そこから更に絞って...を何度か繰り返し。ロゴはアプリの顔になるので、納得いく形になるまで話し合いました。HACKERの公式ロゴ。時計と円グラフを合わせたイメージになっています。HACKERで作成したアクションアイコンの一覧です。ここに来て初めて数えてみたのですが、計68個になりました。並べてみると数より少なく感じてしまいますね、自分の感覚的にはこの倍くらい作ったように思うのですが...。本当は船、飛行機、バイク、ホワイトボードなども作る予定だったのですが、話し合いの末現段階では見送ることになりました。ご要望・お問い合わせアクションアイコンのデザインについてゆう@あんのうんさんから「こういうアイコンが欲しい」というリストをもらい、それを元に考えていきました。ロゴもそうなんですが、アイコンを作るということ自体あまり経験がなかったので、結構苦戦してしまいました...。使いやすいを意識しているアプリなので、アイコンも極力シンプルにしたかったんですよね。初期に作ったアイコン3種。〜不純物0%、クリアーな味わい〜という感じのシンプルさですね。後期に作ったアイコン3種。描けば描くほど前面に乗り出してくる『伝われ...!』という気持ちとこだわりが反映されていくアイコン達......。電車は最初、シンプルに横向きの四角いハコにしたかったんです。サイズ的にとても短く路面電車のようになってしまうな...と思ったので、奥行きを意識したのは苦肉の策ではありました。単純にシンプルといっても、伝わらなければ仕方ないですもんね...。いろいろなアイコンの要望をもらい着手し、初めて気づいたのは動詞を表現するのは難しい!ということですね。くつろぐスタイルは人それぞれですよね。スマホをいじりながらベッドでゴロゴロや...ソファーに座りコーヒーを飲みながら本を読む...。遊ぶに関しても、なにでどう遊ぶのか...シンプルなアイコンでどう表現すれば伝わるだろうかと結構悩みました。考えてみて、最終的に決めたのがくつろぐ=ソファーと、遊ぶ=楽しそうな感じでした。今後アイコンを追加する際は、もっと分かりやすく、もっとシンプルに表現できるよう表現力も養いたいところです。アクションアイコンは全て好きに名前をつけることができるので、自分の感覚で好きに使っていただければ嬉しいです!レポートアイコンのデザインについてこちらは手描きで紙にいくつか案を出してみたもの。グラフ的なものは、あまり考えずにロゴに寄せて円グラフ表現にしていたのですが、一番下の画像の、時間管理の画面は棒グラフ表現なのに円グラフアイコンだと混乱しない?という、どうまずさんからのごもっとも過ぎるツッコミにより、全員意見一致で急遽円グラフから棒グラフに変更になりました。アプリ申請当日の出来事です(笑)最終的に決まったレポートアイコン各種。経験や思考錯誤の末の発見やと、とても実りのある開発でした。HACKERは自分の時間を管理し、生活改善のサポートをする時間管理アプリです。ゆう@あんのうん今回も参加しました今回も参加させてもらいました。今回は反省すべき点が多くある(期日から1週間遅れた)ので、レポートを書いていきます。↑画像クリックでプレイできます。爆弾の取扱に失敗すると逆に街を破壊して賠償金を請求されると言うゲームです。月曜〜水曜この時期はずっと企画を考えていました。今回の企画は、個人的に考えやすそうだけど、色んな案を考えていると大体似たり寄ったりな着地点に行き着いてしまい、難易度が高かったです。考えてもよくありそうな企画に行き着いてしまい、考えては消してを繰り返しました。建物が爆破された際の表現をどうするか考えたのですが、以下のAssetを採用しました。このAssetはSpriteを簡単に細切れに破壊する表現を行うことが出来る為、今回のゲームには打ってつけのAssetです。以下のコードをGameObjectとしてScene上に配置してあげれば、Scene上のSpriteはどんなものでも破壊できます。}}※爆破の挙動はInspectorだけではなく、コード上からも柔軟に変更できます。このAssetは1つだけ使いにくい所があって、このAssetのオブジェクトはシングルトン設計になっているため、複数Objectを指定した所で結局同じところで処理されてしまいます。これが何を意味するのかと言うと、2D開発時にLayerを用いて奥行きや段差を意識する設計で作ってしまうと、Exploderが作用するLayerを切り替えて実装する事になるのですが、爆破解体されたSpriteまでExploderのLayerを引き継いでしまうため、挙動がおかしくなります。今回のゲームでは最前面のLayerにだけExploderを作用させ、後ろのLayerはExploderを使わない方向で対応しています。Exploder2Dの使い方に苦戦しつつも、1週目の土曜にはある程度ゲームとして形になる所までは完成していました。通しでプレイした際に、ゲーム2週目で以下のErrorが出まくる事態に遭遇しました。object.エラーログそのままなのですが、2週目でとあるGameObjectにアクセスしようとした際に、既に開放されたGameObjectにアクセスしようとしてエラーが発生しています。この不具合が本当に厄介で、別なオブジェクトからアクセスする時のみ発生して、例えば自分のライフサイクル(StartやUpdateメソッド)でアクセスすると、問題なく値が入っている事。なると、古い参照が残ってしまっているのかと思われるのですが、その参照を残してしまっている所が具体的に分からず、また、この不具合の質が悪い所は、WebGLの場合、ブラウザリロードしても参照を維持してしまう事です。似たような所で、以下でも語られていましたがどれも効果はありませんでした。answers.unity.comanswers.unity.comanswers.unity.comstackoverflow.comこの日はほぼ、この不具合の調査を行っていたのですが、解決することが出来ず、締め切りの20時に。間に合わないと思っていなかったので、かなりショックを受けながら他の皆さんのゲームをプレイして癒やされてました。いやーみなさん本当に凄い...。仕事が忙しく、基本終電帰りとなり殆ど着手出来てません...。土曜〜日曜この日にやっと原因がわかりました。Androidで言うEventBusライクな実装についての記事を書いたのですが、www.project-unknown.jp今回もこの設計を使っており、Scene切り替えのタイミングで通知の解除をし忘れていて、2週目以降は古い参照を保持し続けてしまった為に、古いGameObjectに通知されnullとなっていました。Subscribeして、Unsubscribeし忘れると言う初歩的なミス...。この原因に気づいたのは本当にたまたまで、思考整理の為にリファクタしている最中に気づきました。ここからは、残っていたUIを整えたり、WebGL用に解像度調整を行ったりして、やっとリリースすることが出来ました。今回は色々と反省すべき点が多い点で、物凄く自分の糧となったと思います。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をご利用いただき有難うございます。IDで解除する事が出来るようになりました。以下に詳細な機能説明を記載します。IDは指紋認証の事を指します。IDを利用してKeyHolderを起動した際に表示されるマスターパスワードが解除出来るようになりました。以下は、利用に当たっての注意事項です。IDを利用してKeyHolderのパスワードを解除しますので、端末に登録されていないと本機能はご利用頂けません。使うを参考に、登録をお願い致します。IDを利用するか否かの設定を保持しています。IDの設定はデフォルトでONになっております。IDの設定をOFFにしてください。ご不明な点等御座いましたら、いつでもお問い合わせくださいませ。お知らせいつもKeyHolderをご利用いただき有難うございます。こちらよりダウンロードください!今回のVersionで、以下の対応を行いました。一部不具合の修正それぞれ、以下に詳細を記載致します。機能について今回のパスワードリストの自動並べ替え機能で、KeyHolderは大きく分けて3つの並べ替えが行えるようになりました。これにより、手動の並べ替えが大変で、パスワードリストがぐちゃぐちゃになってしまった場合、感覚的に並べ替えることができ、よりパスワードが探しやすくなりました。カスタムこれまで通りの並べ替えの仕方です。新規に登録されたパスワードが上に並び、手動で並べ替える事が出来ます。漢字の順番にパスワードが並びます。手動での並べ替えは出来ませんよく使う順よく閲覧する順にパスワードを並べます。設定メニューから設定します。これまでの設定メニューに、並べ替え機能が追加されています。上記からお好きな並べ替えを選択することで、パスワードリストが並び替わります。更新情報を確認できる機能の追加アプリのバージョンを上げて、初回立ち上げた際に、更新情報が表示されます。ゆう@あんのうんはじめに今日はKeyHolderについてです。2.3.0をリリースできそうなので、その前記事になります。2.3.0についてVersion2.3.0で何をやったの?見た目の変化は殆どありません。これまでIDとパスワード、タイトル全てを入力しないと保存できない仕様だったものを、タイトルのみ必須とし、他は任意にしました。(これが何気に一番要望が多かったので...)後、強いて言うなら設定のレイアウトを今時なものに変更し、公式・TwitterへのURLを追加したくらいです。何が変わったの内部は全て変わりました。KeyHolderはこれまでObjective-Cで記載されていた(リリースが2015年なので仕方ないのですが)ものを、swiftにフルスクラッチで書き直しました。どれくらい変更が加わったかと言うとKeyHolderはBitbucketで管理しているのですが、ざっくり344ファイル分のコードが書き換わってます。こんだけ変更を加えているけど、見た目が変わっていないのでメジャーバージョンを変更できないジレンマ。他ゲーム開発やUnityの勉強と並行して1日辺り30分ずつKeyHolderの対応を行い、約1月位対応に時間がかかったと言う...。全てSwift化する事によってObjective-Cでも勿論出来るのですが、今後の機能拡張がすごくしやすくなりました。up時の工数負荷が多少なりとも軽減する事が出来ました。非常に要望の多い機能ですので、是非とも提供したいとずっと考えています。バックアップ/復元を行うと言う事は、ユーザのデータをAppから外に出す事になるので、セキュリティ上本当にやっても良いのか?に結論が出せておりません。内部のデータロジックがiCloudに対応していない為、中々着手できていない次第です。責任を丸投げしているようにも聞こえるかもしれませんが、ユーザの責任下の元メールかなにかで外部に出力すると言うところは対応を入れたいと思います。(ただ、この場合機種変等で復元をしたいとなると思うのですが、このやり方も考えないとですね)ちなみに機種変時ですが、iTunesのバックアップから復元でパスワードを移すことも出来ますので、新規iPhoneが出るまでにこの対応が間に合わなかった場合は、そちらをお試しください。指紋認証でマスターパスワードを解除するこれも要望の多い機能ですね。私が一番やりたい機能ですというか、私がまず欲しいです。KeyHolderはシンプルさを一番のウリにしており、余分な情報は登録出来なくしている為、登録は非常に簡単なのですが、パスワードを探すのが大変になっていると思っています。実際にカテゴリ機能を提供しておりますが、パスワードの量が多くなると、カテゴリ機能もあまり機能して来なくなると思ってますし、また並べ替え機能も提供していますが、これに関しては並べ替えに手間がかかる分、KeyHolderのコンセプトと逆行しているんですよね...。Spotlightライクな検索機能を用意して、文字を入力する毎に絞り込まれていくようにする事で、パスワードを取り出す作業もシンプルに高速に行えるようにしていきたいと考えております。以外だったのですが、これについても要望がそこそこあります。KeyHolderのコンセプトを壊さないように機能追加の方向で考えてます。カテゴリの見た目これもご要望戴いている所の機能です。2文字まで表示するようにするAppleやGoogleはこの方式ですね。確かに1文字だけだとわからない時が多いので、これも対応しようと考えてます広告インタースティシャル入れたいです。他のアプリやWebサイトからKeyHolderでパスワードを見て、またそのアプリやWebサイトに戻っていくまでが一連のUXなんですよね。インタースティシャルを入れる事で、そのUXを崩してしまう事になり、KeyHolderの価値を確実に崩しかねないので、実装出来ていないです。我々もボランティアでやっている訳では無いし、広告収益が無いと確実に赤字なので、広告収益をもっと増やしたい...。今の画面下部の広告でもそこそこの収益は出していますが、活動資金の確保としてはまだまだ足りていません。今のKeyHolderのユーザ数等のKPIについてどこまで情報を出して良いのか判断しきれないので、凄いざっくりと展開します。総評DL数は約13,000なのですが、MAUが約7000なので、一度DLして使って頂ければそのままお使い続けて戴いていると言う事がわかります。アプリの性質上、Push通知などは打ってないので、ユーザが自分の意思でアプリを立ち上げると言う意味で、必須アプリの1つになりえていると伺えて、これは本当に嬉しい限りです。(ツール系のアプリなので、使ってもらえれば息は長いですしね)最後にいつもKeyHolderをご利用戴いている皆様。本当に有難うございます!これからもご愛用の程宜しくお願い致します!何か問い合わせしたいこと等ありましたら、以下の公式Twitterか中の人の一人であるゆう@あんのうん宛にご連絡いただくか、「project.unknown.cs@gmail.com」までご一報くださいませ!twitter.comtwitter.comまだお使いになられていない皆様。Unityのゲームをアップロードして公開しよう今回も性懲りも無く参加しました!んで、性懲りもなくレポート書いてきます!作ったゲームhttps://unityroom.com/games/patapata-unon↑からPlayできるので是非遊んでみてください!ずっとずっとやりたかった、我がProjectのマスコット(何もタイトル出してないのにマスコットだけは作っていた)のう〜のんを使ったゲームです。Pack反省点Unityの機能を使いこなせてない共通化処理をもっと纏める。前回、ギリギリまで参加する/しないで悩んでいて、結果作業時間が殆ど確保出来なかったので、同じ轍は踏まないように、月曜の朝から通勤時間を用いてデザイナのぽぽたとSlackを用いて相談。夏と言えば?でパッと思いついたもので以下のものが絞れました。(俺の一押し)企画の詰めスイカ真っ先に考えたのが、スイカでFPSの案でした。だくになっていたと言うのあって思いついた案でした。風鈴あるクーラーが買えない貧乏一家が暑くて耐えられなく、風鈴を拾ってくる。風が一切無い状態なので、風鈴が鳴らず哀愁を漂わせている。結局貧乏は止めて、おじいさんが風鈴が鳴らずに困っている設定になりました。そこに主人公がこっそり影で風鈴を鳴らして涼しさを提供すると言うゲーム案が出ました。考えた感じでぽぽたと完全に意見があったのでこれで行こうと言う事になりました。完了と書いておきながら、現在この記事を書いている間も続行中です。平日は家に帰るのが日付を超えてからじゃないと帰れなかったのでまったく作業出来ませんでした。土曜この日からガッツリ作業する予定だったのですが、kenjin.unity3d.jp上記に参加した為、作業を開始したのは夜でした。(凄い勉強になったので、個人的には行って良かったです。夜から、ぽぽたと合流して、製作開始です。今回新規に参加するんだから、Unityのバージョンを上げてしまえと勢いで2017.1.03fへupdateを行ったら、ものの見事につまりました。主人公を我がProjectのマスコットである「う〜のん」を使うと言う所もあり、あまり議論を交わさずとも、殆どゴールの共有が出来ていました。↓う〜のんのイメージ図ここでなんとなくでゴールの共有が出来ていたのは、自分らの中でう〜のんのキャラ付けが強烈に出来上がっていた為、う〜のんをゲームに登場させると言うだけで、どんなタッチのゲームになるのかが想像できていたと言うのがでかいです。(こう考えると、インパクトの強いキャラから考えてもゲーム企画もそうですが、コミュニケーションコストがかなり軽減出来るかもですねこの日は画像を用意してもらって、Unity上でざっくり動作させる所(以下Gif参照)で力尽きる。日曜(最終日)この日はお昼からガッツリ開発開始。bitbucketに並べたかんばんのタスクが30個から一切減らない(消化スピードより、新たに見つかるもののスピードの方が早い)という絶望を噛み締めながら仕上げていきます。相変わらず夜になっても、半分くらいしか開発が終わっていなく、ゲームデザインの調整をしている暇も無く、締め切りの20時が過ぎ去っていきます。23時頃にある程度の完成の目処がたち、WebGLに初めて書き出してみたのですが、ここでWebGLで表示するとuGUIが尽く想定の斜め上を行く現象が発生。Layoutあたりの指定が甘かったのがあるのだと思うのですが、尽く小さくなっちゃってUIとしての機能を果たしてくれない状態でした。(結局四の五の行っている状況ではなかったので、全てのUIを固定幅で指定してUploadしました。開発部分のお話2Dを採用した理由これまで世に出していないだけで、色々ゲームは作っていて、2Dの方が経験値として高かったと言うのと、やはりう〜のんのキャラ的に2Dの方が遥かに映えるので、ここは特に考えることも無く2Dで製造しました。一定時間(乱数)で振り向く余り作り込めて無いです。そのせいで挙動不審な勢いで振り向く時があります。タッチ判定なんだかんだでここに時間がかかってしまいました。(Asset買っておけば良かった...)Eventシステムが余り使い慣れていないと言うのもあり、ドラッグとクリックでうまく処理を分ける所につまずいて居ました。*/Animation簡単なAnimationが多かったので、メカニムを使うのではなく、ここもコードでパラパラ漫画を使って乗り切ってます。(どんだけ追い込まれているんだ...)基本はAnimation部分をコルーチン化しておき、条件に応じてコルーチンを発動と言う形で動かしています。画面遷移、ボタン操作等に利用このブログでも何度か登場していますので、以下も御覧ください。www.project-unknown.jpwww.project-unknown.jpwww.project-unknown.jpwww.project-unknown.jpDOTween簡単なAnimation等は、Animator等を使うより、こっちでコードベースで書き起こしたほうが早いです。Unity主に保存機能の時に利用。ノリはiOSのUserDefaultsみたいに軽いノリで掛けるのが個人的に神がかっているAssetです。SUITEゲームミュージックの詰め合わせです。バリエーションが豊富で、1つ持っていれば大体のゲームに使えそうですし、何よりクオリティが高い。Packひと昔前のゲームは全てこのAsset使ってたんじゃないのか?と言うレベルに見たことがあるパーツの組み合わせです。古いアイコンが多いですが、それでもまだまだ現役で使えるようなアイコンが数多くあり、重宝しています。反省点Unityの機能を使いこなせてないUnityそこそこ使ってきたつもりで居たけど、まったく使いこなせていない。Unityの機能を使うより、コードで書いたほうが早いと言う判断が出る時点で駄目。息をするように使えるようにスキルを挙げないといかん共通化処理をもっと纏める。前回書いていた処理を今回も書いていたと言うところはいただけないので、共通化する。今回詰まったドラッグ+クリック周りの処理は良く出てくるはずなので、これも共通化処理として纏めておく。ちなみに、今纏め始めている最中で、以下の用に纏めつつあります。オブジェクト脳を鍛えるやっぱりテンパると1つのクラスの処理を纏めがちになっており、現在リファクタしているのですが、非常に読みにくい。オブジェクト脳を鍛えていかないといけないなーと猛省しております。(業務でもSwiftとかバリバリオブジェクト指向で書いているので、ここは自信があったのですがダメダメでした。前回と同じ所で、やっぱり期限とお題があるのは本当にありがたいです。このイベントのお陰で、今自分が持っている武器はなんだろう?しかもその武器は速度が出るのか?を常に考えて実装に入っているので、今自分が置かれている状況・スキルセットを振り返る良い機会になります。一緒に弱点も見えて来るのと、勉強したい事柄も見えて来ます。前回のFallStoneもやろうとして出来て居なかったのですが、折角ここまでの形にしたので、アプリ化を目指して現在進めています。ゆう@あんのうん出来の良いゲームじゃないけど、生意気にも参加レポート書いていきます。Unityのゲームをアップロードして公開しよう作ったゲームよくありがちな、足場を作って下に降りていくゲームです。https://unityroom.com/games/fall-stone/webgl↑からPlay出来ます。作ったゲームはじめに(言い訳)企画開始まず思い浮かんだもの。今回は中途半端になっても良いので参加しました!これまで見てるだけだったけど、unity1weekにずっと参加したかったので今回やれる所までやってみる。絶対間に合わなけど勉強にもなるだろうし。2017年6月21日(踏ん切りが付いたのが木曜日、既に大分日数が過ぎています)ただ、運が無いと言うかなんと言うか、職場のアプリで大規模障害が発生し、そのヘルプに駆り出されて全く作業が出来ませんでした。言うのは言い訳ですね。2017年6月24日というわけで、土曜の夜から製作開始です。企画するプロトタイプを作る絶望的につまらない1に戻る上記でエンドレスな為、これまで一度もゲームをリリースしたことがありません。いうわけで、壊滅的に企画力に自信がありません。それに加えて、期間が残り1日しか無い。ここで既に思考停止気味ですが、色々と開き直って企画開始。足場を造りながら下に降りて行くもの。(これはユニティちゃんに失礼なゲームになってしまう)練り直し落下して且つ、ある程度の高さから落ちたらGameOverにしようと考えました。絶望的にモデリング(その前の絵心)のskillが無いもう時間も無いので、ガラス玉と言う想定で進めます。勝手にPlayer(ガラス玉)があるきだすので、足場を作ったり、ブロックで壁を作ったりして誘導しながら降りていくものを造ります。blog書いてる余裕無いな...)詰む現象お題が積むだから、そのままでも良い気がしてもないですが、こうなると完全に詰んだ状態になりまた思考停止。うし、足場が一定時間経ったら壊れるようにしようとんでもないことになった...。寝る全く進捗が無く、且つ、モンスターにゼナを摂取しても眠気がひどくガッツリ寝る。落下できる状態になったら、落下してみる方向で考えてみる。ついでに、ある程度落下したらゲームオーバーもやめる方向で。(Scoreも入れてみた)なんか一歩前進した気がする。衝突判定がうまく言っていないのか、床抜けするバグが中々直せない。(やばい、後6時間や)煮詰まって来たので、デザインの方を考えてみるキャラを作る余裕が無いので、このまま球体をPlayerとして扱う方向で。なると、はじめはファンタジックな見た目にしようと思っていたのですが、幾何学的な見た目の方にしようと、ウチのデザイナーのぽぽたに依頼。良さげな背景が仕上がって来ました。(これを見て、足場とかも全て立方体に直そうと思ったのですが、時間が無くてそのままに。)タイトル画面を作るカジュアルさと、一貫性を担保する意味で、ゲームの背景とタイトル画面を同一なタッチで仕上げる。タイトル画面だけ見ると、スタイリッシュに仕上がったなーと。(期限まで残り30分)仕上げもうここからの追加のゲーム性を求めるのは無理なので、気になるバグ取りと、UI、レベルデザインの方にフォーカスしていきます。敵キャラ的な位置づけのものや、今はただ平たいステージだけですが、斜めの物を用意したりと、ちょこちょこと追加要素は企画まで出来ていたのが作り込めなかったのが心残り。後は最低限Twitter機能は入れたかった...。期限があると、エターナル現象が発生していても目を瞑って先に突き進むしか出来ないし、お題があると「あれも」「これも」と放散しまくるアイデアにやんわりと制限を加える事ができ、物を生み出す上で、凄い大事なことだなと。今まで終わりまでゲームを仕上げたことがなかった自分にはものすごい刺激になり、また、途中多少つまらないと思っても、推敲を繰り返していくことで、なんとか遊べる程度のゲームが出来ると言う所で感動した次第でした。Gatewayで弾かれる...。自分で出来る解決策としたら、使っていないファイルを削除して可能な限り軽くしようと不要そうなファイルを削除していった所。ガッツリモデリングファイルまで消してしまって、ゲームが動かなくなる一応git管理をしていたので、ゼロと言う事はなかったけど、それでも結構な手戻りが発生し、リリース直前に心が折れかかりました(;・∀・)(なんとか復元したけど申し訳ないですーーー。過負荷でエラーしてるのは確かなんですが、真因がつかめておらず直せていません。時間を開けてリトライいただけると幸いです。さんのメッセージが、参加者を大事にしてくださっているんだなーと凄い嬉しかったです。今回のゲームでちょこちょこAssetは使ったのですが、その中で一番お世話になったのはarbor2ですね。これのお陰で、何回も作り直しをしたのですが、ぱっと組み立てられるし、ある程度自分専用の拡張をしていたので、構築がメチャクチャ早かったです。Mobile主にステージや、爆発などの表現に利用してます。PackエフェクトのAssetです。カートゥーンな表現のエフェクトが盛りだくさんで、使い所は限られてるかもしれませんが、世界観さえ合致すればかなり有用性の高いアセットです。お問い合わせのページ現在公開中のKeyHolderへ、頂いているご意見の返答ページです。このblog記事へのコメントもしくは、AppStoreへのレビューにて書き込んで頂ければと思います。Storeより)何も考えずに、パッと登録出来るのが、最近の多機能な流れと逆境してて使いやすい。最初のパスワード入力の所が入力し辛いのは直して欲しい。最初のパスワード入力の項目は、確かに入力し辛い所がありましたので、修正して最新版では改善しているかと思います。入力し辛い等ありましたら、お申し付けください。素晴らしいです楽しく使っていますありがとうありがとうございます!スタッフ一同励みになります。メモ書き程度のものならこれで。本アプリのウリの部分が刺さって感謝カンゲキです。良い単純で使いやすいです。今後共KeyHolderをご利用いただけましたら幸です。touch5,ios8.4にて...3つしか登録できないので、残念デス。ご連絡ありがとうございます。最初に申し上げて置きますと、KeyHolderは無料でも無制限にパスワードを登録できるようになっております。iOS8.4で確認しました所、問題なく3つ以上登録できることを確認しており、問題が再発しておりません。可能でしたら、以降の調査に役立てますので、別途細かい条件等を提示頂ければ幸です。PW管理アプリのIDBoxというものにとても近くシンプルで使いやすいです。PWを探しやすいです。PWの入力項目を自由に増やせるとありがたいです。PW管理アプリと合わせて、保険的に使わせて頂こうと思います。アプリ埋め込み型の広告が好きではないので、アドオン購入で広告非表示が実装される事も切なる願い。強力な暗号化とiCloudやDropboxと同期してくれる、または選択出来るという形が実現すれば、この手のアプリでは間違いなく誰にでも勧められる素晴らしいアプリになるでしょう。要望ばかり書いてしまいましたが悪いアプリではないし使えますので、ダウンロードして損はありませんよ。建設的なご意見ありがとうございます!カテゴリ分けに関しましてこちらスタッフ内でも度々議論に上がる所で、シンプルをウリにすると言う所でカテゴリ機能も落とした次第であります。Passwordの入力項目を自由に増やす件に付きましてご意見ありがとうございます。以後の追加改修項目として検討致しますアドオン購入で広告非表示こちら、絶賛開発中です。現在KeyHolderはDataProtectionと言うiOSで提供されております暗号化機能を実装しております。ご提案にありました通り、iCloud等の外部連携機能を追加する際は、別途暗号化技術(AES等)を実装しようとしておりますiCloudやDropboxと同期Dropboxは検討モレでしたが、iCloudは追加機能の視野に入れております。iPad最適化・Macアプリ最適化で、端末間でKeyHolderを連携できればと思っております。タイトル、ID、パスワードの3つ入力しないと保存出来ない。IDが無い場合もあるでしょう?人それぞれでしょ。