ゲーム内でプログラミングを可能にするテクノロジーとは何ですか?


27

プレイヤーがゲーム内でスクリプトを記述/作成できるゲームがいくつかあります。たとえば、スペースエンジニアPsiです。

どちらかと似たものを使いたいのですが、情報を見つけるのに苦労したので、私の質問は:

ユーザーが作成した新しいコードを実行するためにコンパイルされたソフトウェアの機能をカバーするプログラミングのブランチはありますか?

プログラミングのブランチとは、PTG(手続き型地形生成)のようなものを意味します。

質問意見が広すぎるのを避けるために、ガイドや学習する場所を探しているのではなく、関連する技術の名前または定義(存在する場合)を求めています。


22
まあ、おそらく「通訳を書く」?
マシューロック

2
最近同様の質問に答え、ユーザーコードを実行するシステムの用語として「仮想マシン」について議論し、バイトコードパターンに関するGame Programming Patternsの記事を、従来のインタープリターよりも高速に実装する手段として参照しました
DMGregory

3
通常、「スクリプト」と呼ばれます。ゲームでスクリプトを実装する方法に関する多くの資料、および(さまざまな)オープンソースのサンプルと実際のコードが多数あります。より広い範囲には、コンパイラプログラミングのすべての分野があります(これには、字句解析、解析、コンパイル、リンク、解釈などが含まれます)。最も広い範囲(必ずしも役立つとは限りません)では、これにはアプリケーションでのユーザー操作がほとんど含まれます。スクリプトエンジンは、実際にはメニューから選択するためのはるかに複雑な方法です。
ルアーン

2
Pythonプログラムは、Pythonスクリプトをホストできます。それはメタプログラミングと呼ばれます。ほとんどのインタープリター言語にはそれがあります。
user6245072

1
Space Engineersの知る限り、コードはC#コードをサンドボックス環境でコンパイルしています(ゲームはオープンソースになったため、オンラインでの動作を確認できます:github.com/KeenSoftwareHouse/SpaceEngineers)。基本的に、ゲームにはC#コンパイラが付属しており、コードではゲームのAPI関数へのアクセスのみが許可されているため、プログラムの範囲はユーザーのみに制限されます。マルチプレイヤーをプレイしている場合、コードはマシン上でのみ実行されます(他のプレイヤー/サーバーはゲーム内の結果を見るだけです)
Florian Castellane

回答:


42

「Lua」、「Lisp」、「AngelScript」などのスクリプト/組み込み/解釈言語詳細はこちら)で記述されたスクリプトは、ゲーム中に更新可能であり[*]、その場で解釈(=実行)されます。

これらのスクリプトの要素をネイティブのコンパイル済みコーディング(C ++など)にバインドして、スクリプトがアプリケーションからロジックを実行できるようにすることができます。例 ユーザーがスクリプトに入力できる特定のコマンド。その結果、ゲーム内のキャラクターがゲーム世界で指定された距離だけ移動します。

関連するリンクされた質問:


[*] ユーザーがゲームプレイの一部として、または開発者がアプリケーションを再起動せずに高速の反復/テストを行う


14
何か「解釈された言語」と呼ぶときは注意が必要です。せいぜい非常に議論の余地のある用語です。
ウォンドラ

1
Computercraft(minecraft mod)はLUAをスクリプト言語として使用して、ゲーム内のタスクをプログラムします。
-Tikeb

20
私は本当に大騒ぎを理解していません。Lispは解釈とコンパイルの両方が可能です。私たちは、言語を分類する方法interpretedと、良い分類であるかどうかを議論するためにここにいません。言語はコンパイルする必要はないが、解釈できるという事実を知らないOPにOPを伝えています。いくつかの言語を例として挙げます。Lispは解釈されますか?はい。コンパイルされていますか?また、はい!しかし、それは範囲外です。答えは言葉遣いに不正確かもしれませんが、目的には適しています。OPを正しい方向にプッシュします。それが重要です。ここで、+ 1を取ります。
マシューロック

1
言語がコンパイル専用であっても、IDE、コンパイラ、ランタイムをゲームに埋め込むのを妨げるものは何ですか?予算を除いて、つまり。
オーダス

