可能有一些人對lua并不是太熟悉,它其實跟JavaScript、Ruby、Python等同為腳本語言。但是更加輕量,更加簡潔,沒有任何多余的功能。這也使得它可以根據(jù)自己的需要來進行定制。例如作為應(yīng)用的配置文件,又或者是游戲的腳本引擎等等。
由于它的輕量,因此它要寫更多的代碼來實現(xiàn)自己所需的功能,有時候還需要使用Lua提供的C Api來進行功能擴展,對于移動設(shè)備來說更是如此,例如:訪問定位、照相機等等。
而且Lua的C Api相對來說不容易理解和掌握,需要投入一定的時間去學(xué)習(xí)和累積這方面的經(jīng)驗。而LuaScriptCore就是為了解決這些問題而誕生,他簡化了擴展Lua的難度,讓開發(fā)者可以通過自己熟悉的語言來擴展Lua,完美解決Lua與原生代碼之間的通訊問題。
目前的LuaScriptCore版本為1.2.1,它支持iOS、Android、OSX平臺,最新版本中還加入了對Unity3D的支持。日后可能會加入更多的平臺的支持,讓其在各個平臺下都能夠更加方便地擴展和操作Lua。下面我來舉一個例子,就是Lua作為iOS應(yīng)用的配置文件,讓視圖可以根據(jù)配置文件指定的顏色,來變更視圖的背景顏色:
首先我們先到Github上下載LuaScriptCore。
根據(jù)LuaScriptCore上的iOS集成文檔將其集成到項目中。
然后在ViewController導(dǎo)入頭文件"LuaScriptCore.h",并在viewDidLoad方法中對LuaScriptCore進行初始化,如下面所示:
#import "ViewController.h"
#import "LuaScriptCore.h"
@interface ViewController ()
@property (nonatomic, strong) LSCContext *context;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.context = [[LSCContext alloc] init];
}
@end
- 添加一個叫做config.lua的配置文件,并在上面添加一個叫backgroundColor的變量,并初始化為紅色,如:

- 然后在viewDidLoad方法中使用LSCContext來執(zhí)行該腳本,如:
[self.context evalScriptFromFile:@"config.lua"];
- 再通過LSContext獲取lua里面的背景顏色變量backgroundColor并更改ViewController的view的背景顏色,如:
LSCValue *value = [self.context evalScriptFromString:@"return backgroundColor"];
if (value.valueType == LSCValueTypeNumber)
{
NSInteger color = [value toInteger];
self.view.backgroundColor = [UIColor colorWithRed:(color >> 16 & 0xff) / 255.0
green:(color >> 8 & 0xff) / 255.0
blue:(color & 0xff) / 255.0
alpha:1.0];
}
然后編譯運行應(yīng)用,則可以看到視圖背景色變成了紅色,如下圖所示:

這樣,一個簡單的lua交互例子就完成了。如果你需要動態(tài)修改配置文件,可以通過自己的數(shù)據(jù)器下發(fā)Lua配置文件到App,然后再讀取新的配置文件里面的值就可以實現(xiàn)動態(tài)更新了(如果是整個App的風(fēng)格配置處理過程也基本一樣_)。
接下來我們來看一下LuaScriptCore的一個比較強大的用法,那就是直接將OC中定義的類映射到Lua中進行使用。還是拿上面的例子來進行改造,我們新建一個叫Config的類型,該類型繼承LSCObjectClass類(注:必須繼承該類型)。代碼如下:
//----------------- Config.h ----------------------
#import "LSCObjectClass.h"
#import <UIKit/UIKit.h>
/**
配置類
*/
@interface Config : LSCObjectClass
/**
背景顏色
*/
@property (nonatomic) NSInteger backgroundColor;
/**
初始化
@param view 視圖對象
@return 配置對象
*/
- (instancetype)initWithView:(UIView *)view;
@end
//----------------- Config.m ----------------------
@interface Config ()
/**
視圖對象,不導(dǎo)出到lua的屬性要加下劃線
*/
@property (nonatomic, strong) UIView *_view;
@end
@implementation Config
- (instancetype)initWithView:(UIView *)view
{
if (self = [super init])
{
self._view = view;
}
return self;
}
- (void)setBackgroundColor:(NSInteger)backgroundColor
{
_backgroundColor = backgroundColor;
self._view.backgroundColor = [UIColor colorWithRed:(_backgroundColor >> 16 & 0xff) / 255.0
green:(_backgroundColor >> 8 & 0xff) / 255.0
blue:(_backgroundColor & 0xff) / 255.0
alpha:1.0];
}
@end
然后修改config.lua文件,增加一個初始化配置的方法,如所示:
function initWithConfig( config )
config:setBackgroundColor(0xffff00);
end
上面的Lua代碼中的initWithConfig帶有一個config參數(shù),該參數(shù)就是OC中定義的Config類型,在方法中會對config的背景顏色進行更改。
那么,viewDidLoad中同樣要進行相應(yīng)的代碼修改,如下所示:
- (void)viewDidLoad
{
[super viewDidLoad];
self.context = [[LSCContext alloc] init];
[self.context registerModuleWithClass:[Config class]];
self.config = [[Config alloc] initWithView:self.view];
[self.context evalScriptFromFile:@"config.lua"];
[self.context callMethodWithName:@"initWithConfig" arguments:@[self.config]];
}
可以看到,LSCContext初始化后,又調(diào)用了registerModuleWithClass方法,該方法是告訴Lua要注冊一個Config的類型,這樣才能夠讓Lua識別OC中定義的類(關(guān)于更多關(guān)于類型定義的內(nèi)容可以參考LuaScriptCore的文檔)。
然后要先調(diào)用evalScriptFormFile來執(zhí)行config.lua腳本(這步很重要,必須要先執(zhí)行l(wèi)ua文件,否則定義的方法是不生效的),再通過callMethodWithName方法來調(diào)用其initWithConfig的方法,并將config對象傳給Lua進行操作。
然后編譯運行就可以看到視圖變成黃色了,如圖所示:

可以看到LuaScriptCore可以很方便地將Lua與原生代碼結(jié)合起來使用,節(jié)省了學(xué)習(xí)Lua的C Api所需要的時間,讓App可以做得更加動態(tài)化(Lua腳本的更新可以使應(yīng)用動態(tài)地更新)。上面的兩個例子只是拋磚引玉,相信聰明你們利用LuaScriptCore創(chuàng)造到更多有趣好玩的東西。
最后,我想說的是LuaScriptCore是我寫的_,該項目完全開源,有興趣或者有疑問的同學(xué)可以給我發(fā)郵件,謝謝支持~~