一.uLua 文件夹结构

①Core:uLua 核心; ②Docs:uLua 文档,其实就是LuaInterface 的PDF 使用文档; ③Editor:uLua 编辑器扩展; [备注:项目内所有的Editor 文件夹都是编辑器扩展文件夹,并不局限于根目录] ④Examples:uLua 自带演示案例; ⑤Source:cstolua 核心目录 [

](http://www.wjgbaby.com/wp-content/uploads/2017/11/17112201-227x300.png)
](http://www.wjgbaby.com/wp-content/uploads/2017/11/17112201-227x300.png)

二.uLua 环境下的代码交互

1.基础介绍 在前面我们演示过在VS2013 环境下使用LuaInterface 项目中的两个DLL 文件来实现C#与Lua 的交互。 而在uLua 环境下本质也是通过LuaInterface 来实现Lua 与C#语言交互的。 但是uLua 对LuaInterface 进行了二次的封装,所以在代码书写上和原生的会稍有不同。 2.C#代码中执行Lua 代码 LuaState lua = new LuaState(); lua.DoString(); 说明: <1>同样需要在C#代码中引入LuaInterface; <2>原生的Lua 解析器对象“Lua”被二次封装成了“LuaState”; <3>LuaState 类存在的位置是:uLua\Core\Lua.cs。 3.Lua 代码中操作Unity 内的类[反射方式/ 原生方式] 创建一个游戏物体,名字叫wjg,有Box Colider :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LuaInterface;

public class LuaAndUnityTest : MonoBehaviour{
private string str = @”
luanet.load_assembly(‘UnityEngine’)
GameObject = luanet.import_type(‘UnityEngine.GameObject’)
BoxCollider = luanet.import_type(‘UnityEngine.BoxCollider’)
local player = GameObject(‘wjg’)
player:AddComponent(luanet.ctype(BoxCollider))
“;

// Use this for initialization
void Start () {
    //创建Lua解析器对象
    LuaState luaState = new LuaState();
    luaState.DoString(str);    
}

}

效果如图: 说明: <1>这种方式就是我们之前在VS 环境下演示的方式; <2>luanet 已经被封装到了LuaInterface 命名空间内,所以我们可以在Lua代码中直接使用luanet 这个对象; <3>在Lua 环境内操作C#中的类创建对象,不要写new 关键字!!! <4>在Lua 环境内操作C#中的类创建对象,访问对象中的方法使用分号(:); <5>这种“反射方式”在项目开发中并不常用,但是也有用无之地,真正大量使用的是下方的Wrap 方式。 4.包装新的Wrap 脚本 当我们用Lua 的Wrap 方式访问Unity 中的组件脚本,或者自己写的脚本的使 用,如果这些脚本没有自动生成“xxxxWrap”,项目运行后,就会报错。 遇到这种情况,我们就需要往框架的Wrap 生成器中添加我们要处理的新的类。 步骤如下: ①找到uLua\Editor\WrapFile.cs 打开该脚本, 使用该格式进行添加:_GT(typeof(类名)) ; ②Lua–>Clear LuaBinder File + Wrap File 清空原有的Wrap 文件; ③Lua–>Gen Lua Wrap Files 重新生成Wrap 文件; 这样就能看的新增的Wrap 脚本文件了。 演示:比如下面的Animator 脚本,如何生成Wrap 格式的文件 首先按③生成Wrap文件,在uLua\Source\LuaWrap可以看到没有Animator 的Wrap文件 添加_GT(typeof(Animator)) 清空原有Wrap文件,重新生成 5.Lua 代码中操作Unity 内的类[Wrap 方式] LuaScriptMgr lua = new LuaScriptMgr(); lua.Start(); 说明: <1>这种是在uLua 开发过程中最常用的方式,95%+情况都是使用这种方式; <2>Wrap 方式实现Lua 调用C#,依赖的是之前生成的LuaWrap 文件; [也就是我们通过菜单自动生成到uLua\Source\LuaWrap 下的脚本文件] <3>当使用Wrap 方式时,运行Lua 代码需要使用LuaScriptMgr; <4>需要把AppConst.cs 脚本中的的DebugMode 修改为true。 创建一个游戏物体,名字叫WJG,有Box Colider ,Animator:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LuaInterface;

public class LuaAndUnityTest : MonoBehaviour{
private string str = @”
luanet.load_assembly(‘UnityEngine’)
GameObject = luanet.import_type(‘UnityEngine.GameObject’)
BoxCollider = luanet.import_type(‘UnityEngine.BoxCollider’)
local player = GameObject(‘wjg’)
player:AddComponent(luanet.ctype(BoxCollider))
“;

private string str02 = @"
    luanet.load\_assembly('UnityEngine')
    GameObject = UnityEngine.GameObject
    BoxCollider = UnityEngine.BoxCollider
    Animator = UnityEngine.Animator
    local player = GameObject('WJG')
    player:AddComponent(BoxCollider.GetClassType())
    player:AddComponent(Animator.GetClassType())
";

// Use this for initialization
void Start (){
    /\*
    //创建Lua解析器对象
    LuaState luaState = new LuaState();
    luaState.DoString(str);    
    \*/

    LuaScriptMgr luaScriptMgr = new LuaScriptMgr();
    luaScriptMgr.Start();
    luaScriptMgr.DoString(str02);
}

}

效果如图:[

](http://www.wjgbaby.com/wp-content/uploads/2017/11/17112206-300x221.jpg)
](http://www.wjgbaby.com/wp-content/uploads/2017/11/17112206-300x221.jpg)