神临的uLua学习(一)

来源:互联网 发布:ff14暗战捏脸数据 编辑:程序博客网 时间:2024/05/16 18:50

这里我要将一些简单的uLua学习内容纪录并分享一下.
1.HelloWorld(就像一开始学习编程语言一样,先写一个HelloWorld吧)

void Start () {        LuaState l = new LuaState();//建立一个新的Lua状态        string str = "print('hello world 世界')";//建立string        l.DoString(str);//状态机执行    }

2.CreateGameObject_1(这里记录了游戏对象在uLua的创建方式.这是第一个方式)

 private string script = @"luanet.load_assembly('UnityEngine')--调用unity引擎            GameObject =        luanet.import_type('UnityEngine.GameObject')--调用unity中的GameObject对象                    ParticleSystem = luanet.import_type('UnityEngine.ParticleSystem')--调用粒子系统                     local newGameObj = GameObject('NewObj')newGameObj:AddComponent(luanet.ctype(ParticleSystem))--新建对象并添加组件        ";    //反射调用    void Start () {        LuaState lua = new LuaState();        lua.DoString(script);//略    }

3.CreateGameObject_2(这里记录了游戏对象在uLua的创建方式.这是第二个方式)

  private string script = @"            luanet.load_assembly('UnityEngine')            GameObject = UnityEngine.GameObject            ParticleSystem = UnityEngine.ParticleSystem            local newGameObj = GameObject('NewObj')            newGameObj:AddComponent(ParticleSystem.GetClassType())        ";    //非反射调用    void Start () {        LuaScriptMgr lua = new LuaScriptMgr();        lua.Start();        lua.DoString(script);    }

这里再解释一下反射调用和非反射调用:
反射调用方式是不推荐使用的,因为效率慢,推荐的是使用wrap(可以从Lua的组件中找到,这里不做介绍)的去反射模式,这里还继续保留下来的原因在于,在某些特定环境下,反射还是有用途的,去反射最大的弊端在于提前需要把C#的类导入到Lua中,如果上线了发现有些类没有导入,反射就可以通过临时的调用未wrap的类,进行使用,当大版本更新时,再将此类加入wrap,这时候反射就是解决这种情况出现,所以概率小,1%的可能性,但并不代表不存在。

4.LuaVariables_1(这里是Lua变量的使用方式1)

private string script = @"            luanet.load_assembly('UnityEngine')            GameObject = luanet.import_type('UnityEngine.GameObject')            ParticleSystem = luanet.import_type('UnityEngine.ParticleSystem')--略            particles = {}for i = 1, Objs2Spawn, 1 do  --for循环开始                local newGameObj = GameObject('NewObj' .. tostring(i))                local ps = newGameObj:AddComponent(luanet.ctype(ParticleSystem))                --local ps = newGameObj:AddComponent('ParticleSystem') PS:Unity5.x已经废弃这种方式,Unity4.x可用--                ps:Stop()                table.insert(particles, ps)            end  --循环结束            var2read = 42        ";void Start () {        LuaState l = new LuaState();        l["Objs2Spawn"] = 5;//对Objs2Spawn的key添加value        l.DoString(script);//执行        print("Read from lua: " + l["var2read"].ToString());        LuaTable particles = (LuaTable)l["particles"];        foreach( ParticleSystem ps in particles.Values )        {            ps.Play();        }    }

说明一下这里的”- -“在Lua里是注释的意思

5.LuaVariables_2(这里是Lua变量的使用方式2)

 //对于cstolua的使用要求必须要先定义变量才能使用    private string var = @"Objs2Spawn = 0";    private string script = @"                  ParticleSystem = UnityEngine.ParticleSystem            particles = {}            for i = 1, Objs2Spawn, 1 do                local newGameObj = GameObject('NewObj' .. tostring(i))                local ps = newGameObj:AddComponent(ParticleSystem.GetClassType())                ps:Stop()                table.insert(particles, ps)--lua从尾部嵌入            end            var2read = 42        ";    // Use this for initialization    void Start () {                LuaScriptMgr mgr = new LuaScriptMgr();//建立管理器        mgr.Start();//运行        LuaState l = mgr.lua;//状态        l.DoString(var);        l["Objs2Spawn"] = 5;        l.DoString(script);//略        print("Read from lua: " + l["var2read"].ToString());        LuaTable particles = (LuaTable)l["particles"];        foreach( ParticleSystem ps in particles.Values )        {            ps.Play();        }    }

6.ScriptsFromFile_01(这里是从文件中调用的方法)

public TextAsset scriptFile;//从外部挂载Lua脚本void Start()    {        LuaState l = new LuaState();        l.DoString(scriptFile.text);    }

7.ScriptsFromFile_02(从内部加载的方法)

void Start()    {        //只是展示如何加载文件,不推荐这么做        LuaState l = new LuaState();        string path = Application.dataPath + "/uLua/Examples/04_ScriptsFromFile/ScriptsFromFile02.lua";                l.DoFile(path);    }

8.CallLuaFunction_01(使用运行函数)

private string script = @"            function luaFunc(message)                print(message)                return 42            end        ";void Start () {        LuaState l = new LuaState();        l.DoString(script);        LuaFunction f = l.GetFunction("luaFunc");        object[] r = f.Call("I called a lua function!");        print(r[0]);//这里不多解释,认真看就行    }

如果觉得看着费劲可以去到这里http://www.runoob.com/lua/lua-tutorial.html学习一下Lua基础

9.CallLuaFunction_02(第二种方式)

private string script = @"            function luaFunc(num)                                return num            end        ";    LuaFunction func = null;void Start () {        LuaScriptMgr mgr = new LuaScriptMgr();        mgr.DoString(script);        func = mgr.GetLuaFunction("luaFunc");        object[] r = func.Call(123456);                print(r[0]);        int num = CallFunc();        print(num);    }    void OnDestroy()    {        if (func != null)        {            func.Release();        }    }    int CallFunc()    {        int top = func.BeginPCall();        IntPtr L = func.GetLuaState();        LuaScriptMgr.Push(L, 123456);        func.PCall(top, 1);        int num = (int)LuaScriptMgr.GetNumber(L, -1);        func.EndPCall(top);        return num;    }//这里代码就较多了,不过并不难,然真看就行