Unityエンジニア-プログラミングを学び始めてから７年間。これまで出会った技術たち

# はじめに
社会人になって、４年間Unityエンジニアとして仕事をしてきました。
初めて転職活動をして、来年から新しい会社で働き始めるので、良い節目だなと思い、何かポエム記事を書きたいと思い至りました。
そこで、最初プログラミングを学び始めてから今までの７年の間に出会った技術を記念にまとめていきます。

軽く触ったものから、メインで使っている技術まで書いていきます。
また、これは技術なのか？というものも混ぜていきます。

# 技術との出会い(時系列順)
ちょっと時系列が怪しくなっているものもありますが、出会った順で書いていきます。

## C++
初めて本格的に勉強をしたプログラミング言語です。
当時と比べてだいぶ表紙が変わっていますが、「やさしいC++」で勉強しました。

https://www.sbcr.jp/product/4797392593/

今思うと、どうして最初に勉強したのがC++なのかと思います。
まだ無知だった時期にゲームプログラミングと言えばC++という情報があったのでそれで選択してしまいました。
C言語が先じゃないかと思いますが、今からプログラミングを勉強し始める人に対しては、目的に応じた言語を薦めたいですね・・・

今では使う頻度は低くなってしまいましたが、やりたいことの他に色々考えなければならないことが多いので生産性が低い言語だなと感じています。(個人的に)
でも好きな言語ではあるので、使う機会があれば使い続けていきたいです。

## Unity
ゲームを作ってみたいと思ったことが、プログラミングを学ぶきっかけだったので、次にゲームエンジンを勉強しようと選んだのがUnityです。
今となってはUnityのおかげでご飯を食べていけてますね。

C#も同じくらいのタイミングで勉強をはじめました。
C++を勉強し始めたときに、プログラミングでできることが少ないと感じたことにびっくりしました。
黒い画面に文字を出力して何をするんだと。
逆に、Unityはなんでこんな簡単にSpehreを落下することができるんだと・・・
このときは独学だったので手探りで勉強していましたね。

## C#
Unityを使うために勉強した言語です。
今はメインで使っている言語ですが、学生時代はどちらかと言うとC++がメインでした。

こちらも、C++と著者が同じ「やさしいC#]で勉強しました。

https://www.sbcr.jp/product/4815603922/

当時無知なだけだったかもしれませんが、C#でいろいろできる環境がどんどん整ってきていると感じています。
これからも長く付き合っていきたい言語です。

## 自作PC
これは技術かどうか怪しいですが、ゲーム開発をするためにはそれなりのスペックのPCが必要だと思い、この機会に自分で組み立てて見ようと思いました。
こちらを組み立てる前は、動作が重いWindowsノートPCを使用していました。

知識がないと流石に組み立てるのは難しいので、こちらも雑誌を読んで勉強しました。
現在では、YouTubeに自作PCの動画が多いと思いますが、当時は今ほど盛んではなかったような気がします。

この時購入したケース・HDD・CDドライブは今でも現役です。

参考になるかわかりませんが、当時のスペックです。

* Intel Core i7 6700
* Geforce GTX960
* SSD 256GB / HDD 2TB
* RAM 16GB DDR4

現在はこんなこんな感じです。

* Intel Core i5 12400
* Geforece RTX2070 Super
* SSD 1TB * 2 / HDD 2TB
* RAM 16GB DDR4

割とエンジニア人生の中で自作PCに出会えてよかったなと思っています。

## C
学校の授業で勉強しました。
書籍は「Cの絵本」でしたね。

https://www.shoeisha.co.jp/book/detail/9784798150383

最初にC++勉強していたので、そこまで違和感はなかったですが、文字列操作が辛いです。

## WZGL
学校の先生が、ゲームプログラミング勉強用に作成したOpenGLベースのフレームワークです。
線・四角形や円など基本的な2D描画機能しかありません。
Xinputで、XBoxコントローラーの入力を判定していました。

最終的にこちらのフレームワークで簡単なシューティングゲームを制作しました。
こんな感じです↓↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/e71e9bb3-f816-36c9-7e6a-903fda1a9e17.png)


今思うとゲームプログラミングを学ぶ良い取っ掛かりになりましたね。