3
@DanielJour 理論的には言語はその実装とは異なります(マシンコードにコンパイルされたものとvmのバイトコードにコンパイルされたもの)。毎回「待って、コンパイルされたCか、解釈されたCか?」OPの目的のために、彼は解釈をサポートする言語を調べる必要があります。それらをコンパイルできるかどうかは、彼がそれを使用する方法ではないため、問題ではありません。
ブラックホーク

12

埋め込み言語は適切な技術用語です。実際には、他のアプリケーション(ゲームなど)内で使用される言語は、スクリプト言語または通訳言語とも呼ばれますが、通常のタスクを自動化するために必ずしも解釈または使用する必要はありません。「ゲームのスクリプト言語」をグーグルで検索すると、「埋め込み言語」を検索するよりも有用な結果が得られる可能性があります。


11

コードをいくつかのアクションに変更する方法を探しています。これはまさにインタープリターが行っていることです。

Pythonを見てください。あなたはそれを実行し、バム!あなたはに上陸REPLR EAD EヴァルP RINT Lの OOP)。

「Hello、world」を出力する関数「hello」を定義します。そして、あなたはそれを持っています!

何もコンパイルしていないことに注意してください。インタプリタは、(実行中に)その場で関数を作成するための魔法をかけ、今ではそれを呼び出すことができます。

同じことがゲームにも当てはまります。REPLを使用する代わりに、REPLモジュールを使用したゲームがあります。ゲームはおそらくREPLを開始し、このREPLの他のすべてを実行するため、データにアクセスして積極的に変更できます。

C ++のような巨大な言語で作業している場合、それらはあまり動的でなく、おそらくコンパイルされる傾向があります。もっと簡単にしたい。独自の言語を作成するか、既存の言語(CoffeScript、Squirrel、Lua、Schemeなど)を使用します。

これらは、他の言語(C ++など)で開発されたゲームエンジン上に構築されたスクリプトを記述するために使用するため、スクリプト言語と呼ばれます


2

ゲーム内プログラミング言語がゲームの目的にのみ設計されている場合、それはドメイン固有の言語です。

ドメイン固有の言語の利点(および欠点)は、言語自体がユーザーができることを制限できることです(つまり、インターネットへの接続を禁止できます)。一般的なゲームのタスクを汎用言語よりも簡単にする言語を設計できます。欠点は、ユーザーが新しい言語を学習する必要があることです。

ゲーム内から汎用言語(pythonやperlなど)でサニタイズされていないユーザーコードを実行すると、ユーザーが混乱してはならないことを混乱させることができます。しかし、それはあなたのゲームに依存します。ユーザーがゲーム内から新しいウィンドウを開くなどの操作を行うことを気にしない場合は、汎用言語を使用して、ゲームワールドの特定の機能へのバインディングを公開できます。


1

私は頭の外から考えることができる2つの例があります。どちらもあなたの求めていることを正確に行うようです。

最初はスクリープです。https://screeps.com/この目標を達成する方法については、http://support.screeps.com/hc/en-us/articles/205960931-Server-side-architecture-overviewでたくさん読むことができます。

2つ目はComputerCraftです。http://www.computercraft.info/ 仕組みについては詳しく説明していませんが、wiki http://www.computercraft.info/wiki/Main_Pageで少し見ることができます

本質的に、メインゲームは別のスレッドでインタープリターを実行し、そのスレッドがAPI呼び出しを介してゲームワールドを操作できるようにします。

両方の例で、言語はほぼ無制限です(セキュリティ上の理由でブロックされた呼び出しのみがあります)が、操作は実行可能なAPI呼び出しによって制限されています。

通常、このようなものを開始するために必要な作業はほとんどありません。あなたが必要

  • ゲームのループを保護するスレッドマネージャー(スレッドがループをロックしたり、多くのリソースを消費したりしないようにします)。どちらの例も時間ベースのリミッターを使用しています。
  • 言語を実行するインタープリター。LUAは最近よく見られます。
  • ゲームワールドを変更するAPIコールのセット。プログラミング言語で何もできなければ何が楽しいのか。
  • リソース管理の実装。言い換えれば、コードファイルを保存し、ゲームで参照する方法です。

