有时我们需要在lua代码中也写出C#那样的依据平台的代码。比如判断是否是在EDITOR模式下面。C#很好写:
#if UNITY_EDITOR
#endif
lua却没有宏定义的支持。
要实现这种效果可以从lua代码的加载入手,xlua代码的加载过程是可以自定义的,可以先把代码写成这样的:
if rsp.Status == OrderStatus.ToDeliver --[[#if UNITY_EDITOR or rsp.Status == OrderStatus.NeedPay#endif]] then
这段附加lua代码整体被注释了,如果不处理(在平台发布时就不会处理)不会对逻辑产生任何影响。接下来修改lua加载代码
public static byte[] EditorLoadLuaFile(ref string filepath)
{
filepath = Application.dataPath + "/Res/Lua/" + filepath.Replace('.', '/') + ".lua.txt";
var lua = File.Exists(filepath) ? File.ReadAllText(filepath) : "";
lua = System.Text.RegularExpressions.Regex.Replace(lua, "--\\[\\[#if UNITY_EDITOR(.*?)#endif\\]\\]", "$1", System.Text.RegularExpressions.RegexOptions.Singleline);
return Encoding.UTF8.GetBytes(lua);
}
// 一些说明:\\[是为了转义正则表达式的元符号[。System.Text.RegularExpressions.RegexOptions.Singleline是为了让元符号.能匹配换行符,写在多行也能匹配。
上面这个加载函数仅用在设置了UNITY_EDITOR时。核心逻辑就是把--[[#if UNITY_EDITOR #endif]]擦除。那一行代码就变为
if rsp.Status == OrderStatus.ToDeliver or rsp.Status == OrderStatus.NeedPay then了。
依此逻辑也就可以实现 #if UNITY_ANDROID等等的了。需要特别说明的是尽量不要用正则表达式而要用字符串查找替换,因为能提高执行效率。
网友评论