## Git
とあるハッカソンに参加した時、Gitの存在を知りました。
初めて知ったときは、何のために使うか理解できませんでしたが、開発する上で欠かせないツールですね。
最初はSourceTreeで手探りで使っていましたが、途中からコマンド打てたらかっこいいなと思い、コマンドの勉強をはじめました。
現在では、ほとんどコマンドでGit操作しますが、かっこいいとかはどうでも良くて、しっかり理解するためにもGitはコマンドで勉強したほうが良いと思います。

## 自宅サーバー
きっかけは覚えてないですが、このタイミングでサーバーに興味を持ちましたね。
何の書籍か忘れてしまいましたが、自宅でサーバーを立てよう的なものを読んでました。

### GitBucket
複数人で開発する機会があり、当時はGitHubのプライベートリポジトリが有料だったので、Gitのサーバーを自宅で立てて見ようと思いました。
自宅に建てていたので、何かが原因でPCが落ちたりなどしたら、GitBucketが使えなくなってしまうので少し怖かったです。
セキュリティ等の観点から、自宅でサーバーを建てることはおすすめできないです。
建てるとしても、クラウドで建てればハッカソン期間中であれば数百円くらいで済むのでクラウドのほうが良いですね。

## Cocos2dx
今では話題に上がることがなくなってしまいましたが、モバイルゲームの初期を支えたオープンソースのゲームエンジンですね。
勉強したときはすでに、Unityのほうが主流になっていましたが、C++が使える点と、2Dゲームには強いという点から触れてみようと思いました。
Cocos2dxで2Dゲームを使ってAppStoreでゲームを公開していたりしました。

現在はCocos2dxではなく、CocosCreatorの開発に力を入れているようで、ブラウザゲームに強いゲームエンジンという印象があります。

## DirectX
ゲームプログラミングの鬼門の一つだと思います。
学生時代のPCゲーム制作で使ったグラフィックAPIですが、まっさらな状態では制作が終わらないので後述のフレームワークを利用して制作していました。

グラフィックスの基本を知るために知っておく必要はありますが、ゲーム制作の環境は整っている時代なので、直にAPI叩いてゲームを作る必要はないかなと感じます。
が、知っていればかなり大きなアドバンテージを得られるものではあります。

## BaseCross
https://github.com/WiZFramework/BaseCross

学校の先生が作成したDirectXベースのフレームワークです。
学生時代、学校での制作はこちらのフレームワークで行っていました。
上記のフレームワークは私が現役時代のもので、現在はBaseCross64がメインです。

https://github.com/WiZFramework/BaseCross64

こちらのフレームワークで作った作品の一つです(音量に注意してください)↓↓↓↓

<iframe width="560" height="315" src="https://www.youtube.com/embed/DBKPLKv4uXg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

お世辞にも、開発しやすい環境とは言えませんが(特にUI周り)、今ではなかなかできない（やろうと思わない)環境で開発を経験できたのは良かったなと思います。(愚痴ではないです)

オープンソースで人に使ってもらえるものを開発するのはなかなか難しいですが、学生に使われ続けるフレームワークを開発できる環境があるというのが羨ましいなと思います。
というのも、個人でゲーム用のフレームワーク作ろうと思うとなかなかモチベーションになるものを見つけにくいです。（次で話します)

## OpenGLES2.0
モバイルでゲーム開発ができるフレームワークを作ろうと思い、勉強しました。
フレームワークの完成は心が折れて終了しました・・・
が、以下の簡単な3Dゲームは完成させました。

![IMG_5684.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/fd716cc7-f4f2-f1cc-8c2a-5ac2020b3827.png)

指定された範囲に、ワイングラスをスライドさせてそこに止めるシンプルなゲームです。

一応ソースコードは公開していました(4年前)

https://github.com/KyoheiOkawa/RiverEngine/tree/slide_the_glass/master

サウンドを鳴らすためにOpenALも使用しています。

## UnrealEngine
「Unreal Engine 4 で極めるゲーム開発」を一通り手を動かして読んだ程度です。

https://www.borndigital.co.jp/book/6359.html

実際にUE4を使用した制作をしたことはないのですが、機会があれば触ってみたいエンジンの一つですね。

## PHP
学校の授業で触れました。
後述するブラウザゲームのランキングを実装するときに使ったり、とあるハッカソンでテキストチャットを実装するために利用したりしました。
チャットシステムを実装する際に、MySQLにメッセージを保存して、一定間隔でRestAPIを呼び出していたのはいい思い出です。