これらすべての懸念を処理するプログラミングの単一のブランチはありません。ただし、マルチスレッドの強力な基礎と、インタープリターの動作に関する一般的な知識が必要です。


0

コンパイルされた実行可能ファイルには、外部プログラムコードを読み取れるパーサー が含まれている必要があります。プログラムコードは、C、Python、またはxyzのように見える必要はありません。問題の目的に適した任意の種類の記述データにすることができます。たとえば、スウェーデン語、またはモールス信号。

外部プログラムのコードには構文が必要であるため、パーサーは文字ごとに読み取って理解します。構文では、識別子、数値、演算子などを記述できます(コードに含めることができます)。

パーサーは修正(コンパイル)されていますが、柔軟な外部コードで動作します。

コンパイルされた実行可能ファイルには、関連する機能に対する内部APIが必要です。パーサーがアクションを実行できるようにします。ほとんどの場合、実行可能ファイルの内部データにも(双方向)アクセスする必要があります。または、パーサーが何らかのデータストレージとハウスキーピングを提供する必要があります。

パーサーは、実行可能ファイルの起動時に外部プログラムコードを読み取るか、アドホック(の一部)を読み取るか、各フレームごとに再読み取りする(非効率的)か、コードを手動で入力して、パーサーが準備が整うとパーサーにポストされます(「ユニットXを5ステップ進める」[入力]など)

基本的に、外部コードは固定されていません -年、日、分を変更できますが、実行可能ファイルを再コンパイルする必要はありません。実行可能ファイルによってホストされる結果の動作のみが変更されます。

現在読んでいるテキストは、次の文が何を言っているかを知らずに(または場合によってはこっそりと正しく変化する場合でも)読んでいるときに脳で「実行」するため、解釈されます今)。Stack Overflowとは対照的に、ストーリー全体を脳内でバイトコードに(事前)コンパイルし、それを実行してから、ofcに変更することはできません。

現在進行中現象は解釈です。スクリプティングは、説明を作成する、または書く行為にすぎません。すべてのコンピューターコーディングはimoスクリプトです-実行したいことを説明します。「スクリプティング」という言葉には多少傾斜した意味がありますが、大丈夫です。意味がわかります。

インタープリター言語には特別なものはまったくなく、議論の余地のある用語ではありません。それらの多くが存在し、非常に古いもののいくつかはコンパイルされたものとは対照的に解釈されます。インタプリタ言語では、たとえば手書きで入力できます:

sock = Socket.New(AddressFamily.InterNetwork、SocketType.Stream ProtocolType.Tcp)[ENTER]

...そして、30 ...に行きます。45分間のコーヒーブレイク:-)。戻るとき、「靴下」が存在し、さらに手で入力するか、インタープリターの自動化を続行することにより、さらに使用する準備ができています。


解釈される言語は遅くなければならないという一般的な誤解があります。それは真実ではない。この議論がコメントに対して広すぎるさまざまな要因に応じて、インタープリター言語は、高速と見なされる制御言語(通常はC)と比べて、大きさ、速度が遅い、同じくらい速い、または一部の操作でさえ速い場合があります。ソケットを使用した例はおそらくCのように多かれ少なかれ機能するので、この例は誤解を招く可能性があります。一部の言語では、実行時にコンパイルされた関数を再定義することもできます。また、解釈は単に「一度に1つの命令を実行する」ことを意味しません。
マシューロック

確かに、インタープリター言語はより高速に実行される可能性があります-結局、実行されるのはバイトコードであり、インタープリターの自動化に応じて、実行ははるかに最適化されます。さらに、一部のインタープリターは、コードからコードの一部をバイトコードにコンパイル(および実行)し、アドホックにできます。この例は、「一度に1つの命令を実行する」自由の例です。それは単純化しすぎです。「将来のコードは柔軟ですが」を追加するかもしれません。
ストームウィンド

「スクリプト」を映画のスクリプトのようなものと考えてください-まだ俳優が必要です。これらは演劇科学ではなく、生物学と社会学の観点から直接定義されています(ただし、これらは最終的に生物学と社会学に基づいています)その目的には適していますが、他には適していません:)
rackandboneman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.