## 例子1
展示了最小的tolua#环境,以及执行一段lua代码操作代码如下:
``` csharp
LuaState lua = new LuaState();
lua.Start();
string hello =
@"
print('hello tolua#')
";
lua.DoString(hello, "HelloWorld.cs");
lua.CheckTop();
lua.Dispose();
lua = null;
```
LuaState封装了对lua 主要数据结构 lua_State 指针的各种堆栈操作。<br>
一般对于客户端,推荐只创建一个LuaState对象。如果要使用多State需要在Unity中设置全局宏 MULTI_STATE<br>
* LuaState.Start 需要在tolua代码加载到内存后调用。如果使用assetbunblde加载lua文件,调用Start()之前assetbundle必须加载好<br>
* LuaState.DoString 执行一段lua代码,除了例子,比较少用这种方式加载代码,无法避免代码重复加载覆盖等,需调用者自己保证。第二个参数用于调试信息,或者error消息(用于提示出错代码所在文件名称)<br>
* LuaState.CheckTop 检查是否堆栈是否平衡,一般放于update中,c#中任何使用lua堆栈操作,都需要调用者自己平衡堆栈(参考LuaFunction以及LuaTable代码), 当CheckTop出现警告时其实早已经离开了堆栈操作范围,这是需自行review代码。<br>
* LuaState.Dispose 释放LuaState 以及其资源。<br>
> **注意:** 此例子无法发布到手机
## 例子2
展示了dofile跟require的区别, 代码如下:
``` csharp
LuaState lua = null;
void Start ()
{
lua = new LuaState();
lua.Start();
//如果移动了ToLua目录,需要自己手动,这里只是例子就不做配置了
string fullPath = Application.dataPath + "/ToLua/Examples/02_ScriptsFromFile";
lua.AddSearchPath(fullPath);
}
void OnGUI()
{
if (GUI.Button(new Rect(50, 50, 120, 45), "DoFile"))
{
lua.DoFile("ScriptsFromFile.lua");
}
else if (GUI.Button(new Rect(50, 150, 120, 45), "Require"))
{
lua.Require("ScriptsFromFile");
}
lua.Collect();
lua.CheckTop();
}
void OnApplicationQuit()
{
lua.Dispose();
lua = null;
}
```
tolua#DoFile函数,跟lua保持一致行为,能多次执行一个文件。tolua#加入了新的Require函数,无论c#和lua谁先require一个lua文件, 都能保证加载唯一性<br>
* LuaState.AddSearchPath 增加搜索目录, 这样DoFile跟Require函数可以只用文件名,无需写全路径<br>
* LuaState.DoFile 加载一个lua文件, 注意dofile需要扩展名, 可反复执行, 后面的变量会覆盖之前的DoFile加载的变量<br>
* LuaState.Require 同lua require(modname)操作, 加载指定模块并且把结果写入到package.loaded中,如果modname存在, 则直接返回package.loaded[modname]<br>
* LuaState.Collect 垃圾回收, 对于被自动gc的LuaFunction, LuaTable, 以及委托减掉的LuaFunction, 延迟删除的Object之类。等等需要延迟处理的回收, 都在这里自动执行<br>
> **注意:** 虽然有文件加载,但此例子无法发布到手机, 如果ToLua目录不在/Assets目录下, 需要修改代码中的目录位置<br>
## 例子3 LuaFunction
展示了如何调用lua的函数, 主要代码如下:
``` csharp
private string script =
@" function luaFunc(num)
return num + 1
end
test = {}
test.luaFunc = luaFunc
";
LuaFunction luaFunc = null;
LuaState lua = null;
void Start ()
{
new LuaResLoader();
lua = new LuaState();
lua.Start();
DelegateFactory.Init();
lua.DoString(script);
//Get the function object
luaFunc = lua.GetFunction("test.luaFunc");
if (func != null)
{
int num = luaFunc.Invoke<int, int>(123456);
Debugger.Log("generic call return: {0}", num);
num = CallFunc();
Debugger.Log("expansion call return: {0}", num);
Func<int, int> Func = luaFunc.ToDelegate<Func<int, int>>();
num = Func(123456);
Debugger.Log("Delegate call return: {0}", num);
num = lua.Invoke<int, int>("test.luaFunc", 123456, true);
Debugger.Log("luastate call return: {0}", num);
}
lua.CheckTop();
}
void OnDestroy()
{
if (luaFunc != null)
{
luaFunc.Dispose();
luaFunc = null;
}
lua.Dispose();
lua = null;
}
int CallFunc()
{
luaFunc.BeginPCall();
luaFunc.Push(123456);
luaFunc.PCall();
int num = (int)luaFunc.CheckNumber();
luaFunc.EndPCall();
return num;
}
```
tolua# 简化了lua函数的操作,通过LuaFunction封装(并缓存)一个lua函数,并提供各种操作, 建议频繁调用函数使用无GC方式。<br>
* LuaState.GetLuaFunction 获取并缓存一个lua函数, 此函数支持串式操作, 如"test.luaFunc"代表test表中的luaFunc函数。<br>
* LuaState.Invoke 临时调用一个lua function并返回一个值,这个操作并不缓存lua function,适合频率非常低的函数调用。<br>
* LuaFunction.Call() 不需要返回值的函数调用操作<br>
* LuaFunction.Invoke() 有一个返回值的函数调用操作 <br>
* LuaFunction.BeginPCall() 开始函数调用 <br>
* LuaFunction.Push() 压入函数调用需要的参数,通过众多的重载函数来解决参数转换gc问题 <br>
* LuaFunction.PCall() 调用lua函数 <br>
* LuaFunction.CheckNumber() 提取函数返回值, 并检查返回值为lua number类型 <br>
* LuaFunction.EndPCall() 结束lua函数调用, 清楚函数调用造成的堆栈变化 <br>
* LuaFunction.Dispose() 释放LuaFunction, 递减引用计数,如果引用计数为0, 则从_R表删除该函数 <br>
> **注意:** 无论Call还是PCall只相当于lua中的函数'.'调用。<br>
请注意':'这种语法糖 self:call(...) == self.call(self, ...) <br>
c# 中需要按后面方式调用, 即必须主动传入第一个参数self <br>
## 例子4
展示了如何访问lua中变量,table的操作
``` csharp
private string script =
@"
print('Objs2Spawn is: '..Objs2Spawn)
var2read = 42
varTable = {1,2,3,4,5}
varTable.default = 1
varTable.map = {}
varTable.map.name = 'map'
meta = {name = 'meta'}
setmetatable(varTable, meta)
function TestFunc(strs)
print('get func by variable')
end
";
void Start ()
{
new LuaResLoader();
LuaState lua = new LuaState();
lua.Start();
lua["Objs2Spawn"] = 5;
lua.DoString(script);
//通过LuaState访问
Debugger.Log("Read var from lua: {0}", lua["var2read"]);
Debugger.Log("Read table var from lua: {0}", lua["varTable.default"]); //LuaState 拆串式table
LuaFunction func = lua["TestFunc"] as LuaFunction;
func.Call();
func.Dispose();
//cache成LuaTable进行访问
LuaTable table = lua.GetTable("varTable");
Debugger.Log("Read varTable from lua, default: {0} name: {1}", table["default"], table["map.name"]);
table["map.name"] = "new"; //table 字符串只能是key
Debugger.Log("Modify varTable name: {0}", table["map.name"]);
table.AddTable("newmap");
LuaTable table1 = (L
没有合适的资源?快使用搜索试试~ 我知道了~
Lua实现进度条加载进入到新场景,实现角色随机移动
共2000个文件
info:946个
meta:429个
cs:219个
需积分: 46 5 下载量 128 浏览量
2019-07-25
17:09:15
上传
评论
收藏 23.3MB ZIP 举报
温馨提示
用Lua实现进度条异步加载与Cube随机移动(包括轴值移动)
资源推荐
资源详情
资源评论
收起资源包目录
Lua实现进度条加载进入到新场景,实现角色随机移动 (2000个子文件)
00000000000000001000000000000000 4KB
00000000000000002000000000000000 4KB
00000000000000003000000000000000 4KB
00000000000000004000000000000000 4KB
00000000000000004100000000000000 4KB
00000000000000005000000000000000 4KB
00000000000000005100000000000000 4KB
00000000000000006000000000000000 4KB
00000000000000006100000000000000 4KB
00000000000000007000000000000000 4KB
00000000000000007100000000000000 4KB
00000000000000008000000000000000 4KB
00000000000000009000000000000000 4KB
0000000000000000a100000000000000 4KB
0000000000000000b000000000000000 4KB
0000000000000000b100000000000000 4KB
0000000000000000c000000000000000 4KB
005c4d80949154e5c87348bb9f5d15eb 4KB
00b15eee8aab8d64e844fc53ee7395de 4KB
0142bbe402aab764582bb960d6966d34 5KB
016d08801254da34e9b60d01e6734f8f 12KB
01cd264c206ae482393dc9d04b26eca0 10KB
01e02995805eb483690380a911a657e2 60KB
02893ffb522b490a9fa28eedd2584309 12KB
02ba9c90e50e89e4da2ee869851300a0 4KB
032822da3092a2543aabbd58c5697222 4KB
034154e518117d842b99fd1f19efa3a3 4KB
036fab5eb22f19e4bba933e194fb4756 6KB
0386b6eb838c47138cd51d1c1b879a35 18KB
03ffb9844f8d40e8a2f59dd2aff561eb 4KB
050d1b9436b6c804caea4312fa077f61 6KB
058cba836c1846c3aa1c5fd2e28aea77 30KB
05dc1e98babb44f47ad2a28a88b76380 4KB
05f5bfd584002f948982a1498890f9a9 32KB
05f7f519769978b79b31d063a7fc6fa1 5KB
0621b4aab2236437592f1f292cb81d20 4KB
063774d2ff01c43719d93b2d95e298b3 23KB
063b1587caa4a47f396741f4e69d108c 15KB
066619c9c9c84f89acb1b48c11a7efe2 13KB
0693d19658479a642a7faaa61feb2c09 4KB
06b575597b644fe8ba88495149d01b66 4KB
06f8e3404d534cab82fe852ff33dad77 7KB
072450ffed31fe545a60f71f33f53916 5KB
07657567fb0a4fe439b7e52f48d787e1 7KB
07805e704145c3b47b7c511a16d66d99 9KB
07994bfe8b0e4adb97d706de5dea48d5 23KB
07aecff784dcab84393e4fad04c7b35d 4KB
08700fd491ce4cf4ba55fd9832b9f9cf 4KB
0882b1dfb9d5f9e408ec017206a4946a 4KB
08e54c61aaaa7c545b03c37c12e41df1 4KB
09e28640d754a611467eebfb261ed749 4KB
0a1161a2ab6569948a0aa7899197218c 5KB
0a2c7bcbdfe0a438999cb0653789cdf4 5KB
0a822dba3d5c4c85b150866e5442a5ec 4KB
0b90da095ffcaa34891335989ba05ddf 4KB
0c156a7b2f4d450da1716b1625b5441d 4KB
0c18db8f96eb1aa4a9a72b098fb6dd61 7KB
0c297fdd08a27a54a96505801547f7b2 4KB
0c371c24024790e4fafc6efd6656ffa8 4KB
0c58b879bbb37ee4891c46ef87989f91 6KB
0ca08f899c4b9e9468fe93edcef60270 4KB
0d2d0f36e67d4518a07df76235e91f9a 5KB
0d3bb855445e36e479c85976fc88383a 5KB
0d9a36012a224080966c7b55896aa0f9 14KB
0dbc965b474b6824db5cb79d380403e4 4KB
0e372f1bbea04aa9bd68055d4105bd84 4KB
0e472cc047eb20841bbb7c64dfeb0d78 4KB
0e6d679a326324145bd5c12fb570ad5c 6KB
0e751e877ed14d71a6b8e63ac54949cf 6KB
0edd86f97b0648f685604a5582cff608 6KB
0f2e1d9dee4ecaf4b8734c59f1c9f3b5 4KB
0f51202a6e75c7448bb60a00eebdc87c 23KB
10145f279f90346bbb61712ff585828b 10KB
1048a87135154606808bf2030da32d18 14KB
1067213df0c64b319bc81e73be809b1a 4KB
10a526294333b45d0916e3da00f0e1fe 4KB
10bf81265ad87424d946598c575f45a0 8.01MB
11338f45069e3e041b7c42b60897ce0a 7KB
1158e311a3101950348dcecb1bebc42d 4KB
1160a89e211090a4ea787fb5145cc984 4KB
11a6a034ab84493cbed6af5ae7aae78b 27KB
11ebbcbb210e532448bcc1440a557d8f 4KB
1231975d3fb5f1b4995c9112ea3537f4 4KB
12736c98af174f91827a26b66d2b01b9 13KB
12fd8a0055b84bb59e84c9835a37e333 6KB
1322fd896bbb15bb6e335591b766ae62 4KB
13a59cb7747e2fd4d802f933f7e82f1c 4KB
13eb80ce50ac9c43cdbaf2109c0ec7db 4KB
14459b5f9debe5f47b5a300b6f1acfe8 8KB
15a615c733aa240909fe0b28b0d5143c 4KB
15be9c691b85a41a39c18beeff87e21b 10KB
15bf9c691b85b41a39c18bee2f87e21b 10KB
1634b8cf6fe522449aae40f121d55c24 14KB
1638f3415e6a8594ba9323f0ba3c5acf 5KB
1657737ff762147429751a7aba29104a 6KB
17346dbce1e39bd4b8cb9cdf6b9249e7 6KB
178008567c08e6d84014fa87825d10bb 4KB
17b632677410799367a53dc7ab96a8c2 4KB
17dfdb089f10445c78bcc4f5ec718217 25KB
18775b51e3bd42299fd30bd036ea982f 14KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
天霸畅游
- 粉丝: 8
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功