💎

[個人開発]ノベルゲームエンジン「EmeralEngine」を作っているので紹介

に公開

0.前置き

皆さんノベルゲームは好きですか?
僕は好きです。
なので……

ノベルゲームエンジンを作ることにしました!!!

イェーイ

1.成果物: EmeralEngine

これまでちまちま開発を続けてたんですが、そろそろ公開するか〜ということで、全然開発中ですが公開することにしました。

https://github.com/Emeral-Engine/EmeralEngine

名前はEmeralEngineです。
作品を宝石に見立てて宝石の名前を使いました (というのはもちろん後付けです)

WPFで作っているので、対応プラットフォームはWindowsだけです。出力物もWPFなのでWindows向けのゲームしか作れません。(ここは改善の余地あり)

このアイコンは即興で書きました。モチーフは悪くないと思います。

2.特徴

まあ特に何かコンセプトがあって作り始めたわけではないんですが、強いて挙げるとすれば以下のような特徴があります。

1.完全ノーコードでゲーム制作が可能

素材とスクリプトとやる気があれば、入力していくだけでゲーム一本作ることが出来ます。
プログラミングなどという泥臭いことをする必要はありません。
が、.NETプロジェクトをエクスポートする機能もあるので、プログラミングの知識(C#、特にWPF)があれば自由に改変することが出来ます。(注意事項はあります。これはまたの機会にでも)

2.動作や容量が軽い

機能が少ないからかもしれませんが、起動や動作は結構速いと思います。
ゲームエンジン本体の容量も比較的軽いのでは(多分)。

3.導入&使い方&独自用語について

こちらはGithubのREADMEにて代えさせて頂きます。

というわけでここからは技術的な話になります。

4.技術スタックについて

改めて使用した技術をまとめます。

プラットフォーム: .NET

言わずもがな。

使用言語: C#

「GUIならC#だろ!!」という偏見で決めました。

フレームワーク: WPF

書けるやつがこれしか無かったです。
ただ一言だけ、MVVMは嫌いです。

音声再生: NAudio

ただの音声再生ならMediaElementで出来るんですが、この人Uriしか受け取ってくれないんですね。
一時ファイルを大量生成するのもなんかなぁと思い、MemoryStreamを渡したかったので渋々頼りました。

リソースの圧縮: Zstandard

あまり聞き馴染みのない人も多いかもしれませんが、Facebookなどで使われてます。圧縮/解凍速度に優れているため選択しました。

スクリプト実行: Roslyn

開発中、テストする度にビルドを走らせるのも苦痛だと思うので、スクリプト実行でささっと動くようにしました。

5.主な機能の実装

ビルド

ユーザーが入力した情報をもとにC#のコードを生成してdotnet publishを走らせてます。

セーブ&ロード

こちら、よく難しいと言われがちですが、(ノベゲに限れば)そんなに難しくなかったです。生成物のプログラム内部ではスクリプトとシーンはそれぞれ固有の数字を持ってるので、それらを保存して順にロードするだけでした。

セーブデータの保護

まあノベゲなんであんまりやる意味ないんですけど、生で置くのもお行儀が悪いので、適当にビット反転とハッシュ値で検証するくらいにしておきました。

リソースの保護

まあノベゲなんで(ry
前述したzstandardで圧縮、あと先頭2バイトを適当な乱数に置き換えてただ連結します。
これに元データのハッシュ値使ってアクセスするので、逆コンパイルしても結構な時間かかると思います。
どうしても抜き取られたくなければこの辺は暗号を自作してください。自作が一番強い暗号なので。

6.今後の展望

現時点ではまず必須であろう機能以外実装していません。
なので今考えている今後実装したい機能などを

1.シナリオ分岐

ノベルゲームなのにシナリオ分岐が今のところ出来ません。僕はそのタイプも好きですが、やっぱりノベルゲームといえばシナリオ分岐、という人もいます。現在「ストーリーエディター」はほぼ何の意味も成してませんが、ここでシナリオ分岐の指定をできるようにします。

2.ボイス機能

こちらは比較的簡単だと思ってます。実はめちゃムズだったら泣きます。

3.コンフィグ画面

音量とかテキスト表示の速さなど、色々弄ることができるノベゲは多いので、あっても良いかなぁと。

4.クロスプラットフォーム対応

僕はWindowsでしかノベゲをしません。逆にその他のプラットフォームでやろうとしてる人は考えを改めたほうが良いと思っているのですが、選択肢が多いに越したことはありませんからね。
ただし、これをやるにはフレームワークをWPFからAvaloniaなどに変える必要があり、(個人的に)得られるリターンより書き換える労力の方が圧倒的に上です。 (特にMVVMをやりたくない)
しかし、AvaloniaはWebでも動くらしく、一考の余地はあります。

5.リソースの読み込みの最適化

今のところは順次読み取りでやってますが、上を目指すならやはり裏であらかじめ読み込んでおくべきだと思います。

6.誤字脱字チェッカー

せっかく最近AIブームなので何か活かしたいな〜って考えたら、「誤字脱字を指摘してくれたら便利そう!」ということを思いつきました。APIとか使っていい感じにやりたい。

7.コードが汚い

その場の勢いで書いてるので変数名がとっ散らかってます。関数にするかどうかの基準はコピペとどっちが楽かという、オブジェクト指向にあるまじき思考をしてます。気が向いたら綺麗にしたい。

8.UIの改善

UIがダサすぎる現状ですが、機能優先で作ったのと僕のデザインセンスが無いだけです。許してください。
もしデザインやってくれる方がいたら泣いて喜びます。

7.終わりに

ここまでご覧いただきありがとうございました。
ここで衝撃のカミングアウトなのですが、実は僕ノベルゲームエンジンを触ったことがありません!
これでよく作ろうと思ったなおい。

というわけで他のゲームエンジンの常識は一切通用しません。これはこれで面白いんではないでしょうか???

個人開発なので更新頻度はさほど多くないですが、僕は最近大学に入学したばかりで時間だけは多くあるので、ある程度精力的に活動するつもりです。
あと機能要望やバグ報告があればGithubのIssueに投げてください。ですが前述の理由で対応は全然遅れる可能性があります。 後普通に新作やってる可能性もあります。これを書いている今も漆原さんの新作がやりたくて仕方がないです。

では、良いノベルゲーム生活を✨

Discussion