C#調用Lua方法1+C#調用Lua方法2,3

xLua中Lua調用C#代碼

? ? ? ? 原因:C#實現的系統,因為Lua可以調用,所以完全可以換成Lua實現,因為Lua可以即時更改,即時運行,所以游戲的代碼邏輯就可以隨時更改。

? ? ? ? 實現和C#相同效果的系統,如何實現?

? ? ? ? ? ? ? ? Lua調用Unity的各種API,從而實現C#開發系統同樣的效果

xLua中C#調用Lua代碼

? ? ? ? 原因:Unity是基于C#語言開發的,所有生命周期函數都是基于C#實現,xLua本身是不存在Unity的相關生命周期函數的。如果希望xLua能夠擁有生命周期函數,那么我們可以實現C#作為Unity原始調用,再使用C#調用Lua對應的方法。

具體代碼示例:

在前幾節提到的使用單例模式的xLuaEnv代碼中添加如下代碼:

 //返回Lua環境的全局變量public LuaTable Global{get{return _Env.Global;}}

添加CSharpCallVariable腳本代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;public class CSharpCallVariable : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("return require('L2C/CSharpCallVariable')");//Debug.Log(data[0]);//LuaEnv提供了一個成員變量Global,它可以用于C#獲取Lua的全局變量//Global的數據類型是C#實現的LuaTable,LuaTable是xLua實現的C#和Lua中表對應的數據結構//xLua會將Lua中的全局變量以Table的方式全部存儲在Global中//通過運行環境,導出全局變量,類型是LuaTable//LuaTable是C#的數據對象,用于和Lua中的全局變量存儲的table對應LuaTable g = xLuaEnv.Instance.Global;//從Lua中,將全局變量提取出來//參數:Lua中全局變量的名稱//類型:Lua中全局變量的名稱所對應的類型//返回值:變量的值int num = g.Get<int>("num");float rate = g.Get<float>("rate");bool isWoman = g.Get<bool>("isWoman");string name=g.Get<string>("name");Debug.Log("數字:" + num);Debug.Log("浮點數:" + rate);Debug.Log("布爾:" + isWoman);Debug.Log("字符串:" + name);}// Update is called once per framevoid OnDestroy(){xLuaEnv.Instance.Free();}
}

Lua相關代碼如下:

--隱性做了{num=100,rate=99.99,isWoman=false,name="admin"}
num=100
rate=99.99
isWoman=false
name="admin"

?運行測試結果如下:

使用C#代碼調用Lua代碼的函數

相關詳細代碼如下所示:

//C#相關代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;public delegate void Func1();
public delegate void Func2(string name);
public delegate string Func3();
//映射產生時,xLua提示添加的[CSharpCallLua]
public delegate void Func4(out string name, out int id);
public class CSharpCallFunction : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("return require('L2C/CSharpCallFunction')");LuaTable g = xLuaEnv.Instance.Global;//Lua的函數,會導出為C#的委托類型Func1 func1=g.Get<Func1>("func1");func1();//向Lua函數傳遞數據Func2 func2 = g.Get<Func2>("func2");func2("admin");//接收Lua函數的返回值Func3 func3=g.Get<Func3>("func3");Debug.Log(func3()+",被C#打印");//Lua多返回值Func4 func4 = g.Get<Func4>("func4");string name;int id;func4(out name,out id);Debug.Log(name + "," + id);}// Update is called once per framevoid OnDestroy(){xLuaEnv.Instance.Free();}
}
--Lua相關代碼
func1=function()print("這是Lua中的func1")
end
func2=function(name)print("這是Lua中的func2,參數是:"..name)
end
--Lua的函數會導出為C#的委托
func3=function()return "這是Lua中的func3"
end
func4=function()return "這是Lua中的func4",100
end

運行效果如圖所示:

使用C#代碼調用Lua代碼的結構體

詳細代碼如下所示:

//C#代碼如下所示
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;public delegate void OneStringParams(string name);
public delegate void TransSelf(LuaTable table);//針對結構體調用后添加
public delegate string OneStringReturn();
[CSharpCallLua]
public delegate void TransMy(LuaCore table);//Lua映射table過來,需要有個結構體進行對應
//Lua的table導出到C#的結構體,可以實現C#運行時無GC
[GCOptimize]
public struct LuaCore
{public int ID;public string Name;public bool IsWoman;public OneStringParams Func1;public OneStringReturn Func2;public TransMy Func3;public TransMy Func4;
}
public class CSharpCallTable : MonoBehaviour
{void Start(){xLuaEnv.Instance.DoString("require('L2C/CSharpCallTable')");//UseLuaTable();UseStruct();}public void UseLuaTable(){LuaTable g = xLuaEnv.Instance.Global;//獲取的是全局變量Core,因為它在Lua中是表,所以取出的是LuaTableLuaTable core = g.Get<LuaTable>("Core");//獲取Name//參數:table中索引名//類型:索引對應值的類型Debug.Log(core.Get<string>("Name"));core.Set<string, string>("Name", "admin");OneStringParams osp = core.Get<OneStringParams>("Func1");osp("admin");//相當于":"調用TransSelf ts = core.Get<TransSelf>("Func4");ts(core);}public void UseStruct(){LuaTable g = xLuaEnv.Instance.Global;//將Lua的table導出為coreLuaCore core=g.Get<LuaCore>("Core");Debug.Log(core.Name);core.Func4(core);}// Update is called once per framevoid OnDestroy(){xLuaEnv.Instance.Free();}
}
--Lua代碼如下所示
Core={}Core.ID=100
Core.Name="root"
Core.IsWoman=falseCore.Func1=function(name)print("這是Core表的Func1函數,接收到C#數據"..name)
endCore.Func2=function()return "這是Core表的Func2函數"
end
Core.Func3=function(self)print("這是Core表的Func3函數,Core表的成員變量Name是"..self.Name)
endfunction Core:Func4()print("這是Core表的Func4函數,Core表的成員變量Name是"..self.Name)
end

當出現以下問題提示添加[CSharpCallLua]解決問題,在代碼中添加后卻依然報錯,可嘗試以下方式解決問題:

按下上圖按鍵后重新運行游戲,報錯即可消失

更多有關于Lua與CS之間相互調用的相關知識:

https://shenjun-coder.github.io/LuaBook

該系列專欄為網課課程筆記,僅用于學習參考。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77180.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77180.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77180.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

macOS Chrome - 打開開發者工具,設置 Local storage

文章目錄 macOS Chrome - 打開開發者工具設置 Local storage macOS Chrome - 打開開發者工具 方式2&#xff1a;右鍵點擊網頁&#xff0c;選擇 檢查 設置 Local storage 選擇要設置的 url&#xff0c;顯示右側面板 雙擊面板&#xff0c;輸入要添加的內容 2025-04-08&#xff…

zustand 源碼解析

文章目錄 實現原理createcreateStore 創建實例CreateStoreImpl 實現發布訂閱createImpl 包裝返回給用戶調用的 hookuseSyncExternalStoreWithSelector 訂閱更新zustand 性能優化自定義數據更新createWithEqualityFncreateWithEqualityFnImpl 返回 hookuseSyncExternalStoreWith…

kotlin,Android,jetpack compose,日期時間設置

AI生成&#xff0c;調試出來學習&#xff0c;這些小組件會用了&#xff0c;就可以組合一個大點的程序了。 package com.example.mydatetimeimport android.app.AlertDialog import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.co…

構建k8s下Helm私有倉庫與自定義Chart開發指南

#作者&#xff1a;程宏斌 文章目錄 自定義helm模板1、開發自己的chare包2、調試chart3、安裝chart 自定義helm模板 https://hub.helm.sh/ 1、開發自己的chare包 [rootmaster ~]# helm create mychare //創建一個名為mychare的chare包 [rootmaster ~]# tree -C mychare/ //以…

MOP數據庫中的EXPLAIN用法

EXPLAIN 是 SQL 中的一個非常有用的工具&#xff0c;主要用于分析查詢語句的執行計劃。執行計劃能展示數據庫在執行查詢時的具體操作步驟&#xff0c;像表的讀取順序、使用的索引情況、數據的訪問方式等&#xff0c;這有助于我們對查詢性能進行優化。 語法 不同的數據庫系統&…

項目范圍蔓延的十大誘因及應對策略

項目范圍蔓延的十大誘因及應對策略是什么&#xff1f;主要在于&#xff1a; 缺乏清晰目標、利益相關方過多、需求變更未及時管控、缺少優先級體系、溝通鏈條冗長、管理層干預頻繁、資源與預算不匹配、技術風險被低估、合同或協議不完善、缺乏階段性驗收與復盤。其中缺乏清晰目標…

做好一個測試開發工程師第二階段:java入門:idea新建一個project后默認生成的.idea/src/out文件文件夾代表什么意思?

時間&#xff1a;2025.4.8 一、前言 關于Java與idea工具安裝不再展開&#xff0c;網上很多教程&#xff0c;可以自己去看 二、project建立后默認各文件夾代表意思 1、首先new---->project后會得到文件如圖 其中&#xff1a; .idea文件代表&#xff1a;存儲這個項目的歷史…

算法進階指南 分形

問題描述 分形&#xff0c;具有以非整數維形式充填空間的形態特征。通常被定義為&#xff1a; “一個粗糙或零碎的幾何形狀&#xff0c;可以分成數個部分&#xff0c;且每一部分都&#xff08;至少近似地&#xff09;是整體縮小后的形狀”&#xff0c;即具有自相似的性質。 現…

18-產品經理-跟蹤進度

禪道是一個可以幫助產品經理跟蹤研發進度的系統。通過禪道&#xff0c;產品經理可以從多個角度了解產品的研發狀態。在儀表盤中&#xff0c;可以展示所有產品或單一產品的概況&#xff0c;包括需求、計劃和發布數量&#xff0c;研發需求狀態&#xff0c;Bug修復率和計劃發布數。…

LeetCode算法題(Go語言實現)_36

題目 給定一個二叉樹的根節點 root &#xff0c;和一個整數 targetSum &#xff0c;求該二叉樹里節點值之和等于 targetSum 的 路徑 的數目。 路徑 不需要從根節點開始&#xff0c;也不需要在葉子節點結束&#xff0c;但是路徑方向必須是向下的&#xff08;只能從父節點到子節點…

深度解析:文件或目錄損壞且無法讀取的應對之道

引言 在數字化辦公與數據存儲日益普及的今天&#xff0c;我們時常會遭遇各種數據問題&#xff0c;其中“文件或目錄損壞且無法讀取”這一狀況尤為令人頭疼。無論是個人用戶存儲在電腦硬盤、移動硬盤、U盤等設備中的重要文檔、照片、視頻&#xff0c;還是企業服務器上的關鍵業務…

數據庫如何確定或計算 LSN(日志序列號)

目錄 如何確定或計算 LSN&#xff08;日志序列號&#xff09;**一、獲取當前 LSN****二、確定日志解析的起始 LSN****三、LSN 與物理文件的映射****四、應用場景** 如何確定或計算 LSN&#xff08;日志序列號&#xff09; LSN&#xff08;Log Sequence Number&#xff09;是數…

[ctfshow web入門] web24

前置知識 isset&#xff1a;判斷這個變量是否聲明且不為NULL&#xff0c;否則返回False mt_srand&#xff1a;設置隨機數種子&#xff0c;如果不手動設置&#xff0c;那么系統會自動進行一次隨機種子的設置 mt_rand&#xff1a;生成一個隨機數&#xff0c;這個隨機數與種子有個…

習題與正則表達式

思路&#xff1a; 二分查找&#xff1a; left 1&#xff08;最小可能距離&#xff09;&#xff0c;right L&#xff08;最大可能距離&#xff09;。 每次取 mid (left right) / 2&#xff0c;判斷是否可以通過增設 ≤ K 個路標使得所有相鄰路標的距離 ≤ mid。 貪心驗證…

最小K個數

文章目錄 題意思路代碼 題意 題目鏈接 思路 代碼 class Solution { public:vector<int> smallestK(vector<int>& arr, int k) {priority_queue<int> Q;for (auto &index:arr){Q.push(index);if (Q.size() > k)Q.pop();}vector<int> ans…

<tauri><rust><GUI>基于rust和tauri,將tauri程序打包為window系統可安裝的安裝包(exe、msi)

前言 本文是基于rust和tauri,由于tauri是前、后端結合的GUI框架,既可以直接生成包含前端代碼的文件,也可以在已有的前端項目上集成tauri框架,將前端頁面化為桌面GUI。 發文平臺 CSDN 環境配置 系統:windows 10平臺:visual studio code語言:rust、javascript庫:taur…

SAP系統采購信息記錄失效

問題&#xff1a;采購信息記錄失效 現象&#xff1a;最初主數據導入完成之后&#xff0c;單元測試的時采購信息記錄是有效的&#xff0c;中間經過配置的變化&#xff0c;集成測試初期發現采購信息記錄全部失效。 原因&#xff1a; 單元測試時發現采購訂單里面的條件類型…

視頻分析設備平臺EasyCVR打造汽車門店經營場景安全:AI智慧安防技術全解析

一、方案背景 某電動車企業不停爆出維權新聞&#xff0c;支持和反對的聲音此起彼伏&#xff0c;事情不斷發酵、反轉&#xff0c;每天都有新消息&#xff0c;令人目不暇接。車展、車店作為維權事件的高發場所&#xff0c;事后復盤和責任認定時&#xff0c;安防監控和視頻監控平…

ecovadis認證基本概述,ecovadis認證審核有效期

EcoVadis認證基本概述 1. 什么是EcoVadis認證&#xff1f; EcoVadis是全球領先的企業可持續發展&#xff08;ESG&#xff09;評級平臺&#xff0c;專注于評估企業在**環境&#xff08;E&#xff09;、勞工與人權&#xff08;S&#xff09;、商業道德&#xff08;L&#xff09…

初入Web網頁開發

1、網頁哪些內容 1.1 三個核心文件的作用 index.html&#xff1a;網頁的骨架&#xff0c;用HTML編寫網頁結構和內容。 script.js&#xff1a;網頁的行為&#xff0c;用JavaScript實現交互功能&#xff08;如按鈕點擊事件&#xff09;。 styles.css&#xff1a;網頁的外觀&…