## Swift
興味があったので、学生時代に軽く入門書を読んだ程度ですね。
そこまで思い入れのある言語ではないですが、学生時代のとあるハッカソンでSwiftを使った開発があったのが良い思い出です。
その時リーダーだった方がAppStoreで公開してくださって、今も配信されています。

https://apps.apple.com/jp/app/%E3%83%A1%E3%83%AA%E3%83%BC%E3%81%95%E3%82%93/id1355473554

## Ruby On Rails
今までオフラインのゲームを作っていたので、オンラインの要素を入れてみたいと思ったことが勉強しようと思ったきっかけだったと思います。
クライアントはCocos2dxで、サーバーはさくらのVPSで借りて一つのゲームアプリをリリースしました。
「モフダッシュ２」というアプリで、現在は公開していませんが、ストアに載せていた動画は残っています。

<iframe width="560" height="315" src="https://www.youtube.com/embed/s5OmJKuVFJM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

自動横スクロールのジャンプアクションゲームですが、ユーザーがステージを作って公開できる機能があることがこのアプリの売りでした。

## enchant.js
今は開発が停まってしまっていますが、学習用のブラウザ向けゲームフレームワークです。
学校のコンペで、パソコン教室の生徒さんをターゲットに脳トレゲームを制作する際に使用しました。
久しぶりに確認したら、知らないうちにログイン前でも遊べるように公開されていました！
「メーメー牧場」というゲームです。

https://www.4353p-club.com/trial/#meme


## [Pyxel](https://github.com/kitao/pyxel)(Python)
とある1Dayハッカソンで、いつもUnityで作っているので、たまにはと思い採用したPythonのレトロゲームフレームワークです。
更新も活発ですね。

https://github.com/kitao/pyxel

こんな感じのゲームを制作しました。

![pyxel-181201-164500.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/657bb1d1-f0cd-a208-bcc6-8a1f39253454.gif)

## Jenkins
仕事を始めてからJenkinsの存在を知りました。
依頼すればいろいろ仕事をしてくれる便利なおじさんです。

## NodeJS
リアルタイム通信したいと思って、触れた実行環境です。
この時やったことは、Qiita記事にしていたので興味があればぜひ！

https://qiita.com/KyoheiOkawa/items/e9d2a11fb68096d8bb5b

## Kotlin
iPhoneからAndroidに携帯を切り替えたので、それがきっかけで触ってみようと思った言語だったと思います。
ちなみにこの時初めてAndroid使い始めました。
アウトプットとして、家にどのくらい引きこもっているか計測するアプリを作ったりしました。

## Docker
Dockerをちゃんと知る前までは、ローカルで環境を構築していました。
自分の環境が変わったときや、他の人も使うとき、またサーバーで環境を構築するのに毎回面倒だなと思っていたので、もっと早く知っていればと思います。

