Xluaホットアップデートの使用方法(1)

ホットアップデートの紹介

現在、主流のホットアップデートプログラムはまだluaであり、そのうちulua、ToLua、Xluaが最も人気があります。

uluaから継承されたToluahttp
//www.ulua.org/index.html
クリックして開く
ここに画像の説明を挿入

Xlua

https://github.com/Tencent/xLua
xluaの学習、最初にドキュメント内の必見のチュートリアルと構成ファイルを見てください
ここに画像の説明を挿入

C#はLuaを訪問

ここに画像の説明を挿入

C#へのLuaアクセス
ここに画像の説明を挿入
ここに画像の説明を挿入
注:xluaは、オーバーロードされた関数の呼び出しをある程度サポートするだけです。luaのタイプはC#よりもはるかに豊富ではないため、C#int、float、double対応などの1対多の状況があります。上記のluanumberへTestFuncの例では、これらのオーバーロードされたパラメーターがある場合、最初の行は区別できず、そのうちの1つだけを呼び出すことができます(生成されたコードの前の行)
ここに画像の説明を挿入

xluaによって提供された構成とチュートリアルを読んだ後、1​​つずつ提供された例を実行し、チュートリアルと構成ファイルを組み合わせて、開発でのxluaの使用を体験してみましょう。

空のプロジェクトにxluaをインストールします

ここに画像の説明を挿入

開発ツールの推奨事項

ここでvscodeを使用してluaを開発します。可能であれば、ライダーを使用して、
ここに画像の説明を挿入
vscodeで認識されない.txtサフィックスが付いたluaファイル開くことができます。txtサフィックスがなぜですか?変更できますか?公式回答を見る

ここに画像の説明を挿入
概要:Luaサフィックスは非txtサフィックスを使用でき、公式にも推奨されています。また、熱は単に移植するのではなく、必要な場所で再利用し、保守的に使用する必要があると思います。
それでは、txtサフィックスを削除して、
ここに画像の説明を挿入
vscodeがそれを認識できることを確認しましょう認識、まだ認識されるようにtxtサフィックスを追加し直します
ライダーでそれを開いて見てみましょう

ここに画像の説明を挿入
ここに画像の説明を挿入
Emmyluaプラグインをダウンロードしました。luaサフィックスのみが認識されますが、txtサフィックスは認識されないことがわかります。
ここに画像の説明を挿入

フォローアップでは、可能であればライダーを開発することをお勧めします。C#とLuaの混合開発エクスペリエンスは、はるかに優れています。vscodeを使用したC#の開発にはまだギャップがあります。もちろん、これはvscodeを使用して行うことができます。 +対。後で開発するためにvscodeを使用します(ライダーの30日間の経験が期限切れになりました)

開いた後、3つのXluaチュートリアルがあることがわかります
ここに画像の説明を挿入

最初の例は

C#call lua

詳細なメモがあります、ここにプロセスの要約があります。最初にグローバルluaenvを作成し、次にluaスクリプトをロードし(DoStringメソッドを使用)、luaのグローバル変数はGetによって直接アクセスされ、グローバルテーブルはインターフェイスによってマップされ、グローバル関数はdelgateによってマップされます(これもメソッドです)。著者が推奨)

void Start()
        {
    
    
            luaenv = new LuaEnv();
            luaenv.DoString(script);

            Debug.Log("_G.a = " + luaenv.Global.Get<int>("a"));
            Debug.Log("_G.b = " + luaenv.Global.Get<string>("b"));
            Debug.Log("_G.c = " + luaenv.Global.Get<bool>("c"));


            DClass d = luaenv.Global.Get<DClass>("d");//映射到有对应字段的class,by value
            Debug.Log("_G.d = {f1=" + d.f1 + ", f2=" + d.f2 + "}");

            Dictionary<string, double> d1 = luaenv.Global.Get<Dictionary<string, double>>("d");//映射到Dictionary<string, double>,by value
            Debug.Log("_G.d = {f1=" + d1["f1"] + ", f2=" + d1["f2"] + "}, d.Count=" + d1.Count);

            List<double> d2 = luaenv.Global.Get<List<double>>("d"); //映射到List<double>,by value
            Debug.Log("_G.d.len = " + d2.Count);

            ItfD d3 = luaenv.Global.Get<ItfD>("d"); //todo 映射到interface实例,by ref,这个要求interface加到生成列表,否则会返回null,建议用法
            d3.f2 = 1000;
            Debug.Log("_G.d = {f1=" + d3.f1 + ", f2=" + d3.f2 + "}");
            Debug.Log("_G.d:add(1, 2)=" + d3.add(1, 2));

            LuaTable d4 = luaenv.Global.Get<LuaTable>("d");//映射到LuaTable,by ref
            Debug.Log("_G.d = {f1=" + d4.Get<int>("f1") + ", f2=" + d4.Get<int>("f2") + "}");


            Action e = luaenv.Global.Get<Action>("e");//todo 映射到一个delgate,要求delegate加到生成列表,否则返回null,建议用法
            e();

            FDelegate f = luaenv.Global.Get<FDelegate>("f");
            DClass d_ret;
            int f_ret = f(100, "John", out d_ret);//lua的多返回值映射:从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数
            Debug.Log("ret.d = {f1=" + d_ret.f1 + ", f2=" + d_ret.f2 + "}, ret=" + f_ret);

            GetE ret_e = luaenv.Global.Get<GetE>("ret_e");//delegate可以返回更复杂的类型,甚至是另外一个delegate
            e = ret_e();
            e();

            LuaFunction d_e = luaenv.Global.Get<LuaFunction>("e");
            d_e.Call();

        }

