private string luaString = @"
function testFunc(num)
return num*2
end
t = {}
t.testFunc = testFunc
";
private LuaFunction luaFunc;
void Start () {
LuaState lua = new LuaState();
lua.Start ();
lua.DoString (luaString);
luaFunc = lua.GetFunction ("testFunc");
DelegateFactory.Init ();//委托工厂初始化
Func<int,int> funcDel = luaFunc.ToDelegate<Func<int,int>> ();
int s3 = funcDel(8888888);
Debug.Log (s3);
//释放资源
}lua方法转成c#委托,要先调用DelegateFactory.Init()方法初始化,没有调用时会报错
使用LuaFunction的ToDelegate方法转换,泛型参数表示要转换的委托类型
这里委托类型用的是内置的Func有返回值,lua代码中的参数返回的是数值类型,我说了可以用string来接,但是这里不行,就算是把lua方法的返回值改成string类型,同样不行,就是说不能用Func<...,string>接收委托,不明所以
private string luaString = @"
function testFunc(num)
return num*2
end
t = {}
t.testFunc = testFunc
";
private LuaFunction luaFunc;
void Start () {
LuaState lua = new LuaState();
lua.Start ();
lua.DoString (luaString);
luaFunc = lua.GetFunction ("testFunc");
luaFunc.BeginPCall ();
luaFunc.Push (2000);//参数的推入
luaFunc.PCall ();//调用
int s4 = (int)luaFunc.CheckNumber ();//获取返回值
luaFunc.EndPCall ();//结束释放资源
Debug.Log (s4);
//清理
}据说这种调用方法是不会产生内存垃圾的,但是不方便使用
private string luaString = @"
function testFunc(num)
return num*2
end
t = {}
t.testFunc = testFunc
";
private LuaFunction luaFunc;
void Start () {
LuaState lua = new LuaState();
lua.Start ();
lua.DoString (luaString);
//luaFunc = lua.GetFunction ("testFunc");
//string s2 = lua.Invoke<int,string> ("t.testFunc", 666, true);一样的
string s2 = lua.Invoke<int,string>("testFunc",666,true);
Debug.Log (s2);
}这里不需要获取到LuaFunction,直接用lua的Invoke方法,同样的泛型参数一是参数类型,参数二是返回类型。
参数一是lua的方法名,参数..,最后一个参数是不知道
private string luaString = @"
function testFunc(num)
return num*2
end
t = {}
t.testFunc = testFunc
";
private LuaFunction luaFunc;
void Start () {
LuaState lua = new LuaState();
lua.Start ();
lua.DoString (luaString);
luaFunc = lua.GetFunction ("testFunc");
//luaFunc = lua.GetFunction ("t.testFunc");一样的
string s = luaFunc.Invoke<int,string> (33648);
Debug.Log (s);
//LuaFunc和LuaState的释放
}LuaFunc的Invok方法,泛型的第一个参数表示传入参数的类型,第二个参数表示返回的参数类型
这里lua方法是返回的是数值类型的,我这里用string类型来接受是可以的
using LuaInterface;
public class LuaFile : MonoBehaviour {
private string path;
LuaState lua;
void Start () {
this.path = Application.dataPath + "/Lua";
lua = new LuaState ();
lua.Start ();
lua.AddSearchPath (this.path); //添加搜索路径
}
void Update () {
if (Input.GetKey (KeyCode.D)) {
lua.DoFile ("a.lua");//可以重复调用,完整文件名
}
if (Input.GetKey (KeyCode.R)) {
lua.Require ("a");//只加载文件一次,再次触发文件Lua代码也不执行
}
}
void Destroy(){
lua.CheckTop ();
lua.Dispose ();
}
}通过AddSearchPath添加寻找lua文件的路径,后面调用直接输入文件名(后缀),ToLua会在添加了的搜索路径下查找这些文件再执行。
这个路径可以添加多个,ToLua按添加的顺序去搜索文件,找到之后就不在往下搜索了
只有添加了路径下的lua文件,才可以被加载
using LuaInterface;
public class HelloLua : MonoBehaviour {
private string script = @"
print('hello toLua');--这个是lua代码字符串
";
// Use this for initialization
void Start () {
LuaState lua = new LuaState ();//创建lua虚拟机,主要用于和C#交互
lua.Start (); //启动,初始化
lua.DoString (script); //调用字符串形式的lua代码
lua.CheckTop (); //清空lua虚拟机栈
lua.Dispose (); //析构lua
lua = null; //赋空,让GC回收
}
}LuaState类在LuaInterface命名空间中
官方下载Tolua的源文件,将Assets目录下的文件拉进自己项目中,如果是Unity5.x的,再将Unity5.x下面的Plugins文件夹拉进项目中,替换覆盖原来的文件。再点击Lua/Generate All注册c#方法到lua中等,这样示例就可以跑起来了,当然,你也可以开发了。
using UnityEngine.Networking;
IEnumerator LoadForWebRequest(){
string fileUrl = "file://D:/Documents/Study/Assets/14/AssetBundle/ppp.assetbundle";
using (UnityWebRequest request = UnityWebRequest.GetAssetBundle (fileUrl, 0)) {
yield return request.SendWebRequest(); //发送等待回应
AssetBundle bundle = DownloadHandlerAssetBundle.GetContent (request);
Object player = bundle.LoadAsset ("Player");
Instantiate (player);
bundle.Unload (false);
}
}据说WWW要被抛弃了,没错就是UnityWebRequest替代了
使用UnityWebRequest.GetAssetBundle()发起加载AssetBundle请求
通过DownloadHandlerAssetBundle.GetContent()获取到AssetBundle资源
IEnumerator LoadForWWW(){
string fileUrl = "file://D:/Documents/Study/Assets/14/AssetBundle/ppp.assetbundle";
using(WWW www = new WWW(fileUrl)){ //www资源用完自动释放
yield return www; //等待加载完成
AssetBundle bundle = www.assetBundle; //通过assetBundle属性获取
Object player = bundle.LoadAsset ("Player");
Instantiate (player);
bundle.Unload (false);
}
}使用www来加载资源,如果加载本地的需要加上file:://协议表示本地
所有需要加载服务器上的资源时,用http://,https://等
void LoadForAssetBundle(){
string filePath = "D:/Documents/Study/Assets/14/AssetBundle/ppp.assetbundle";
AssetBundle bundle = AssetBundle.LoadFromFile (filePath);
Object player = bundle.LoadAsset ("Player");
Instantiate (player);
bundle.Unload (false);
}不需要等待,直接使用AssetBundle的静态方法LoadFromFile直接得到AssetBundle
通过LoadAsset("资源名字"),加载AssetBundle里面的资源
Unload()方法传递一个bool值,true表示释放全部,false表示释放没有用到的