## GitHubActions
WordPressで構築したブログのデザインやレイアウトを修正するときに、自動デプロイしようと思ったことが触ったきっかけでした。
他にはElectronやFlutterで開発したツールをMacとWindowsでビルドしてアップロードすることを自動化したり、[マスタデータの自動チェック](https://qiita.com/KyoheiOkawa/items/b20f4b6aa3bca09924ef)をするときに活用しました。
UnityやFlutterなどで作った大きめのネイティブアプリのビルドができないわけではないですが、コスパと時間の効率が良くないのでお勧めはできないです。
ツールやサイトのデプロイ、チェックやテスト、パッケージのリリースといったことに活用するのが向いてるかなと思います。

## TOEIC(710点)
英語のドキュメントを読むことは割と避けられないので、勉強するきっかけとして受けました。
勉強した結果、以前よりもドキュメントは読みやすくなったと感じます。
次受けるときは800点台を目指したいです。

## Firebase
アプリを作るときに必要なサーバーの機能が一通りそろっているサービスです。
一通り使いこなせば、サーバーレスで個人アプリが開発できそうです。
Unityで利用していると、Unityバージョンアップグレードするときやビルド時に、Firebaseのプラグインが悪さをしてアプリが焼けないということが起こっていた記憶があります。

## [UniRx](https://github.com/neuecc/UniRx)
仕事を初めて２年目くらいに使うようになったライブラリです。
学生の時は使う理由が理解できなかったのですが、学生の制作と違って業務では参照するデータの数が多かったり、UIの数も多いので導入するメリットをここ２，３年で理解しました。

## [UniTask](https://github.com/Cysharp/UniTask)
Unityでasync/awaitを使うときにはこちらのライブラリは欠かせないと思います。
async/awaitを使うようになったときに、UniTaskと出会いました。
最初はC#標準のTaskでasync/awaitを書いていたのですが、Unityで使う際はUniTaskを利用したほうがパフォーマンス的にも使い勝手もよいです。
コールバックでは制御が難しかった(面倒だった)、アニメーションのキャンセルもCancellationTokenで制御できるのでこのあたりも好きなポイントです。

## Electron/React
GUIツールを、ユニバーサルプラットフォームで作りたいと思ったのがきっかけで勉強しました。
QtやXamarinなども選択肢にありましたが、身近に利用しているSlackやDiscordなどで採用実績があるElectronを使ってみたいとこのときは思いました。
ある程度ブラウザの知識があれば、生HTMLでもGUIを作れる手軽さがいいですね。

## Flutter(Dart)
会社でも使われ始め、モバイルアプリケーション開発で今熱いフレームワークと思い触れてみることにしました。
最近ではデスクトップアプリの開発もできるようになってきているので、Electronの代わりの選択肢としてもありだと感じています。

### [GetX](https://github.com/jonataslaw/getx)
Flutterデフォルトのままでは、遷移や表示更新周りがきついなという印象があったのでこちらのフレームワークが良いと思って使ってみました。
割とこのようなフレームワークの概念が、Unityでアプリの設計をするのに活かせるところがありますね。

## [VContainer](https://github.com/hadashiA/VContainer)
Unity用のDIフレームワークです。
効果的に利用できないか日々模索している段階です。
効果的な設計のサンプルができたら、そのうち記事を公開したいと思います。

## GCP(Compute Engine)
友人とマイクラで遊ぶために、サーバーを立てようと思ったことがきっかけです。
エンジニアなので、簡単な方法ではなく本格的にやりたいと思いました。
実際に建ててみることで、日々料金が課金されていくプレッシャーも体感することができます。
料金を抑えるため、Discord上で必要なタイミングで起動と停止ができるBotを実装してみたりしました。

## 自作キーボード

ここ最近までに、キーボードにこだわりがなく、安い最低限のキーボードを使用していました。
エンジニアという仕事柄、キーボードくらいはちゃんとしたの使おうと思い、[Happy Hacking Keyboard Professional HYBRID Type-S](https://www.pfu.fujitsu.com/direct/hhkb/detail_pd-kb820bs.html)を購入しました。

使っていくと、ちゃんとしたキーボードはいいなと思っていた矢先、職場の後輩から
「キーボードを作りませんか？」
と誘いを受け、作ってみることにしました。
前々から、自作キーボードに興味はあったのですが、なかなか手を出せずにいました。
転職で会社も離れちゃうし、思い出作りにもなるから、卒業制作にしようと思い、その後輩と仕事終わりに会議室でもくもく作りました。

それがこちらです↓↓↓↓↓↓↓↓↓
![PXL_20221116_013923737.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/f5322068-b41d-74f9-69a2-eac1988fc0d9.jpeg)

後ろにあるのはHHKBのキーボードです。

組み立てキットとパーツもろもろは、[遊舎工房](https://shop.yushakobo.jp/)さんで購入しました。


Corne Cherry v3というもので、基盤の設計などはオープンになっています。

https://github.com/foostan/crkbd/blob/main/corne-cherry/doc/v3/buildguide_jp.md

軸はGateron Inkの赤軸を選びました。
[遊舎工房](https://shop.yushakobo.jp/)さんで、軸のサンプルがあるので実際に触って選ぶことができます。

市販されている分割キーボードは選択肢が少ないので、自作キーボードにすれば割と自分の好みのものが見つかるかもしれません。

使い始めて２週間弱ですが、まだ分割キーボード慣れないですね。
分割キーボードに加えてキーの数が少ないのでこの辺りも慣れないです。
逆に慣れすぎると普通のキーボードが使えなくなってしまうので、慣れすぎるのも悩みどころです。
しかし、肩に優しい体制でタイピングができるのと、すべてのキーがホームポジションから離れずに打てるので慣れれば仕事の効率は上がりそうです。

# 最後に
当時のことを思い出して懐かしみながら楽しく記事を書くことができました！
割と様々な出会いがあったんだなと感じています。
ここまで読んでくださった方も、今までの思い出や出会いを記事にしてみるのはいかがでしょうか！？