unity刘国柱热更新设计之Xlua基础学习笔记(二)C#调用lua ...
一、获取一个全局基本数据类型1.LuaEnv.Global,中的Get方法,可指定返回的类型。
luaenv.Global.Get<int>(&#34;a&#34;)
luaenv.Global.Get<string>(&#34;b&#34;)
[*]文件放置方式
文件以txt为后缀
[*]内容Lua
--测试 Csharp 调用lua
--定义全局变量
str=&#34;全局变量&#34;
number=10
local num =20
floNumber =88.8
IsFisrtTime=true
[*]C#内容
//lua环境(官方建议全局唯一)
LuaEnv env = null;
void Start()
{
env = new LuaEnv();
env.DoString(&#34;require&#39;CsharpCallLua&#39;&#34;);
string str1 = env.Global.Get<string>(&#34;str&#34;);
int number1 = env.Global.Get<int>(&#34;number&#34;);
// int num1 = env.Global.Get<int>(&#34;num&#34;);//报错 报错如下图 因为这种方法只可以访问全局变量
//测试结果
Debug.Log(number1);//正常输出
Debug.Log(str1);//正常输出
// Debug.Log(num1);
}
private void OnDestroy()
{
//释放
env.Dispose();
}
二、访问一个全局table
1.四种方式:
[*]方式一:映射到普通class或struct
[*]方式二:映射到一个interface(推荐方式)
[*]方式三:by value方式:映射到Dictionary<>,List<>
[*]方式四:by ref方式,映射到LuaTable 类
2.方式一实例:为值拷贝 修改C#中类的属性值 lua文件中的属性值不变。
[*]文件放置同上
[*]lua文件代码
gameLanguge={str1=&#34;C#&#34;,str2=&#34;Lua&#34;,str3=&#34;C++&#34;,str4=&#34;C&#34;}
[*]C#
//lua环境(官方建议全局唯一)
LuaEnv env = null;
void Start()
{
env = new LuaEnv();
env.DoString(&#34;require&#39;CsharpCallLua&#39;&#34;);
//得到lua中的表信息
GameLanguage gameLanguage = env.Global.Get<GameLanguage>(&#34;gameLanguge&#34;);
//输出
Debug.Log(gameLanguage.str1);
Debug.Log(gameLanguage.str2);
Debug.Log(gameLanguage.str3);
}
private void OnDestroy()
{
//释放
env.Dispose();
}
//定义内部类
public class GameLanguage
{
public string str1;
public string str2;
public string str3;
}
3.方式二:为引用拷贝
[*]文件放置同上
[*]lua文件代码同上
[*]C#
//lua环境(官方建议全局唯一)
LuaEnv env = null;
void Start()
{
env = new LuaEnv();
env.DoString(&#34;require&#39;CsharpCallLua&#39;&#34;);
//得到lua中的表信息
IGameLanguage gameLanguage = env.Global.Get<IGameLanguage>(&#34;gameLanguge&#34;);
//输出
Debug.Log(gameLanguage.str1);
Debug.Log(gameLanguage.str2);
Debug.Log(gameLanguage.str3);
}
private void OnDestroy()
{
//释放
env.Dispose();
}
//定义接口一定要加标签
public interface IGameLanguage
{
string str1 { get; set; }
string str2 { get; set; }
string str3 { get; set; }
}
[*]需要在unity中生成对应的类
点击后会生成对应文件
在这个文件夹下
4.方式3 : by value方式
//lua环境(官方建议全局唯一)
LuaEnv env = null;
void Start()
{
env = new LuaEnv();
env.DoString(&#34;require&#39;CsharpCallLua&#39;&#34;);
//得到lua中的表信息
Dictionary<string, object> dic= env.Global.Get<Dictionary<string, object>>(&#34;gameLanguge&#34;);
//输出
foreach (stringkey in dic.Keys)
{
Debug.Log(dic);
}
}
private void OnDestroy()
{
//释放
env.Dispose();
}
5.方式4:by ref方式,映射到LuaTable 类(复杂函数,性能低)
//lua环境(官方建议全局唯一)
LuaEnv env = null;
void Start()
{
env = new LuaEnv();
env.DoString(&#34;require&#39;CsharpCallLua&#39;&#34;);
//得到lua中的表信息
LuaTable tabGameLanguge = env.Global.Get<LuaTable>(&#34;gameLanguge&#34;);
//输出
Debug.Log(tabGameLanguge.Get<string>(&#34;str1&#34;));
}
private void OnDestroy()
{
//释放
env.Dispose();
}
三、访问一个全局变量function
1.方式一:采用delegate方式。(官方推荐方式)
lua脚本
--定义单独的lua函数
function ProcMyFunc1()
print(&#34;ProcMyFunc1无参无返回值&#34;)
end
function ProcMyFunc2(num1,num2)
print(&#34;ProcMyFunc2 两个参数无返回值 num1+num2=&#34;..num1+num2)
endC#脚本
env = new LuaEnv();
env.DoString(&#34;require&#39;CsharpCallLua&#39;&#34;);
//得到lua中的表信息(通过委托进行映射)调用无参无返回值的函数
act=env.Global.Get<Action>(&#34;ProcMyFunc1&#34;);
//调用有参无返回值函数
act2 =env.Global.Get<delAdding>(&#34;ProcMyFunc2&#34;);
//输出
act.Invoke();
act2(50,12);
多返回值用out实现的方法
lua脚本
function ProcMyFunc4(num1,num2)
local result=num1+num2
print(&#34;ProcMyFunc4 两个参数多个返回值 num1+num2=&#34;..num1+num2)
return num1,num2,result
endC#脚本
//自定义委托(使用out关键字)
public delegate void aelAddingMutilReturn(int num1, int num2, out int res1, out int res2, out int res3);
public class CallLuaByGlableVar : MonoBehaviour
{
aelAddingMutilReturn act = null;
//lua环境(官方建议全局唯一)
LuaEnv env = null;
void Start()
{
env = new LuaEnv();
env.DoString(&#34;require&#39;CsharpCallLua&#39;&#34;);
//得到lua中的表信息(通过委托进行映射)得到具有多个返回值的函数
act=env.Global.Get<aelAddingMutilReturn>(&#34;ProcMyFunc4&#34;);
//输出
int intOutRes1 = 0;
int intOutRes2 = 0;
int intOutRes3 = 0;
act(100,80,out intOutRes1, out intOutRes2, out intOutRes3);
Debug.Log(string.Format(&#34;res1={0},res2={1},res3={2}&#34;, intOutRes1, intOutRes2, intOutRes3));
}
private void OnDestroy()
{
//释放之前需要将委托释放
act=null;
//释放
env.Dispose();
}
}
多返回值用ref实现的方法
//自定义委托(使用out关键字)
public delegate void aelAddingMutilReturn(ref int num1,ref int num2, out int res3);
public class CallLuaByGlableVar : MonoBehaviour
{
aelAddingMutilReturn act = null;
//lua环境(官方建议全局唯一)
LuaEnv env = null;
void Start()
{
env = new LuaEnv();
env.DoString(&#34;require&#39;CsharpCallLua&#39;&#34;);
//得到lua中的表信息(通过委托进行映射)得到具有多个返回值的函数
act=env.Global.Get<aelAddingMutilReturn>(&#34;ProcMyFunc4&#34;);
//输出
int intOutRes1 = 100;
int intOutRes2 = 80;
int intOutRes3 = 0;
act(ref intOutRes1, ref intOutRes2,out intOutRes3);
Debug.Log(string.Format(&#34;res1={0},res2={1},res3={2}&#34;, intOutRes1, intOutRes2, intOutRes3));
}
private void OnDestroy()
{
//释放之前需要将委托释放
act=null;
//释放
env.Dispose();
}
}
2.方法二:LuaFunc(不推荐)
//lua环境(官方建议全局唯一)
LuaEnv env = null;
void Start()
{
env = new LuaEnv();
env.DoString(&#34;require&#39;CsharpCallLua&#39;&#34;);
//得到lua中的表信息(通过LuaFunction进行映射)
LuaFunction luaFun = env.Global.Get<LuaFunction>(&#34;ProcMyFunc1&#34;);
LuaFunction luaFun2 = env.Global.Get<LuaFunction>(&#34;ProcMyFunc2&#34;);
//输出
luaFun.Call();
luaFun.Call(20,34);
}
private void OnDestroy()
{
//释放
env.Dispose();
}
页:
[1]