精华内容
下载资源
问答
  • XLua

    2019-08-20 16:54:43
    学习Xluaxlua 官网 github 实例都在上面 交互的原理 https://blog.csdn.net/sp958857/article/details/87724256 https://blog.c...

    https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/XLua%E6%95%99%E7%A8%8B.md 

    学习Xlua 去xlua 官网 github 实例都在上面

     

    交互的原理

    https://blog.csdn.net/sp958857/article/details/87724256

    https://blog.csdn.net/qq_14914623/article/details/89513031

    https://blog.csdn.net/UnityHUI/article/details/79752296

    C#调用Lua是依靠C作为中间语言,通过C#调用C,C再调用Lua实现的 而框架中的tolua.dll等也就是借助LuaInterface封装的C语言动态库 

    对于Lua调用C函数,有所区别的是在调用之前需要进行注册,将函数地址告知Lua 。而且使用了一个与C语言调用Lua时相同的栈,C函数从栈中获取函数参数,并将结果压入栈中。为了将栈中的结果数据和其他值进行区分,C函数还要返回其压入栈中的结果数量 ,并且每一个C函数都有自己的局部私有栈,当Lua调用一个C函数时,第一个参数总是这个局部栈的索引1.

    C#与Lua交互原理:

    通过虚拟栈交换数据
      C#与Lua进行交互主要通过虚拟栈实现,栈的索引分为正数与负数,若果索引为正数,则1表示栈底,若果索引为负数,则-1表示栈顶。

    xLua的配置(具体在 XLua/XLua的配置.doc)

    xLua所有的配置都支持三种方式:打标签;静态列表;动态列表。

    打标签

    xLua用白名单来指明生成哪些代码,而白名单通过attribute来配置,比如你想从lua调用c#的某个类,希望生成适配代码,你可以为这个类型打一个LuaCallCSharp标签:

    [LuaCallCSharp]

    public class A

    {

    }

    该方式方便,但在il2cpp下会增加不少的代码量,不建议使用。

    静态列表

    有时我们无法直接给一个类型打标签,比如系统api,没源码的库,或者实例化的泛化类型,这时你可以在一个静态类里声明一个静态字段,该字段的类型除BlackList和AdditionalProperties之外只要实现了IEnumerable<Type>就可以了(这两个例外后面具体会说),然后为这字段加上标签:

    [LuaCallCSharp]

    public static List<Type> mymodule_lua_call_cs_list = new List<Type>()

    {

        typeof(GameObject),

        typeof(Dictionary<string, int>),

    };

    这个字段需要放到一个静态类里头,建议放到Editor目录

    动态列表

    声明一个静态属性,打上相应的标签即可。

    [Hotfix]

        public static List<Type> by_property

        {

            get

            {

                return (from type in Assembly.GetExecutingAssembly().GetTypes()

                        where type.Namespace == "XXXX"

                        select type).ToList();

            }

    }

    Getter是代码,你可以实现很多效果,比如按名字空间配置,按程序集配置等等。

    这个属性需要放到一个静态类里头,建议放到Editor目录

    展开全文
  • XLUA

    2018-12-12 21:32:00
    在Unity3D项目中,逻辑代码热更新这一块,现在有很多实现解决方案,基本都是借助Lua来实现的,在这众多之中,最后还是选择xLua,最早了解xLua是在腾讯的手游项目中,腾讯Apollo通用组件中,只是涉及的项目中,并没有...

    原文 转载请注明保留原文链接:http://www.jianshu.com/p/dc4de5612d9e

    作者:Jumbo

    在Unity3D项目中,逻辑代码热更新这一块,现在有很多实现解决方案,基本都是借助Lua来实现的,在这众多之中,最后还是选择xLua,最早了解xLua是在腾讯的手游项目中,腾讯Apollo通用组件中,只是涉及的项目中,并没有xLua的源码及文档相关的说明。可能当时xLua还在改进当中。直到2017年1月3日,腾讯Github开源项目中,出现xLua的身影。xLua优势:1、集成快 (几乎不用改变原本项目的代码) 2、专职人员负责维护(企鹅还是有这个实力·~~·),说再多也不如自己切身体验一番。下面就帮大家,快速入门下。

    一、xLua源码: https://github.com/Tencent/xLua/ 没有帐号或者下载不了的同学,可以邮箱留言,发一份给大伙;

    二、获取到源码后,首先认真阅读README.md内容,可以更好的帮大家了解xLua,是否项目中遇到的问题,可以通过xLua来帮忙处理?;

    三、根据提供的示例:
    01_Helloworld: 快速入门的例子。
    02_U3DScripting: 展示怎么用lua来写MonoBehaviour。
    03_UIEvent: 展示怎么用lua来写UI逻辑。
    04_LuaObjectOrented: 展示lua面向对象和C#的配合。
    05_NoGc: 展示怎么去避免值类型的GC。
    06_Coroutine: 展示lua协程怎么和Unity协程相配合。
    07_AsyncTest: 展示怎么用lua协程来把异步逻辑同步化。
    08_Hotfix: 热补丁的示例(需要开启热补丁特性,如何开启请看指南)。
    配合文档:
    XLua教程.doc:教程,其配套代码这里
    XLua的配置.doc:介绍如何配置xLua。
    XLua增加删除第三方lua库.doc:如何增删第三方lua扩展库。
    XLua API.doc:API文档。
    可以更好的了解xLua具备那些特性,如何便捷使用。

    四、最重要的功能:热补丁
    xLua支持热补丁,这意味着你可以:
    1、开发只用C#;
    2、运行也是C#,性能可以秒杀lua;
    3、出问题了才用Lua来改掉C#出问题的部位,下次整体更新时换回正确的C#;能做到用户不重启程序fix bug;

    如果你仅仅希望用热更新来fix bug,这是强烈建议的做法。这里是使用指南。
    这个文档说明一定要仔细阅读https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md

    很多刚开始接触的同学,因为没有认真看文档说明,容易出现一些问题,这边列举下:
    注意:a、HOTFIX_ENABLE宏是否在Unity3D的File->Build Setting->Scripting Define Symbols下添加
    b、Mono.Cecil.是否拷贝:OSX命令行 cp /Applications/Unity/Unity.app/Contents/Managed/Mono.Cecil.Project/Assets/XLua/Src/Editor/

    Win命令行 copy UnityPath\Editor\Data\Managed\Mono.Cecil.* Project\Assets\XLua\Src\Editor\

    c、菜单栏中,执行xLua/Generat Code, 会在新建Gen文件夹,下面生成一些wrap文件

     

     
     


    具体生成那些类型对应的wrap文件,需要自己配置,详见:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Examples/ExampleGenConfig.cs
    在项目中集成,最好自己写一份配置,替换ExampleGenConfig,比如取名CustomGenConfig.cs,加入了[Hotfix]标签

     

      //需要热更新的类型
        [Hotfix]
        public static List<Type> by_field = new List<Type>()
        {
    
        };
    

    d、要等打印了hotfix inject finish!后才运行例子,否则会类似xlua.access, no field __Hitfix0_Update的错误

    五、整合xLua进项目
    1、

     

     
     

    2、

     
     

    3、

     
     

    先贴上代码(myHotfix.lua 编写fixbug逻辑):

    using UnityEngine;
    using System.Collections;
    using XLua;
    
    /// <summary>
    /// 先判断更新热补丁文件,然后再执行Fixing
    /// </summary>
    public class xLuaInstance : MonoSingleton<xLuaInstance>{
    
        LuaEnv luaenv;
    
        const string fixFile = "myHotfix.lua";
    
        public string FixFilePath
        {
            get
            {
                return FileUtils.GetFullPath(null, fixFile, FileUtils.StorageType.Persistent);
            }
        }
    
        /// <summary>
        /// 热补丁修复中。。。
        /// </summary>
        public void Fixing()
        {
    
            byte[] bytes = System.IO.File.ReadAllBytes(FixFilePath);
    
            if (bytes != null)
            {
                luaenv = new LuaEnv();
                luaenv.AddLoader((ref string filename) =>
                {
                    if (filename == "myHotfix")
                    {
                        filename = FixFilePath;
                        return bytes;
                    }
    
                    return null;
                });
    
                luaenv.DoString(@"require 'myHotfix'");
            }
        }
    
        void Update()
        {
            if (luaenv != null)
                luaenv.Tick();
        }
    
        void OnDestroy()
        {
            if (luaenv != null)
                luaenv.Dispose();
        }
    }
    

    4、大致流程
    i、游戏一开始启动时,检查远程服务器上是否有新的myHotfix.lua文件(例如:md5比对,自己加解密),有的话,下载下来,放在指定目录,没有的话,读取本地已有的myHotfix.lua文件,若文件不存在,则说明不需要热修复,一般这种情况是在项目刚发布的早起,没有进行打补丁;

    ii、项目发布版本前,需要在CustomGenConfig.cs中 加入需要添加[Hotfix]标签的类型,想要更灵活使用的话,可以自己写个配置表,读取配置中的类型,自动添加,***只有加入[Hotfix]标签的类型,才可以调用xlua.hotfix()

     

     
     

     

    ,不然会报错,切记!!!

    iii、如果你的项目是自动化发布版本,需要在调用打包之前,生成wrap, 调用这个CSObjectWrapEditor.Generator.GenAll();

    MonoSingleton.cs

    //非线程安全
    using UnityEngine;
    
        /// <summary>
        ///     基类继承树中有MonoBehavrour类的单件实现,这种单件实现有利于减少对场景树的查询操作
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class MonoSingleton<T> : MonoBehaviour where T : Component
        {
            // 单件子类实例
            private static T _instance;
    
            // 在单件中,每个物件的destroyed标志设计上应该分割在不同的存储个空间中,因此,忽略R#的这个提示
            // ReSharper disable once StaticFieldInGenericType
            private static bool _destroyed;
    
            /// <summary>
            ///     获得单件实例,查询场景中是否有该种类型,如果有存储静态变量,如果没有,构建一个带有这个component的gameobject
            ///     这种单件实例的GameObject直接挂接在bootroot节点下,在场景中的生命周期和游戏生命周期相同,创建这个单件实例的模块
            ///     必须通过DestroyInstance自行管理单件的生命周期
            /// </summary>
            /// <returns>返回单件实例</returns>
            public static T Instance
            {
                get{
    
                     if (_instance == null && !_destroyed)
                     {
                         _instance = (T) FindObjectOfType(typeof (T));
                         if (_instance == null)
                        {
                           GameObject go = new GameObject(typeof (T).Name);
                           _instance =  go.AddComponent<T>();
    
                            DontDestroyOnLoad(_instance);
    
                           var singletonRootGo = GameObject.Find("MonoSingletonRoot");
                           if (singletonRootGo != null)
                           {
                               go.transform.parent = singletonRootGo.transform;
                             }
                        }
                     }
                    return _instance;
                }
               
             }
    
            /// <summary>
            ///     删除单件实例,这种继承关系的单件生命周期应该由模块显示管理
            /// </summary>
            public static void DestroyInstance()
            {
                if (_instance != null)
                    Destroy(_instance.gameObject);
    
                _destroyed = true;
                _instance = null;
            }
    
            /// <summary>
            ///     Awake消息,确保单件实例的唯一性
            /// </summary>
            protected virtual void Awake()
            {
                if (_instance != null && _instance.gameObject != gameObject) Destroy(gameObject);
                else if(_instance == null)
                    _instance = GetComponent<T>();
    
                DontDestroyOnLoad(_instance);
            }
    
            /// <summary>
            ///     OnDestroy消息,确保单件的静态实例会随着GameObject销毁
            /// </summary>
            protected virtual void OnDestroy()
            {
                if (_instance != null && _instance.gameObject == gameObject)
                {
                    _instance = null;                
                }
            }
    
            /// <summary>
            ///     Have Instance
            /// </summary>
            /// <returns></returns>
            public static bool HaveInstance()
            {
                return _instance != null;
            }
        }
    

    如何调试Lua脚步,接下来,我会写一篇关于ZeroBrane这个工具。

    在此感谢xLua作者:车雄生 chexiongsheng!!!
    期待大家的支持!!!
    祝大家在17年万事如意,身体健康!!!



    作者:JumboWu
    链接:https://www.jianshu.com/p/dc4de5612d9e
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    转载于:https://www.cnblogs.com/hpu001/p/10111168.html

    展开全文
  • Xlua

    2020-06-10 00:21:27
    Xlua学习-LuaCallCsharpnew C#对象访问C#静态属性,方法访问C#成员属性,方法父类属性,方法参数的输入输出属性(out,ref) new C#对象 在lua中是没有new关键字的,所以在lua中这样创建 local newGameObj = CS....

    new C#对象

    在lua中是没有new关键字的,所以在lua中这样创建
    local newGameObj = CS.UnityEngine.GameObject;
    local obj = newGameObj();–上面是获取到类,这一步相当于new 一个对象
    print(obj);–我们就能用这个对象来调用GameObject中的方法了
    这里不管构造函数是有参还是无参的都和C#里基本一致,只是没有new关键字。

    访问C#静态属性,方法

    在lua中访问C#的静态属性和方法和C#里是一致的,直接CS.命名空间.类名.属性/方法名,例如:
    CS.UnityEngine.Time.deltaTime
    CS.UnityEngine.GameObject.Find(‘helloworld’)

    访问C#成员属性,方法

    这里和C#的也基本一致,对象.方法()/属性,只是在调用方法上我们可以用到lua的冒号语法糖,例如:对象:方法();推荐使用这种方法,当然你也可以这样调用,对象.方法(对象);//具体两者的差异和性能上的优劣,可以具体理解下lua

    父类属性,方法

    xlua支持(通过派生类)访问基类的静态属性,静态方法,(通过派生类实例)访问基类的成员属性,成员方法

    参数的输入输出属性(out,ref)

    Lua调用测的参数处理规则:C#的普通参数算一个输入形参,ref修饰的算一个输入形参,out不算,然后从左往右对应lua 调用测的实参列表;
    Lua调用测的返回值处理规则:C#函数的返回值(如果有的话)算一个返回值,out算一个返回值,ref算一个返回值,然后从左往右对应lua的多返回值。例如

    namespace XLuaTest
    {
        public struct Param1
        {
            public int x;
            public string y;
        }
       public class DerivedClass
       {
            public double ComplexFunc(Param1 p1, ref int p2, out string p3, Action luafunc, out Action csfunc)
            {
                Debug.Log("P1 = {x=" + p1.x + ",y=" + p1.y + "},p2 = " + p2);
                luafunc();
                p2 = p2 * p1.x;
                p3 = "hello " + p1.y;
                csfunc = () =>
                {
                    Debug.Log("csharp callback invoked!");
                };
                return 1.23;
            }
        }
      }
        //在lua中可以这样调用
        local derivedClass= CS.XLuaTest.DerivedClass();
        local a,b,c,d = derivedClass:ComplexFunc({x=10,y="你好"},10,function()--a = ComplexFunc里return的值,bcd分别等于p2,p3,csfunc的值
         	print("CallFromLua");
        end)
    
    展开全文
  • xLua

    2017-05-27 19:33:00
    http://www.2cto.com/kf/201701/591817.html 转载于:https://www.cnblogs.com/lilei9110/p/6914242.html

    http://www.2cto.com/kf/201701/591817.html

     

    转载于:https://www.cnblogs.com/lilei9110/p/6914242.html

    展开全文
  • xlua framework

    2019-01-25 22:48:43
    xlua framework及文档介绍,包括excel转xlua工具,转pb工具,pb解析,网络请求,xlua UI框架等完整的游戏框架
  • [Unity XLua]热更新XLua入门(一)-基础篇

    万次阅读 多人点赞 2017-01-14 12:26:03
    Aladdin_XLua前言前段时间腾讯开源了一个内部热更框架XLua在Unity开发群里引起一阵热议,也受到广大开发者的热捧,然后我当然也抱着好奇的心去学习学习。后面也会将扩展之后的工程放在git上,大家一起学习交流!在此...
  • xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。 xLua的突破 xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是: 可以运行时把C#实现...
  • xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。 xLua的突破 xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是: 可以运行时把C#实现...
  • XLua笔记

    2020-07-25 21:52:15
    XLua笔记 目录XLua笔记下载框架使用方法C#调用LuaLuaEnv.DoString()执行Lua语句通过框架内置的loader加载Lua源文件C#访问Lua全局变量Lua调用C#在Lua中创建新物体Lua访问C#静态属性和方法 xLua是Unity3D下Lua编程...
  • xLua 简介

    千次阅读 2017-09-09 08:21:38
    xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。 Unity3D 下Lua编程支持 xLua为Unity3D增加Lua脚本能力,进而提供代码逻辑增量更新的可能,当然不仅仅...
  • XLua官方教程

    2018-06-08 15:21:20
    xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。
  • XLuaXLua项目中的配置

    千次阅读 2018-09-10 14:51:16
    1、将Xlua Assets中的内容copy到目标项目的Assets内 2、将XLua内的Tools复制到项目Assets外 3、打开项目,在项目的Build Settings——Other Settings——Scripting Define Symbols填入:HOTFIX_ENABLE 4、将本地...
  • xlua协程

    2020-11-24 20:36:38
    我们要在lua中使用协程:首先引用xlua自带的的util文件 local util = require 'xlua.util' local UnityWebRequest=CS.UnityEngine.Networking.UnityWebRequest 实现及调用: function TestCoroutine() return ...
  • xlua-master

    2018-11-04 16:39:12
    xlua的插件,把Assets里面的东西全部复制到工程的Assets下
  • xLua框架源码

    2018-09-16 15:52:05
    xLua源码,使用方法 将Assets文件夹导入工程测试 详细请看文件中ReadMe.md
  • XLua心得

    万次阅读 2018-04-19 09:49:58
    xlua简介 xlua是由腾讯维护的一个开源项目,除了常规的Lua绑定之外,还有一个比较有特色的功能就是代码热补丁。非常适合前期没有规划使用Lua进行逻辑开发,后期又需要在iOS这种平台获得代码热更新能力的项目。 刚...
  • 整理一下xlua的原理,之前一直在lua来做热更新,觉得始终是一个API的搬运工,没有深入的了解过基础的原理。准备今天深入代码层面研究一下,而不是停留在怎么用,而是深入研究为什么会这样。首先,先介绍一下xlua吧,...
  • untiy 学习讨论群184386599 ...3:选择 xlua-》Assets 下的plugins +xlua 文件 放到Unity工程Assets下 直接代码了:里面有全部的注释和遇到的一些问题,有些问题也还不知道原因,可能是版本不兼容先记录一下 u...
  • Xlua 入门实践

    2017-01-15 20:48:08
    xLua是Unity3D下Lua编程解决方案,自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性能、易用性、扩展性而广受好评。现在 腾讯已经将xLua开源到GitHub。
  • XLua学习

    2019-04-09 11:06:51
    所有的lua代码都是在lua...XLua.LuaEnv luaenv = new XLua.LuaEnv(); 一、lua文件的执行和加载 LoadString:加载一个代码块,但不执行,返回类型可以指定为一个delegate或者一个LuaFunction T LoadString(stri...
  • XLua热更新测试

    2019-03-03 13:49:29
    Xlua热更新测试!!
  • 配置XLUA

    2019-03-10 20:52:49
    在GitHub上下载完Xlua,地址:https://github.com/Tencent/xlua 1.将下载文件解压后,Asset目录下的 copy到你的工程目录Asset里面。 2.配置宏,打开Unity里的File--&gt;BuildSetting--&gt;Player...
  • xlua编译

    2020-04-06 15:05:13
    一.Windows64平台: ...运行make_win64_lua53.bat前需要先修改如下,生成xlua.dll位于目录build\build64\Release和目录build\plugin_lua53\Plugins\x86_64。 @echo off call "C:\Program Files (x86)\Microso...
  • xLua基础

    2018-05-19 11:52:56
    热更新的好处:不用浪费流量重新下载,不用通过商店审核更加快速,不用重新安装玩家可以更快体验到更新的内容目前比较受欢迎的热更新方案:uLua tolua xLua2.主菜:“xLuaxLua为Unity、 .Net、 Mono等C#环境...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,954
精华内容 781
关键字:

xlua