• Unity的学习笔记(XLua的初学用法并在lua中使用unity周期函数)


    自己最近也在研究怎么用lua控制UI,然后看着网上介绍,决定选用XLua,毕竟TX爸爸出的,有人维护,自己琢磨着怎么用,于是弄出来一个能用的作为记录。

    当然,XLua主要是用于热更新,我自己是拿来尝试用一下看看怎么和C#交互进行的。

    然后是XLua的下载地址:https://github.com/Tencent/xLua

    下载完了之后,把Assect文件夹下的东西放在工程里面,引入命名空间XLua就可以使用了。

    using System.IO;  //引入这个空间是为了输入路径用
    using UnityEngine;
    using XLua;   //首先引入Xlua的命名空间
    
    public class CSToLua : MonoBehaviour {
    
        // Use this for initialization
        void Start () {
            LuaEnv lua = new LuaEnv();           //首先必须要做这一步,类似new一个类的用法,只是这个换成了Lua
            lua.AddLoader(CustomLoader);         //这个是将一个自定义载入的路径给Lua,这样就能在这个自定义路径进行查找
            lua.DoString("require 'MainLua'");   //这是载入一个名字为MainLua的lua脚本
        }
        
        // Update is called once per frame
        void Update () {
            
        }
    
        private byte[] CustomLoader(ref string filepath)      //这个是在网上查的,可以记下来作为一个API来使用,这个函数返回一个自定义路径
        {
            //重定向  可以在AB包里去读取 也可以指定 本地的一个路径
            string str = Application.dataPath + "/Lua/" + filepath + ".lua";
            Debug.Log(str);
            if( File.Exists(str))
                return File.ReadAllBytes(str);
            return null;
        }
    }

    这样执行了之后,那么Luau中又是怎么执行的呢?而且unity中,又update这样的生命周期函数,这些函数应该怎么用呢?接下来实现一下

    首先,我们要在Unity中,建立一个委托,用来让Update来不停执行它

    using UnityEngine;
    
    public delegate void LuaUpdate();
    
    public class LuaBehaviour : MonoBehaviour {
    
        public LuaUpdate luaUpdate;
    
        void Start () {
        }
    
        // 将LuaUpdate委托放在Update周期函数里面一直执行
        void Update () {          
            if (luaUpdate != null)
                luaUpdate();    
    
        }
    }

    之后我们就是要用lua去找到这个挂载的代码,然后在lua中将需要反复执行的函数加入到LuaUpdate委托里面

    --我把Lua挂载到ToLuaVoid这个物体上面的,所以先查找这个gameobject,用unity的时候,需要CS.(API所在的命名空间).Api
    --至于什么时候用 ".",什么时候用":",我查过关系到是否传入self,不过自己还没理解,都是错了后改,改着改着知道这里用什么符号。。(大家查下其他资料吧)
    luaBehaviour = CS.UnityEngine.GameObject.Find("ToLuaVoid"):GetComponent(typeof(CS.LuaBehaviour))  -- 这里获取组件,要用typeof(类型),因为lua中没有c# <T>这种泛型用法
    local timeCount = 0
    
    local function UpdataLua()
        timeCount = timeCount + CS.UnityEngine.Time.deltaTime
        print(timeCount)
    end
    
    luaBehaviour.luaUpdate = UpdataLua   -- 将Lua中的函数加入到这个委托里面(第一次只能用 = ,不能 +=,因为会报空,但是在C#中,第一次使用就可以+=
  • 相关阅读:
    详解Twitter开源分布式自增ID算法snowflake(附演算验证过程)
    分布式自增ID算法-Snowflake详解
    关于分布式唯一ID,snowflake的一些思考及改进(完美解决时钟回拨问题)
    分布式ID增强篇--优化时钟回拨问题
    专题:性能调优之工具---perf
    Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,消息队列有什么优点和缺点
    Zookeeper框架Curator使用
    Zookeeper 3.5启动时 8080端口被占用
    Qt状态机框架(状态机就开始异步的运行了,也就是说,它成为了我们应用程序事件循环的一部分了)
    Qt插件开发入门(两种方法:High-Level API接口,Low-Level API接口)
  • 原文地址:https://www.cnblogs.com/takanashi/p/11068995.html
Copyright © 2020-2023  润新知