目录
- c#调用LUA
- LUA调用C#
- 反射机制
- 非反射机制
与C#交互
Lua代码都是运行时才编译的,不运行的时候就如同一张图片、一段音频一样,都是文件;所以更新逻辑只需要更新脚本,不需要再编译,因而Lua能轻松实现“热更新”。
交互的机制 (主要是lua调用C#)需要引入LuaInterface命名空间,c#调用lua,使用其中的函数和变量
1.反射机制
2.非反射机制
主要是warp
3.类型的对应
lua number string boolean nill table function
c# double string bool null LuaTable LuaFunction
注意在uLua/Editor下的WrapFile脚本里添加类型,并更新Source/LuaWrap里的文件
并在uLua/Lua/System/Global.lua下添加
using System.Collections;
using LuaInterface;
public class GameFacade : MonoBehaviour {
void Start()
{
CShapTolua()
}
加载Lua代码这一块,可以直接赋一段Lua代码字符串,也可以指定一个Lua脚本文件。
为了热更新,应当采用第二种加载方法,即创建一个Lua脚本文件。由于Unity不支持扩展名为lua的文件,所以可将Lua脚本扩展名定为txt(纯文本文件),并用unity的TextAsset列表负责记录所有脚本文件。
建议列表中给每个脚本搭配一个string类型的ID,这样凭此ID即可加载正确的lua脚本;
另外在LuaState类中新增一个String类型的public成员,赋值为该ID。这样一旦某个Lua脚本在运行时报错,可根据输出的ID值判断是哪个Lua脚本有错误。
c#调用LUA
public void CShapTolua()
{
LuaState lua = new LuaState() --lua虚拟机/状态机
string luaScript = @" --字符串处理lua脚本
num=10
tab = {key1 =1,key2 =2}
function LuaFunc(n)
print(n)
return 1,'2',3
end
print('hello world') ";
lua.DoString(luaScript); --使用lua虚拟机执行lua脚本
lua["num"] =20; --获取变量,修改变量
lua["name"] ="落海无情"; --创建变量
LuaTable tab = lua.GetTable("tab") --获取lua中的表
Debug.log( tab["key1"]) --获取表中的键
lua.NewTable("newTab") --创建新的表(在lua环境中,未修改字符串
LuaTable newTab = lua.GetTable("newTab”)
newTab["newKey1"] =1; --创建新的键
LuaFunction func = lua.GetFunction("LuaFunc"); --获取lua中的函数
object[] res = func.Call(10) --传参数
for(int i =0;i< res.Length;i++)
{ Debug.Log(res[i]); }
--将成员方法注册到lua环境
--lua中函数的名称
--c#持有该方法的对象
--通过反射获取c#方法中的信息
lua.RegisterFunction("LuaSimleFunc",this,GetType().GetMethod("SimpleMethod") )
lua.DoString("LuaSimpleFunc()");
--注册静态方法到lua环境
lua.RegisterFunction("LuaStaticFunc",null,typeof(GameFacade).GetMethod("Staticmethod"))
lua.DoString("LuaStaticFunc()");
}
LUA调用C#
public void LuaToCShap()
{ //反射机制
//LuaState lua = new LuaState();
//luastate.dofile 要是用文件的绝对路径
//string filePath = Application.dataPath + "/Scripts/lua2.lua";
//lua.Dofile(filePadth);
//非反射机制
LuaScriptMgr lua = new LuaScriptMgr()
//在lua环境中完成unity的环境搭建,可以直接使用wrap类
lua.Start();
lua.DoFile("MyLua"); //注意路径相对路径 ulua/Lua下
lua.GetLuaFunction("MyLua.Init").Call();
_c = lua.GetLuaFunction("Updatee")
}
LuaFunction _c;
private void Update()
{ _c.Call(Time.DeltaTime)
}
public void SimpleMethod()
{
Debug.Log("成员方法");
}
public static void StaticMethod()
{
Debug.Log("静态方法");
}
反射机制
lua2.lua ------- 反射机制
print(“ccc”)
--获取lua中的类
--加载DLL程序集
//预处理
luanet.load_assembly("Assembly-CSharp")
luanet.load_assembly('UnityEngine')
Vector2 = luanet.import_type('UnityEngine.Vector2')
Vector3 = luanet.import_type('UnityEngine.Vector3')
GameObject = luanet.import_type('UnityEngine.GameObject')
luanet.import_type('System.Collections.Generic.List')
Debug = luanet.import_type('UnityEngine.Debug')
//
luanet.load_assemly("UnityEngine") --加载DLL程序集
--获取GameObject类
GameObject = luanet.import_type("UnityEngine.GameObject") --获取类型
go = GameObject("NewObje")
--加载粒子的程序集
ParticleSystem = luanet.import_type("UnityEngine.ParticleSystem")
go:AddComponent(luanet.ctype(ParticleSystem))
--获取类,调用静态方法
GameFacade = luanet.import_type("GameFacade") --获取自定义的类
GameFacade.StaticMethod()
--查找游戏对象,获取组件,调用成员方法
obj = GameObject.Find("GameObject") --对象名称
gf = obj:GetComponent("GameFacade") --脚本名称
gf:SimpleMehod()
}
非反射机制
MyLua.lua ------- 非反射机制
MyLua ={}
local this = MyLua
function MyLua.Init()
this.go = GameObject("NewObj")
this.go:AddComponent(ParticleSystem.GetClassType())
camera = GameObject.Find("Main Camera")
this.go.transform:SetParent(camera.transform)
--获取Button游戏组件
btn = GameObject.Find("Button“”)
-- 执行Button.onClick:AddListener() --方法1
-- UIEventListener
-- btn.onClick:AddListener(function ( )
-- print("Click Click Click")
-- end)
UIEventlisterMake.Get(btn).onClick --方法2
= function ( go )
print(go.name)
end
function MyLua.Updatee( deltaTime )
--print(deltaTime)
-- this.go.transform:Rotate(
-- Vector3.up * 30 * deltaTime)
end