2021-07-08に更新

C#でゲームを作った話

C#

はじめに

C#でゲームを作りました。

image

ゲームの詳細やダウンロードは以下からどうぞ。
ダウンロード

今回はC#でゲーム作ろうとした経緯から完成して配布までに感じた事を書いてみます。C#でというか、ゲーム作成ツールを使わずにゼロからまともにゲームを作ったのは初めてですので、その視点からの学びも記録します。

発端

自分は仕事でSEをやっていますが、去年、緊急事態宣言が始まったタイミングでその時の出向先での業務が次の現場が決まらないまま終わりました。
今は普通に仕事はありますが、あの頃は一時的にSEの仕事も減った印象があります。
で、仕方ないので3か月間ほど、Teamsを使って同じく仕事がなくなった自社の若いメンバーにC言語、C++と、(自分もほとんど触ったことのない)C#を教えていました。それがきっかけでC#を勉強し、勉強しつつ何か作ろうってことで今回のゲームを作り始めました。

なぜコンソールアプリ・・・

UnityとかGUIなやつだと、C#での実装以外の作業が多くなるかなと思ったのと、どんどん盛りだくさんになっていって絶対最後まで完成しないと思ったからです。
多分その予想は正しかったと思います。

セーブデータはどうする

作る前からゲームのセーブデータをどうしようって思っていました。
いざ作る時になって腹を決めて調べたら、.NETにはオブジェクトの内容をXMLの形で書き出し・読み出しができるクソ便利なクラスがあったのでそれを使う事にしました。詳しくは「.NET XML シリアライズ」で検索してください。
実際にはセーブデータとして書き込み・読み出しされるSaveDataクラスを用意して、その中にセーブデータとして残したいメンバをぶちこみます。でSaveDataのインスタンスをXMLシリアライズ・デシリアライズしてsave/loadを実現しました。もちろんそのままだと簡単に編集できてしまうので、XMLデータの暗号化・複合化も行っています。

この時注意したいのが、「SaveDataにreadonlyのデータを含めない」事です。セーブデータの容量が無駄に増えるだけの話ではありません。ゲームのアップデートでそのreadonlyのデータに変更が入っても、アプデ前のセーブデータを使うと当然ながらアプデ前のreadonlyデータになってしまい、変更が反映されなくなってしまう可能性があるからです(セーブデータに互換性がなくなる)。

「readonlyのデータをセーブデータに含めるわけねーだろ」って確かにその通りなのですが、最初にしっかり設計できていればの話で、最終的に1つのstructの中にreadonlyとそうでないデータが混在している・・・ってあるんじゃないでしょうか? 無い?

テスト

今回は、完成後のテストを十分に行いました。これの前に作ったゲームがあるのですが、そっちはあまりテストせずに公開し、延々とバグ報告があがる恐怖を味わいました。
何故ろくにテストせずに公開したのかというと、完成間近の時は、早く遊んでもらいたい、反応を見たいという欲がすごくなってしまったからです。今回もその誘惑がすごかったのですが、なんとか耐えてテストしきりました。
前に作った方はジャンル効果で幸運にも沢山遊んでいただき、フィードバックも十分にあったので結果オーライだったのですが、もしあまり遊ばれなかったらバグもそのままで、あとになって自分でプレイしたときに「こんなバグを誰からも指摘されず自分で発見してしまうなんて・・・全然遊ばれてなかったのか・・・・」と立ち直れなくなると思います。

.NETアプリの難読化

.NETで作ったアプリは、ほぼそのままのソースでリバースエンジニアリングできてしまうという特徴があります。なのでMicroSoftも難読化を推奨しているのですが、やる気になって色々難読化ツールを調べて使ってみても、以下の問題がありました。

・難読化したら動かなくなった
・難読化するとウイルス判定されやすくなった
・使えそうな難読化ツールがみんな有料(しかも高価)

どうしろと?みたいな状況です。
仕方ないので、VisualStudio経由でインストールできるDotfuscatorのCE版を使用しています。
ただしこれは、かなり甘い難読化です。文字列リテラルとかそのままです。
DotfuscatorのCE版より高機能で、無料でできる、ウイルス判定されない難読化ツールあったら教えてください。(切実)

どこで配布するか

今回はファイルそのものはふりーむさん一本にしました。
配布元は↑一本ですが、フリーゲーム夢現さんにも登録して入り口を増やしています。
前回はBOOTHVectorにも置きましたが、ゲームの場合は感想やコメントをもらいやすく、アプデも検知されやすい(かもしれない)ふりーむと夢現に絞った方がよいのではないかと思いました。
ちなみに、適当なアップローダーに置いて配布するのはやめましょう。ダウンロード先が信用できないとして、要注意アプリ扱いされる場合があります。

最後に

今回のゲームが完成間近のタイミングで、任天堂から「ナビつき!つくってわかるはじめてゲームプログラミング」がリリースされました。購入しましたが、今回のゲームが完成し、燃え尽きてなにもゲームのアイデアが無く、全然何も作れてない状態です。チュートリアルは全部クリアしましたが、正直このまま積みそうです。
ゲームのアイデアは尽きてますが、せっかくC#を勉強したので、Unityもやってみたいですね。勉強だけして満足しそうな気がしますが。

ツイッターでシェア
みんなに共有、忘れないようにメモ

uskz

自分のために書いていきます

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント