此博文基于环境:Unity 2017.4.0f1 & tolua-1.0.7.392 & UnityGameFramework 3.1.1
GitHub上有个GF集成tolua的示例,地址:GitHub - GarfieldJiang/UGFWithToLua: Simple integration of ToLua# with UnityGameFramework.
打开示例,并导入GF框架,如果不出意外的话一定会有报错。
报错如图:
OK, 还算给力,报错不是很多。
报错提示没有using SceneManagement的名字空间,打开报错代码:
这里定义了Unity 5.4及以上版本则执行,但是前面写的却是一脸懵逼,把UNITY_5改为UNITY_5_4_OR_NEWER
改完之后这两个报错就被消灭了,不出意外的话还会有一堆报错:
好了,以上纯属是为了浪费各位看官的时间,凭什么我踩过的坑你们就想跳过?
以下进入正题:
这个UGFWithToLua应该是很古老了,用的GF和tolua版本都很低,对Unity新版本不兼容。
坑么卑鄙勒死狗,最新tolua免费奉上拿走不谢:GitHub - topameng/tolua: The fastest unity lua binding solution
把Assets改个名然后导入到项目Assets目录下:
配置LuaConst.cs中的luaDir, toluaDir:
public static string luaDir = Application.dataPath + "/tolua_1_0_7/Lua";
public static string toluaDir = Application.dataPath + "/tolua_1_0_7/ToLua/Lua";
配置CustomSetting.cs中的saveDir,toluaBaseType
public static string saveDir = Application.dataPath + "/tolua_1_0_7/Source/Generate/";
public static string toluaBaseType = Application.dataPath + "/tolua_1_0_7/ToLua/BaseType/";
然后还会有报错,这是因为LuaComponent使用了旧版本的tolua API,旧版tolua DoString()和DoFile()返回值为object[],而新版本返回void:
把LuaComponent的DoString、DoFile方法改为:
public void DoString(string chunk, string chunkName = "")
{
if (string.IsNullOrEmpty(chunkName))
{
m_LuaState.DoString(chunk);
}
m_LuaState.DoString(chunk, chunkName);
}
public void DoFile(string fileName)
{
m_LuaState.DoFile(fileName);
}
接着还会有报错,原因是ProcedureLunch.cs中使用了旧版GF的API,需要把EventId.ResourceInitComplete改为ResourceInitCompleteEventArgs.EventId
OK,大功告成,运行:
test.lua成功执行,但是gf框架报了一个错让人很不爽,这是gf 3.1.1的一个bug, 在SettingComponent完成初始化之前有地方调用了它的GetBool()函数,解决方法是把SettingComponent的Start方法改个名,放在Awake中调用。
Over!