インターフェイスは関数にもアクセスできます(関数はテーブルに追加されます)。関数を作成して試してみましょう。
ここに画像の説明を挿入

ここに画像の説明を挿入

2番目のチュートリアル

luaファイルの読み込み

luaファイルをロードするには、luaのrequire関数を使用します。例:DoString( "require'byfile '")
ここでは、xluaチュートリアルのロード部分を確認できます。
ここに画像の説明を挿入

正常にロードする前に、luaファイルをResourcesファイルの下に配置し、サフィックスをtxtにする必要があることに注意してください(そうしないと、Resourcesが認識されません)。チュートリアルによると、メインを追加してから
ここに画像の説明を挿入
ここに画像の説明を挿入
、必要なファイルをメインにロードします

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入

リソースに従ってロードされるため、複数ある場合は
、アセットの下のリソースに1つ、C#スクリプトの場所に1つ配置すると、C#スクリプトの下のリソースファイル内の対応するスクリプトが呼び出されます。存在しない場合は、他のLuaスクリプトで場所を探します
ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入

正常に読み込まれたことがわかります。
また、dostringで直接書き込むこともできます
ここに画像の説明を挿入

ここに画像の説明を挿入

ローダーのカスタムロード

チュートリアルでは、requireがローダーに従ってロードされることを示しています。カスタムローダーを試してみましょう(たとえば、Resourcesからロードしたくないが、カスタムファイルからロードしたい)

ここに画像の説明を挿入
ラムダ式はチュートリアルで記述に使用されます(無名関数、関数名を宣言する必要はありません)、これらを模倣するか、ラムダを使用しません

ここに画像の説明を挿入
私達はちょうどバイト配列は、ファイル名(ロードされたLUAファイル名)であるファイルパス、に渡しAddLoaderを、追加することができます戻っという関数を書くようにするには、このインタフェースは、バイト配列を返すことです見ることができる
限りプロセスを内部にロードするときに、luaスクリプトのすべてのコンテンツを取得して変換します

配列を返すだけで(luaスクリプトがオンラインの場合、インターネットからダウンロードできるか、luaスクリプトが
指定したフォルダーにある場合、指定したフォルダーアクセスします。さまざまなプラットフォームのフォルダーパスを知る必要があります。
ここに画像の説明を挿入

アプリケーションのデータパス実験を選択すると、
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
最後の実験

LuaはC#の例を呼び出します

luaの部分をコピーして、見やすくしましょう。作成者からのコメントは非常に詳細です。必要な場所に書き込むだけです。作成者は、xluaチュートリアルでC#を呼び出すluaの詳細な紹介もしています。
ここに画像の説明を挿入
概要:
新しいオブジェクトはCSを使用する必要があります。名前空間。Object()CSを使用した
静的属性の読み取り、CSを使用した書き込み、静的メソッド呼び出しはメソッド名を直接書き込みます(luaが呼び出す必要のあるすべてのC#メソッド、属性を追加する必要があります[LuaCallCSharp ])
C#によって呼び出されるクラスをLuaに保存して、毎回CSを介して頻繁に呼び出す必要がないようにします。

ここに画像の説明を挿入

C#の列挙型luaには、CSから直接アクセスすることもできます。
ここに画像の説明を挿入
ここに画像の説明を挿入
これらの3つの例はそれぞれ、ホットアップデートの基礎となるluaとC#間の相互呼び出しのプロセス全体を示しています。次の記事では、ホットアップデートについて説明します。 xlua、xluaの手順公式がホットアップデートを行う方法。

おすすめ

転載: blog.csdn.net/euphorias/article/details/112063413