在Lua中支持#if UNITY_EDITOR宏定义

有时我们需要在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等等的了。需要特别说明的是尽量不要用正则表达式而要用字符串查找替换,因为能提高执行效率。

你可能感兴趣的:(在Lua中支持#if UNITY_EDITOR宏定义)