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