個人でMMORPGを作ってきた話

# はじめに
皆さんは「MMORPG」、やったことがありますか？
私自身、ルーンミッドガッツ王国に降り立ち、例に漏れることなくとある剣士に甘酸っぱい恋心を抱き、そして恒例イベントにより心に阿修羅覇凰拳を受けた一人でもあります。~~インターネットは性別を超える！すごい！~~

さて、そんなMMORPGを小規模ですが個人で開発してきた経験を、ポエム的に投稿しようと思います。
**※あまり文章は書き慣れてないので、拙い部分はご容赦ください・・・**

# 当時の個人MMORPG開発界隈を振り返る
手掛けた作品や技術的な話に触れる前に、当時の事を少しだけ振り返ろうと思います。
MMORPG全盛期と言われた時代、プレイをする傍ら誰もが一度は「**こんな世界を自分でも創ってみたい！**」と思ったのではないでしょうか？

2000年当時だとUnityやUnrealEngineなどは勿論存在せず、CやC++でDirectX(DirectPlay)やSocketを利用するしかなかったため「**身内で会話できる程度のチャットソフト**」ですら趣味プログラマーには厳しい環境だったのですが、それでも数多くの同士達が思い思いの方法で「個人MMORPG」を開発し、公開していました。

私自身も一心不乱にモンスターをクリックする傍ら、Yahoo! JAPANで「MMORPG 作り方」「ネットワークプログラミング 講座」「MMORPG 無料 人気」「ビタタ カード 出ない」「ネカマ どういう意味」等、思いつく限りのワードで情報を集め、よくわからないなりにとりあえず動くものを作っては公開する日々を過ごしていました。

# 本題
過去開発し公開していたゲームの一つである「**ポケットブックオンライン**」について、使用した技術や苦労した点を話したいと思います。

## 開発のきっかけ
本作以外にもいくつか過去開発・公開をしていたのですが、当時仕事でUnityを使い始めた事もあり、**心機一転、新しい技術で作ってみたい！** という気持ちと、**なんかクリックゲー作るの飽きたな・・・** という気持ちが私の中でビックバンが如く膨張し、忘年会後に吐き気をこらえながら当時の社長と雑談している最中、「**手軽にコマンド選択で遊べるMMORPGを作ろう**」と思い立ちました。タクシー代は自腹でした。

## 使用した技術
開発環境も使用する言語も様々なので、あくまで一例として「**大体この辺の技術で作るんだぁへぇ～・・・うどんウッマ！:relaxed:**」程度でお付き合いください。正直個人で作る分には、開発言語や環境は何でもいいと思います。

* Client
    * Unity
        * 10年ほど前なのでめちゃくちゃ古いバージョンでやってました
        * まだUGUIとかそういう便利なものは無い。前世のNGUIが有名だった
* Server
    * C#
        * Clientと統一することで、DLLを共通化
        * 当時仕事でもServerで使用していたので勉強がてら
        * ~~C++でのサーバー開発にいい思い出がなく避けたかった~~
* DB
    * PostgreSQL
        * 当時仕事でもつか(以下略
        * RDB系自体、今ではあまり使用しないが、当時はどっぷりだった
* Network
    * RUDP / TCP
        * 慣れていたこともあり、直接socketを使用
        * 双方向通信とRequest/Response型のInterfaceを実装
        * UDPだと接続できない人がいたので、後々TCPによるfallback機構を入れました
        * 今だったら素直にMagicOnionやGRPC、場合によってはPhotonやMirrorを使うと思います
* MasterData
    * まだマスター管理?よくわからん。だった
    * とりあえずcsvと気合で頑張った
* Infra
    * 従量課金系は怖いので避けたかったので、VPS上に構築
    * まだdockerのドの時もない時だったので、割とごりっごりに実行環境構築をしていた

## 苦労したポイント

多少慣れていたとはいえ、まだまだひよっこ。俗に言う「**完全に理解した**」状態で挑んだので、案の定様々な壁にぶち当たりました。思い出すといくらでも出てくるのですが、いくつかピックアップして記載します。

### めちゃくちゃデッドロックした
排他制御のため、例えばモンスターのHPを減少させるタイミングでlockし、同時に走らせないようにする必要があるのですが、何も考えずに仕込んでいった結果、とにかく**めちゃくちゃデッドロック**しました。そして寝ている時、仕事をしている時など、場所を選ばず彼らはやってきます。こっわ。

発生したら最後、サーバー上のロジックが停止し、「**モンスターが何もせず、永遠とこちらを見つめてくる**」ような状態が発生します。ちょっとかわいいですね。

### RUDP対応
正式には**ReliableUDP**と呼ばれ、ドジっ子なUDPちゃんにあれやこれや冗長化処理を加えることで、信頼性を担保する技術です。詳細については色々記事があるので、そちらを参照。

別段ゲームデザイン的にはTCPでも問題は無かったのですが、当時同僚から日々熱くUDPの良さについて語られていた私は、ある種の中二病のような状態となり、「**TCPを　つかうなんて　とんでもない！**」「**(しらんけど)TCPはオーバーヘッドがうんぬんかんぬん(しらんけど)**」等と周囲にどや顔で語っていたことから、当時の私の鼻の伸びっぷりが容易に想像できますね。~~恥ずかしい~~

### とにかく開発に時間がかかる
これはもうゲーム開発全般に言える事なのですが、無限に時間がかかります。クライアントもサーバーも書かないといけませんし、インフラに関する知識も必要です。そしてあくまで**ゲーム開発**なので、企画やレベルデザインといった開発以外の作業時間も必要です。不具合もクライアント/サーバー/ネットワークに対して無限に発生します。**やめろ！そのタイミングで切断するな！やめてえええ！**

### 答えのないレベルデザイン
単純に私のレベルデザインに対する知識が薄い、というか無い事が原因なのですが、「**一人で遊ぶ場合**」と「**複数名あるいは大規模**」で遊ぶ場合での調整に苦労しました。というか反省点しかないです。

特にポケットブックオンラインでは、プレイヤーが好きなステータスを上昇させられたりしたので、私の知識では収集がつかない状態になりました。

結構このあたりは企画を考えるフェーズで、しっかりと計画性をもって考える必要がある事を学びました。ようやく。たぶん。恐らく。きっと・・・。

## 大変だけど楽しいから続けちゃう綺麗な泥沼

苦労した話ばかり書いてしまったので、ポジティブな体験についても書こうと思います
深い浅いはあるものの、広範囲の知識が得られました。これがかなり大きいです。
少なくとも様々な技術の入り口には立てるので、興味のある分野を深堀する前準備は出来ます。

また自分が思いつかないような遊び方をしてくれたり、自分もそこに参加出来たりと、MMORPGならではの体験をより濃く得ることが出来ます。超楽しいってやつです。連休前の金曜日の21時くらいの時に宝くじで8憶当たった時と大体同じです。当たったことないけど。

# 最後に
書きたい事が多すぎて、**圧倒的に文章**だらけな記事になってしまいました・・・。
次回書くときはもう少し読みやすくな・・・るといいなと思います。