私はJavaでいくつかの小さなゲームを作り始めており、より大きなプロジェクトのためにC#の学習を検討しています。修正可能なゲームを作りたいのですが、ゲームを修正可能にするにはJavaに固執する必要があると誰かから言われましたが、理由はわかりません。
それでは、どのようなプログラミング言語の特性が、言語をモッダブルなゲームにより適したものにしているのでしょうか?
私はJavaでいくつかの小さなゲームを作り始めており、より大きなプロジェクトのためにC#の学習を検討しています。修正可能なゲームを作りたいのですが、ゲームを修正可能にするにはJavaに固執する必要があると誰かから言われましたが、理由はわかりません。
それでは、どのようなプログラミング言語の特性が、言語をモッダブルなゲームにより適したものにしているのでしょうか?
回答:
MODシステムの設計方法によって異なります。それらのうちの2つを調べます。
ほとんどの場合、MOD作成者があなたと同じ言語を使用し、リフレクション(または選択した言語に応じて同様の)を介してMODをロードする必要があります。これにより、明らかに遅延バインディングが可能な言語に制限されます-そして、これを行うことができる多くの言語があります(Cでさえ、巧妙なLoadLibrary
トリックで遅延バインディングを行うことができます)。MODが他のMOD(スクリプト化されたMODなど)をホストできるメタMODを実行することもできます。
このアプローチの最初の問題は、内部状態を隠すことです。C#を例にとると、modderはリフレクションを使用してプライベートメンバーにアクセスできますが、Cはこれも実行できます(ただし、より多くの作業が必要です)。
2番目の問題はホスティングです。サンドボックスがない場所でシステム上で実行される外部コードは、実際には嫌われています。最悪のシナリオとして、シードボックスを設定するmodを作成できます。これがISPにインストールされた場合、評判に深刻な損害を与える可能性があります。
Modderは、Luaなどの言語を使用してModを作成します。ネイティブコードを呼び出すことができる言語が必要です(Luaとのインターフェイスに)。または、選択した言語で独自のスクリプト言語を作成する必要があります。
ここでの最初の問題は、ほとんどのスクリプト言語が解釈されることです。これはリアルタイムシステムでは受け入れられない場合があります(ただし、LuaJITを参照)。ゲームなど。
皮肉なことに、2番目の問題はまだここにあります。私は非常に「砲撃アウト」しているされているコア/デフォルトのライブラリに含まれた機能を失望された例としてのLuaを取る-サンドボックス環境として、それは完全に無用作る(努力、運とメンテナンスの大量せずに)、それはハードにです私がこれについてどれほど怒っているかを描写しますが、これらの反特徴を含めて、彼らが強いカクテルを飲んでいたことを本当に願っています。独自の言語を使用している場合は、明らかにこれを簡単に回避できます(UnrealScriptを参照)。
最後に、スクリプティングエンジンとの対話のコストは法外なものになる可能性があります-再びLuaをC#と組み合わせると、ネイティブ関数を(P / Invoke経由で)呼び出すときにC#にはかなりのオーバーヘッドがあり、Luaはかなり「おしゃべり」なAPIです。「スクリプトSDK」を設計する方法が、主要言語とスクリプト言語の間で多くのチャットを必要とする場合、これは問題につながる可能性があります(Cには実際にはこの問題がないことに注意してください)。繰り返しますが、独自のスクリプト言語を記述し(MSILにコンパイルするC#の場合)、[仮想]環境で最も迅速に実行することで、これを回避できます。
スクリプトは基本的にプライマリコードとは完全に異なるシステムで実行されているため、内部状態へのアクセスを完全に制御できます(前述のシェル関数で派手なものを実行しない限り)。
私は少し話題を逸しましたが、テキストの壁から基本的に得ることができるのは、任意の言語で変更可能なゲームを作ることができるはずです(私はあなたができると言うことをベンチャーします)-しかし、いくつかの言語ではより多くの作業につながる可能性があります。セキュリティについて少しアナルですか?はい、ユーザーコードに関してはあなたもそうすべきです。
この言語はここでは決定的な要因ではありませんが、それはあなたがそれを定義するゲームをどれだけ柔軟かつデータ駆動型にするかということです。
すべてのゲームは、一連のデータ(たとえば、レベル、メッシュ、構成、アイテムなど)で実行されます。通常のゲームと変更可能なゲームの違いは、ユーザーが既存のデータを変更(または独自のデータを追加)できるツールを提供することです。どの言語を選択する場合でも、ゲームを可能な限りデータ駆動型にし、ゲームコンテンツをハードコーディングしないようにしてください。おそらく選択するほぼすべての言語で、ディスクからデータを読み取ることができます。これは必要なもののほとんどです。
また、個人用のツール(たとえば、独自のレベルエディター)を作成し、後で完成させてユーザーと共有するだけでも、半分の方法です。スーパー肉の少年のレベルエディタは、ほとんどのゲームの開発中に使用するツールの改善verision、ということでした。
また、ゲームのタイプに応じて、ユーザーがゲームの動作の一部をスクリプト化できるようにすることもできます。その場合、早い段階からスクリプト言語をゲームに組み込むことを検討する必要があります(独自の言語、または一般的な選択肢であるLuaやPythonのような既存の言語)。これも、データ駆動型設計のカテゴリに分類されます。既存のスクリプト言語を使用することにした場合、選択したプログラミング言語にそのスクリプト言語のバインディングがあるかどうかを確認する価値があるかもしれません(通常はサードパーティライブラリの形式)。
選択する言語は、実際にゲームがどの程度変更可能かを決定するものではなく、言語の使用方法がより重要になります。
ゲームの大部分がデータドリブンの場合(つまり、ゲームデータがコードから読み取られるファイルで定義されている場合)、ゲームは非常に変更可能です。これは、ほぼすべての言語で実行できます。スクリプト言語を使用すると、ゲームを簡単に変更できます。
ただし、これらを使用しないことでゲームを変更することが不可能になるということではありません。たとえば、Minecraftは非常に変更可能なゲームではありませんが、Java用の非常に優れたデコンパイラーとMinecraftの非常に大きなコミュニティがあるため、Minecraftを変更可能にするための多くのツールが作成されました(さまざまなmodloader、Bukkit)。これらのツールを使用すると、Minecraftを改造できます(ただし、一部の国ではおそらく技術的に違法です)。
私があなたに与えることができる最善のアドバイスは、modderが使用したいツールを使用することです。ファイルからNPCを定義する場合は変更できますが、コードで特殊なケースを使用する場合はおそらく変更できません。
Javaは、変更可能なゲームを作成するのに最適です。
そうは言っても、ゲームを変更可能にする最善の方法は、通常、より広範なアプリケーションに組み込み、スクリプト作成に使用できる動的言語を採用することです。コンパイル/ビルド/テストのサイクル全体を経ることなく、実行時にコードと対話できることがポイントなので、通常は動的言語が必要です。
考慮すべきいくつかの動的言語の選択:
少しずさんですが、Javaでこれを行う簡単な方法があります。あなたがやらなければならないのは、フォルダ内のドットjavaファイルを取得し、このバッチファイルをフォルダに入れて、Runという名前を付けることです:
javac /src/.java Java / src /
注:必要な数のクラスを追加できます。注:最後の行には、拡張子.java、.exe、.bat、ectを含めないでください。
これは基本的に、ゲームが実行されるたびにコードを再コンパイルするだけなので、ゲームのソースが変更された場合、それをコンパイルしてから、新しくコンパイルされたゲームを実行します...