
3ヶ月間のフルタイム個人開発を終えて。(そして社会復帰へ・・・
はじめに
趣味の開発に専念したかったので3ヶ月間会社を休みました。
今日はその最終日のため、振り返りを兼ねて3ヶ月間の記録を残したいと思います。
前提
3ヶ月前、私は個人でアプリをひとつ公開していました。RubySketch と言います。簡単に説明すると、Ruby というプログラミング言語でクリエイティブコーディングしたりゲームを作ったりして遊ぼうというアプリです。

私はこのアプリとその派生アプリ新規開発のために、会社をしばらく休むことにしたのです。
ちなみに RubySketch については去年のアドベントカレンダーにも記事を書いてますので、よければそちらも御覧ください。
当初の計画
休みに入る前の時点では、3ヶ月間で何をしようかはぼんやりとだけ考えていました。
1. ゲームアプリを作る
RubySketch はコア部分がゲームエンジン的な作りになっているので、それをベースに単体のゲームアプリを作って AppStore に公開しようと思ってました。初めてのちゃんとしたゲーム制作なので、欲張らず小粒なゲームを作る。可能なら複数個を、と思ってました。
2. ゲームエンジン部分の機能強化
1 のゲームアプリ作り(ドッグフーディング)を通して、RubySketch でゲームを作るために足りてない機能を知り、可能ならそれらの機能をゲームエンジン部に追加していきたいと思ってました。
3. AppStore 公開機能の追加
「RubySketch ゲームエンジン化計画」の最後にも書いたとおり、RubySketch 内で作ったゲームを直接 AppStore に公開する機能を追加できたらと思っています。そのために必要な機能を全部とは言わないまでも、できる範囲で取り組もうと思ってました。
3ヶ月の記録
ここからは実際に3ヶ月をどう過ごしたかの記録です。

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

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

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

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

5月20日


5月24日


5月26日

効果音も追加。
ゲームの中身としてはほぼ完成したのでここでソースコードを公開。
xord/solitaire: Solitaire game made with RubySketch (github.com)
5月28日
久しぶりに iPhone 実機で動作させる。


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

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

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

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

6月12日
Fastlane 周りなど、自動化を進める。
日本語表示にも対応。
6月13日
苦手なストアページの説明文を ChatGPT に生成してもらう。
6日20日

6月21日

6月23日


リリースしたソリティアの実際の 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 を追加

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

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ヶ月休みの前後での収益の変化についてです。
ここから先は
この記事が気に入ったらチップで応援してみませんか?