この短い投稿は、C#(または別の.NET言語)でゲームと組み合わせてLuaスクリプトを実行する方法を学ぶことにした後に生まれました。 LuaInterfaceライブラリを使用します。 C ++のlua.hと比較して、このインターフェースの使いやすさに感銘を受けました
![画像](https://habrastorage.org/getpro/habr/post_images/f86/12e/069/f8612e0691da4500e2a8733425c372e3.gif)
知っておくべきこと
C#適切なレベルで、Visual Studioのプロジェクト内のリンクを接続するだけでなく、プログラミングの基本を理解している
開始する
ソース(すべてのdllを含む)は、投稿の最後に投稿されます
最初に行うことは、LuaInterface.dllをプロジェクトに接続することです。 リンクを.dllファイルに追加するだけです。 それでもこれを行う方法がわからない場合は、インターネットでマニュアルを見つけることができます。 接続するにはluanet.dllも必要です
小さな教育プログラム
LuaInterface-LuaとCLRを便利に統合するためのライブラリ
Luaは非常に軽量なスクリプトプログラミング言語です。 ここに彼の分析があります
スクリプトが必要な理由-私の別の投稿からの抜粋
非表示のテキスト
大規模なプロジェクト(たとえば、大規模なゲーム)を開発した場合、新しい100行のコードごとにコンパイルが遅くなることに気づきましたか?
ゲームはより多くの武器、より多くのダイアログ、より多くのメニューなどを作成します。
イノベーションに関連して発生する最も重要な問題の1つは、無数の武器とバッジというかなり難しいタスクをサポートすることです。
会話を変更したり、新しいタイプの武器を追加したりするために友人/上司/パートナーからの要求に時間がかかりすぎる状況では、いくつかの手段に頼らなければなりません。たとえば、このすべてのゴミを別々のテキストファイルに記録します。
ほとんどすべてのゲーム開発者は、個別のテキストファイルでレベルマップまたはダイアログを作成し、それらを読み取りました。 少なくとも最も単純なオプション-入力ファイルを使用したコンピューターサイエンスのオリンピアードタスク
しかし、上記の方法-スクリプトを使用する方法があります。
問題解決
「わかりました、そのようなことについては、プレーヤーの特性の説明を含む通常のファイルで十分です。 しかし、急速に発展しているプロジェクトでほぼ毎日、メインプレーヤーのロジックをわずかに変更する必要がある場合、どうすればプロジェクトを何度もコンパイルする必要がありますか?」
いい質問です。 この場合、ゲームのすべての特性またはその他の部分でプレイヤーのロジックをサポートするスクリプトが私たちの助けになります。
当然、プレーヤーのロジックを何らかのプログラミング言語のコードの形式で保持するのが最も便利です。
最初の考えは、スクリプト言語の独自のインタープリターを作成して、数秒で脳から排除することです。 プレーヤーのロジックは、このような恐ろしいコストの価値はありません。
幸いなことに、テキストファイルを受け入れて実行するC ++用の特別なスクリプト言語ライブラリがあります。
そのようなスクリプト言語Luaの1つについて説明します。
ゲームはより多くの武器、より多くのダイアログ、より多くのメニューなどを作成します。
イノベーションに関連して発生する最も重要な問題の1つは、無数の武器とバッジというかなり難しいタスクをサポートすることです。
会話を変更したり、新しいタイプの武器を追加したりするために友人/上司/パートナーからの要求に時間がかかりすぎる状況では、いくつかの手段に頼らなければなりません。たとえば、このすべてのゴミを別々のテキストファイルに記録します。
ほとんどすべてのゲーム開発者は、個別のテキストファイルでレベルマップまたはダイアログを作成し、それらを読み取りました。 少なくとも最も単純なオプション-入力ファイルを使用したコンピューターサイエンスのオリンピアードタスク
しかし、上記の方法-スクリプトを使用する方法があります。
問題解決
「わかりました、そのようなことについては、プレーヤーの特性の説明を含む通常のファイルで十分です。 しかし、急速に発展しているプロジェクトでほぼ毎日、メインプレーヤーのロジックをわずかに変更する必要がある場合、どうすればプロジェクトを何度もコンパイルする必要がありますか?」
いい質問です。 この場合、ゲームのすべての特性またはその他の部分でプレイヤーのロジックをサポートするスクリプトが私たちの助けになります。
当然、プレーヤーのロジックを何らかのプログラミング言語のコードの形式で保持するのが最も便利です。
最初の考えは、スクリプト言語の独自のインタープリターを作成して、数秒で脳から排除することです。 プレーヤーのロジックは、このような恐ろしいコストの価値はありません。
幸いなことに、テキストファイルを受け入れて実行するC ++用の特別なスクリプト言語ライブラリがあります。
そのようなスクリプト言語Luaの1つについて説明します。
LuaInterfaceが接続されたプロジェクトができたので、コードに移りましょう!
LuaInterface-基本
基本的に.csファイルを書きます
using LuaInterface;
このライブラリのメインクラスはLuaです。
Lua lua = new Lua();
定数の宣言
非常に簡単に定数を宣言できます。 このように行われます
lua[] = ;
lua["version"] = 0.1; lua["name"] = "YourName"; lua["test"] = 200; lua["color"] = new Color(); lua["my"] = this;
値は何でも構いません-数字、文字列、さらにはクラスや構造(それらの操作方法の詳細)
機能登録
Luaでは、C#から関数を登録できます。
lua.RegisterFunction( Lua, this, );
lua.RegisterFunction("puts", this, typeof(Program).GetMethod("Test"));
クラスと構造の登録
LuaInterfaceの最も楽しい側面の1つは、C ++とともにLuaを使用する人を驚かせるかもしれませんが、クラスオブジェクトを登録してから、スクリプト内のさまざまな関数を「直接」呼び出すことができるということです。
つまり、これを行うことができます:
C#
class LuaDebug { // private void Print(string message, ConsoleColor color) { Console.ForegroundColor = color; Console.WriteLine(message); } public void Log(string message) { Print("Log: " + message, ConsoleColor.White); } public void Warning(string message) { Print("Warning: " + message, ConsoleColor.Yellow); } public void Error(string message) { Print("Error: " + message, ConsoleColor.Red); } public string ConsoleRead() { return Console.ReadLine(); } } // ... lua["Debug"] = new LuaDebug();
その後、次の内容のLuaスクリプトを作成します。
str = Debug:ConsoleRead() -- Debug:Log(" ") Debug:Warning(" : " .. str) Debug:Log(" !") Debug:ConsoleRead() --
Luaコードの実行
Luaコードを実行するには2つの方法があります(すべての登録済み関数と定数を使用)
最初はC#からまっすぐです
lua.DoString()
lua.DoString("Debug:Log('Hello, Habr!')" + "\n" + "Debug:ConsoleRead()");
2番目はファイルから
lua.DoFile(file)
lua.DoFile("script.lua")
(両方のメソッドはオブジェクト[]の値を返します-これはLuaスクリプトが実行後に返すものです)
例外処理
例外-スクリプトの実行中にポップアップ表示される可能性のあるエラーを処理するには、LuaException errを使用します
try { // Lua, lua, lua } catch (LuaException err) { // }
Luaからメソッドを呼び出す
Luaからメソッドを呼び出すには、スクリプトを実行し、メソッドをフェッチして、必要に応じて実行する必要があります。
例
lua.DoFile("file.lua") LuaFunction func = lua["func"] as LuaFunction; // function func() {...} end func.Call();
また、Call(params object [] args)では、入力パラメーターを関数に渡すことができます
同じフェイントは値でも機能します。LuaFunctionの代わりに、string、int、doubleなどを使用します
追加資料
- LuaTableクラスはLuaInterfaceのテーブルに提供され、Luaクラスオブジェクトの通常の変数として登録され、テーブル自体への変数の書き込みは、Luaオブジェクト自体の変数の書き込みとあまり変わりません。
- Luaとの「低レベル」作業に使用されるLuaDLLクラスもあります(lua.hから)。 彼にはほとんど意味がなく、誰もそれを真剣に使用しません
例
LuaDLL.lua_open(); LuaDLL.lua_createtable(luaState, 1, 1);
![画像](https://habrastorage.org/getpro/habr/post_images/01a/f2c/a34/01af2ca347dec0f26d06f8a7f8c3aad9.jpg)
ルアのシンボル
![画像](https://habrastorage.org/getpro/habr/post_images/8d1/904/e1c/8d1904e1cb0c8f0b21c35ef58eb8caa3.png)
Love2D-Luaで最も人気のあるエンジンの1つ
![画像](https://habrastorage.org/getpro/habr/post_images/e9e/370/afe/e9e370afed065de14e27b82e8a9b297c.png)
Lua上のMinecraftのMod
![画像](https://habrastorage.org/getpro/habr/post_images/2aa/3b1/d8f/2aa3b1d8f894e9f70588b55e126a3752.png)
https://bitbucket.org/Izaron/luaforhabr/src
ソースコード