toLua介绍
toLua地址:传送门
我也是刚初学lua,项目使用的toLua,所以直接下载toLua并使用Example进行学习一波~
Lua的语法推荐在菜鸟上看:传送门
1.hello world.cs
using UnityEngine;
using LuaInterface;
using System;
public class HelloWorld : MonoBehaviour
{
void Awake()
{
LuaState lua = new LuaState();
lua.Start();
string hello =
@"
print('hello tolua#')
";
lua.DoString(hello, "HelloWorld.cs");
lua.CheckTop();
lua.Dispose();
lua = null;
}
}
看似比较简单啊。实际上需要剖析几个问题
LuaState是啥?
Start方法有啥用?
DoString有啥用?
CheckTop是干啥的?
Dispose又有啥用?
不要想当然,觉得DoString,就是能执行lua代码了。
那么怎么执行的?为什么能执行?如果连这些都不知道,那就还是不懂Lua啊!!
(推荐一篇大佬的文章:ToLua源码分析:启动流程,以下都是我对此文章的总结)
toLua是啥?
toLua基于LuaInterface,LuaInterface是一个实现lua和微软.Net平台的CLR混合编程的开源库,使得lua脚本可以实例化CLR对象,访问属性,调用方法甚至使用lua函数来处理事件。
toLua保留了LuaInterface基本形式,重写或移除了部分内容,使代码更加简洁,提供了对Unity的支持、拓展了lua5.1.4源码,而最大的改进在于,LuaInterface中lua访问CLR需要运行时反射,对于游戏应用来说效率不够理想
toLua则提供了一套中间层导出工具,对于需要访问的CLR、Unity及自定义类预生成wrap文件,lua访问时只访问wrap文件,wrap文件接收lua传递来的参数,进行类型(值、对象、委托)转换,再调用真正工作的CLR对象和函数,最后将返回值返回给lua,有效地提高了效率。
提供的功能
1.提供Lua-c#值类型、对象类型转化操作交互层。(ObjectTranslator.cs、LuaFunction.cs、LuaTable.cs、ToLua.cs等)
(大概意思就是toLua会对一些交互 进行封装 通过指针进行操作中间层?)
2.提供Lua虚拟机创建、启动、销毁,Require、DoFile、DoString、Traceback等相关支持。(LuaState.cs、LuaStatic.cs)
(创建Lua虚拟机,并提供相关支持)
3.提供导出工具,利用c#反射,对指定的c#类生成对应的wrap文件,启动后将所有wrap文件注册到lua虚拟机中。(ToLuaMenu.cs、ToLuaExport.cs、ToLuaTree.cs、LuaBinder.cs、CustomSetting.cs等)
(避免直接反射,先注册,通过这个玩意能调用到真正的CLR中)
4.提供c#对象和lua userdata对应关系,使该userdata能访问对应c#对象属性,调用对应c#对象函数。lua支持一定的面向对象(类、继承)。管理这些对象的内存分配与生命周期、GC。(LuaState.cs)
(userdata 是啥没用过啊。。以后再说)
5.提供支持功能Lua Coroutine、反射等,Lua层重写部分性能有问题对象如Vector系列。(Vector3.lua等)
(就是提供某些功能)
启动介绍
LuaState lua = new LuaState();
lua.Start();
这两行代码就能启动lua虚拟机,但是内部做了什么呢??????
LuaState 继承 LuaStatePtr
LuaStatePtr 内部包含一个 System.IntPtr L 的指针,也就是lua虚拟机栈,还对LuaDLL的方法进行了封装
**未完待续。。。
**