見出し画像

3ヶ月間のフルタイム個人開発を終えて。(そして社会復帰へ・・・

割引あり

はじめに

趣味の開発に専念したかったので3ヶ月間会社を休みました。
今日はその最終日のため、振り返りを兼ねて3ヶ月間の記録を残したいと思います。

前提

3ヶ月前、私は個人でアプリをひとつ公開していました。RubySketch と言います。簡単に説明すると、Ruby というプログラミング言語でクリエイティブコーディングしたりゲームを作ったりして遊ぼうというアプリです。

私はこのアプリとその派生アプリ新規開発のために、会社をしばらく休むことにしたのです。

ちなみに RubySketch については去年のアドベントカレンダーにも記事を書いてますので、よければそちらも御覧ください。

RubySketch ゲームエンジン化計画 〜 物理演算付きスプライトクラスの追加など (zenn.dev)

当初の計画

休みに入る前の時点では、3ヶ月間で何をしようかはぼんやりとだけ考えていました。

1. ゲームアプリを作る

RubySketch はコア部分がゲームエンジン的な作りになっているので、それをベースに単体のゲームアプリを作って AppStore に公開しようと思ってました。初めてのちゃんとしたゲーム制作なので、欲張らず小粒なゲームを作る。可能なら複数個を、と思ってました。

2. ゲームエンジン部分の機能強化

1 のゲームアプリ作り(ドッグフーディング)を通して、RubySketch でゲームを作るために足りてない機能を知り、可能ならそれらの機能をゲームエンジン部に追加していきたいと思ってました。

3. AppStore 公開機能の追加

RubySketch ゲームエンジン化計画」の最後にも書いたとおり、RubySketch 内で作ったゲームを直接 AppStore に公開する機能を追加できたらと思っています。そのために必要な機能を全部とは言わないまでも、できる範囲で取り組もうと思ってました。

3ヶ月の記録

ここからは実際に3ヶ月をどう過ごしたかの記録です。

https://twitter.com/tokujiros/status/1652862048517103617

5月1日

ソリティアを作ることにしたので早速開発に取り掛かる。
サンプルゲームとして RubySketch に同梱していたソリティアのソースコードがすでにあったので、それを元に実装し直すことに。

素朴な見た目のサンプルゲーム

5月10日

10日で一通り最低限遊べるソリティアが出来上がる

ドッド絵の見た目は可愛いが、視認性が厳しい

5月19日

ゲームの演出面もある程度実装できてきた。
カードの素材も変更し、背景も派手にしてみる

(無駄に)宇宙でソリティア

同日、勢いで Undo/Redo も実装

初めてちゃんと Ruby のパターンマッチを使った

5月20日

ゲームの中断と再開(状態の保存と復元)を実装

画像素材も自前で作り直し

パターン画像は素材サイトから
リリース時の見た目に近い形に

5月24日

3枚ずつめくるモードを実装

思ったより手こずり実装に丸一日かかる

クリア演出も実装

無駄に物理演算

5月26日

時間、スコア、移動回数の表示を実装

角丸は正義

効果音も追加
ゲームの中身としてはほぼ完成したのでここでソースコードを公開

xord/solitaire: Solitaire game made with RubySketch (github.com)

5月28日

久しぶりに iPhone 実機で動作させる。

クリア演出時に動作が重くて不安になる

カードの柄も増やしてみる

この後、右端以外はボツに

5月29日

まだ macOS でしか動かないものの、配布したくなったので RubyGems で公開

gem は 728 ダウンロードもされてるらしい(ホントかな)

6月2日

背景をカッコよくしようと思って、より宇宙なシェーダーに変更する

この方向性でアプリ名を「宇宙ソリティア」にする予定だった

6月6日

デザインを頑張るも限界を感じる。

デザインは難しい

6月8日

アプリアイコン作成。ストア公開の準備に入る。

ここからがしんどかった

6月12日

Fastlane 周りなど、自動化を進める
日本語表示にも対応

6月13日

苦手なストアページの説明文を ChatGPT に生成してもらう

ついに TestFlight にアプリをアップロード

6日20日

ストア画像と動画を作成

ゲーム画面のキャプチャ、ついつい遊んでしまって時間ばかりかかった

6月21日

やっと審査提出

一度リジェクトくらいました

6月23日

晴れてリリース

リツイートもたくさんしていただいて、その節はありがとうございました
今見たらちょうど2万インプレッション目だった

リリースしたソリティアの実際の AppStore リンクはこちら ↓↓↓

当初は 1ヶ月でゲーム 1本公開ペースを予定していたので、ここまで 約50日かかっていて大幅に時間オーバー。
できれば複数本ゲームを作って公開したかったので、ここから2つ目のゲーム開発に入りたいところだったが、軽めの燃え尽き感がありしばし集中できない日々が続く。

6月30日

2つ目のゲームは何を作ろうかな、次はサクッと作りたいな、と言うことでソリティアのアセットをそのまま使ってカードゲームをもう一つ作ることに。そしてあまり深く考えず、フリーセルに決定

とりあえずカードを並べるだけ

作り始めて、1日目でいきなりフリーセルで遊べる状態に

クロンダイクのルール実装部分をフリーセルのルールに書き換えただけ
得ました

あまりに簡単にフリーセルが作れてしまったので、このままリリースまで進めても同じことの繰り返しであまり面白くないので、フリーセル開発は一旦保留に。

7月13日

ソリティア開発で RubySketch 側にもいろいろ改修入れたので、その修正内容を含めた新バージョン v2.7 を公開。今までにないもりだくさんのアップデート内容に。

- Examples/DrumPad.rb を追加
- スプライトのイベント処理に関するドキュメントを Examples/Basics/14_Sprite.md に追加
- Examples/Basics/15_Physics.md を追加
- Examples/Basics/16_Sound.md を追加
- 新規 Markdown ファイルを作成するメニューを追加
- ソースコードを自動フォーマット設定をメニューに追加
- 広告を削除するアプリ内購入を追加
- ルビーソリティアのリンクを追加
- 以下の関数を追加
 - red()
 - green()
 - blue()
 - alpha()
 - color()
 - lerpColor()
 - loadSound()
 - focused()
 - windowResized()
- Sound クラスを追加
- set() と get() メソッドを Image クラスに追加
- Sprite に以下のメソッドを追加
 - draw()
 - mousePressed()
 - mouseReleased()
 - mouseMoved()
 - mouseDragged()
 - mouseClicked()
 - touchStarted()
 - touchEnded()
 - touchMoved()
 - show()
 - hide()
 - hidden?()
 - fixAngle()
 - angleFixed?()
 - clickCount()
 - fromScreen()
 - toScreen()
- Sprite クラスに以下のプロパティを追加
 - left
 - top
 - right
 - bottom
 - center
 - offset
 - angle
 - pivot

- 実行画面のフルスクリーン時にはステータスバーを非表示にするように変更
- createGraphics() 関数に pixelDensity パラメータを追加
- copy() と blend() で tint カラーが効くように変更
- colorMode()、angleMode()、blendMode() は現在のモードの値を返すように変更
- pushMatrix()、pushStyle()、push() はブロックが与えられた場合ブロックの最後の評価結果を返り値として返すように変更
- pushStyle()、popStyle() は filter の状態を管理しないように変更
- mousePressed()、mouseReleased()、mouseMoved()、mouseDragged()、mouseClicked() はマルチタッチの影響を受けないように変更
- Shader クラスは shadertoy の一部のフラグメントシェーダーを解釈できるように変更

- アプリ起動時の初期化処理でクラッシュするケースがあったので修正
- angleMode() が DEGREES に設定されているときに Vector.random2D() が正しく動いていなかった不具合を修正
- mousePressed() をブロック無しで呼び出すと mousePressed() で指定していたブロックが削除されてしまう不具合を修正

7月24日

ソリティア用に実装して便利だった関数を、ゲームエンジン側に正式採用するためタイマー系とアニメーション系の関数を追加して RubySketch v2.8 として公開。

- 以下の関数を追加
 - setTimeout()
 - setInterval()
 - clearTimer()
 - clearTimeout() (clearTimer() の alias)
 - clearInterval() (clearTimer() の alias)
 - animate()
 - animateValue()
- 実行画面にコンソールの表示非表示ボタンを追加
- 実行画面のコンソールに最大化ボタンを追加
- フルスクリーン終了ボタンのタッチ範囲を改善
- Examples/Basics/17_Timer.md を追加
- Examples/Basics/18_Animation.md を追加

アニメーション関数のドキュメント

ついでに今まで「教育」カテゴリにしてたのを「開発ツール」カテゴリに変更したら初めてランキング入り。

この後 100位よりも下に落ちていきました

7月26日

ソリティアを開発する上で足りてなかったものが一通り RubySketch v2.8 に入ったため、理論上は RubySketch 上でも RubySolitaire が動くはず、ということで試したところ、

動くはず、で実際動いてよろこびのツイート

それまでに RubySketch は require() が使用禁止だったので苦労して使えるようにしたものの、3重の eval に binding、refinements をからめるという史上稀に見る汚い黒魔術を書いてしまい負債を残すことに。

7月30日

3ヶ月間で最後のリリースとなる RubySketch 2.9 をリリース
ストア公開してるソリティアゲームアプリをそのままサンプルコードとして同梱するというなかなか珍しいリリースに。

前の画面に戻ればソースコード編集できます

ついでに物理演算のサンプルコードも追加。

ぐらぐら

7月31日

最終日、この振り返り記事を書いている。
やっぱり自然言語は難しい。プログラム書く方が楽しい。
なかなか筆が進まず日付変わって8月1日、3ヶ月の休みが終わってしまった。

振り返り

3ヶ月はあっという間かと思ってましたが、終わってみれば結構長かったですね。やりたかった事はもう少しありましたがまあこんなものでしょう。フルタイムで自分の好きなものを作るというのは、とても良い経験になったと思います。

趣味の開発は今まで、特に締め切りも設けず時間があるときにのんびり開発するというスタンスでやってきました。仕事やプライベートが忙しいときは何週間もほったらかしにすることもちょくちょくありそれでも全然平気だったんです。ですが、わざわざ3ヶ月も休みをとった手前、何か結果を残さなければというプレッシャーを思いのほかじんわり感じ続け、その結果、開発以外の優先度を下げてしまって家族に迷惑をかけることもあり、そこは良くなかったですね。

フリーランスになったりすると土日も休む気になれないとも聞きますし、ちょっとそれに近い体験ができたのかなと感じてます。焦る気持ちとうまく付き合っていくスキルが欲しくなりました。

今後について

8月1日からは元の会社に戻ります。ですが個人開発は続けます。使える時間は少ないですが。

でもこの3ヶ月間でゲームアプリを作る基礎を固めたので、使える時間が少なくても効率よくゲームを作っていける環境が作れました。なので引き続きゲームエンジンとゲームを作っていく予定です。

ということで、ここに改めて直近の開発計画を書いておきます。

1. 作ったゲームのエクスポート機能

今回作ったソリティアのコードベースを元に再利用可能なコードや設定、各種の自動化周りをテンプレートとして切り出し、RubySketch 内で作ったゲームをテンプレートと共にエクスポートできるようにしたいですね。

エクスポートしたファイル一式は、macOS 上でビルドと AppStore 公開までできる構成にします。

2. 広告を組み込めるように

ストア公開したソリティアにはバナー広告とインタースティシャル広告を入れてます。それを RubySketch で作るゲーム内にも入れられるようにしたい。

これができると、RubySketch でゲームを作り AppStore に公開し、そのアプリの広告から収入を得るということが可能になります。

ソリティアにはゲームの構成上うまく入れられませんでしたが、次作るゲームで可能ならリワード動画広告なども組み込んでいきたいです。

3. RubySketch から直接 AppStore 公開

エクスポート機能だと、ストア公開するのに結局 Mac が必要になるのが残念なところです。

そこで GitHub Actions などのクラウド環境でビルド・サブミットまでできるようにしたら Mac が無くても iPhone などから直接アプリを AppStore に公開できるのではないかと思ってます。各種の秘密キーなども Secrets 機能などで CI に設定できれば理論的には可能なはず。

実は Fastlane と GitHub Actions で TestFlight へアプリをアップロードするところまではソリティアでも作ってあるのですが、GitHub Actinos 上で実行すると何故か途中で停止してしまって GitHub Actions の利用可能時間ばかり消費するという状態で挫折中です。

4. サブスクリプションの実装

ここまでの 1〜3 が全て実現できたら、サブスクリプション課金を導入しても良いかなと思ってます。

さいごに

3ヶ月ものあいだ趣味に没頭してたわけですが、そんな幸せな時間も終わりを迎え明日からまた仕事に戻ります。いや、戻れるのでしょうか、不安です。そもそも明日起きられるのか。これを書いている今はもう夜の 1時過ぎでなので早く公開ボタンをポチッとして寝るべきですね。そうします。ではおやすみなさい。

おまけ

note 初めて使うので、試しに有料部分も書いてみます。内容は3ヶ月休みの前後での収益の変化についてです。

ここから先は

780字

この記事が気に入ったらサポートをしてみませんか?