<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[随风吹笛]]></title><description><![CDATA[只要有自然，人就没有自暴自弃的理由——林清玄]]></description><link>https://blog.youkuaiyun.com/suifcd</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; suifcd]]></copyright><item><title><![CDATA[XLua框架搭建——玩转xLua的热补丁]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/80572325</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/80572325</guid><author>suifcd</author><pubDate>Mon, 04 Jun 2018 20:11:27 +0800</pubDate><description><![CDATA[关于热补丁这块，转载一篇xlua作者的文章，文章原链接玩转xLua的热补丁 
xlua框架这块算是告一段落，如果有这方面的交流可以加QQ群：517539056

xLua热补丁特性上线一年多，已经得到广泛的应用，其中不乏一些千万级DAU、亿级用户量的大游戏，反馈良好。然而同时也有些初接触的童鞋会有不少误区，这篇主要谈谈这些误区。误区规避了，自然容易玩转。

误区1：我哪里预测得到哪些地方有bug，...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——xLua常用库集成]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/80411973</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/80411973</guid><author>suifcd</author><pubDate>Tue, 29 May 2018 20:03:17 +0800</pubDate><description><![CDATA[官方文档里提供了一个集成第三方库的教程，对于日常开发，其实我们经常需要引入一些第三方库，如何加入到项目里，就需要参考这个文档了。

一般来说，游戏开发需要用到的库就那么几个，对此，作者为我们集成了几个第三方库，这个集成独立于xlua，具体的见地址https://github.com/chexiongsheng/build_xlua_with_libs，作者集成了lua-protobuf（以前是pb...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——lua性能分析]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/80397376</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/80397376</guid><author>suifcd</author><pubDate>Mon, 21 May 2018 20:32:34 +0800</pubDate><description><![CDATA[xlua代码里提供了一个性能分析的文档，里面提供了两个工具，一个是《函数调用时长分析工具》，一个是《内存泄漏定位工具》。

关于这两个工具建议自己扩展，尤其是内存工具这块，扩展后可以做两个快照的比对，快速定位到哪个函数出现了问题。

首先说下第一个工具，第一个工具用来分析时长，官方说明如下


  api很简单，就三个，start和stop都是无参数，也很好理解，分别是统计开始以及结束。在star...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——LuaFunction分部类扩展]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/80328890</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/80328890</guid><author>suifcd</author><pubDate>Tue, 15 May 2018 20:32:52 +0800</pubDate><description><![CDATA[Lua中函数在c#中的映射是LuaFunction，对函数的调用一般是用call来调用，但是官方认为这个效率上存在一定的GC，所以提供了Action和Func，其中Action是调用，没有返回值，而Func是有返回值的。

在实际使用时发现少了一个函数，就是我调用的是无参函数，但是希望能拿到返回值，官方的代码里并没有相关函数，但是阅读代码可以发现，这是一个分部类，官方也鼓励我们自己扩建相关函数，看...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——XLua API与try to dispose a LuaEnv with C# callback]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/80259494</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/80259494</guid><author>suifcd</author><pubDate>Thu, 10 May 2018 20:05:55 +0800</pubDate><description><![CDATA[在lua的设计中，有些是c语言与lua相互调用的方法，作为使用c#的unity，xlua也是用c#来进行编写，所以我们现在要使用c#代码来做这些事，xlua提供了相对应的方法，这些方法在LuaAPI类里。



LuaAPI.lua_gettop();
LuaAPI.xlua_getglobal();
LuaAPI.xlua_pgettable();
LuaAPI.lua_pushvalue();...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——lua端改造c#现有类]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/80186494</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/80186494</guid><author>suifcd</author><pubDate>Mon, 07 May 2018 20:00:29 +0800</pubDate><description><![CDATA[在Lua端使用unity的一些类时会有一些比较大的性能消耗，比如我们常用的位置赋值操作



transform.position = CS.UnityEngine.Vector3(0,1,0);

如果进行性能测试会发现在性能消耗上需要十多毫秒，关于如何进行性能测试，可以参考官方文档《XLua性能分析工具》，后面也会有相关的文章。对于这个性能消耗，一个这么简单的操作，而且类似这样的赋值语句是一个...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——lua协程实现]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/80171742</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/80171742</guid><author>suifcd</author><pubDate>Wed, 02 May 2018 20:43:59 +0800</pubDate><description><![CDATA[协程在unity中是一个很常用的方法，我们可以利用协程使代码看起来更连贯，易于理解。xlua在示例6中提供了一个协程的示例。



local util = require 'xlua.util'

local gameobject = CS.UnityEngine.GameObject('Coroutine_Runner')
CS.UnityEngine.Object.DontDestroyOn...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——print支持文件名和行号及日志双击重定向]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/80085184</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/80085184</guid><author>suifcd</author><pubDate>Wed, 25 Apr 2018 20:28:30 +0800</pubDate><description><![CDATA[xlua的代码里在使用的日志打印的时候会用print来进行，但是print仅仅是打印输入的数据，而没有对应的文件名信息和行号，如果文件比较多，日志也比较多的话，就会觉得很麻烦。

lua提供了调试类debug，可以获取堆栈等信息，我们可以利用这个类来进行文件名和行号的获取，然后将文件名和行号一起传过去进行打印。设定一定的规范，然后利用前面的文章所讲的日志重定向，在控制台双击日志的时候进行自动打开文...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——Lua定时器的实现]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/80055376</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/80055376</guid><author>suifcd</author><pubDate>Mon, 23 Apr 2018 20:00:39 +0800</pubDate><description><![CDATA[前面介绍了lua中update的实现，利用update，我们可以实现lua的定时器类。 
与c#定时器原理一样，我们需要提供注册函数与反注册函数，然后利用update注册对应的update循环，在update循环里获取当前事件，然后遍历当前的注册列表，比较当前时间和定时器的注册时间，如果到了指定时间，就进行函数调用，同样，函数注册时需要传递自身self。 
注册函数类似如下



function...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——Unity的Update循环]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/79996405</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/79996405</guid><author>suifcd</author><pubDate>Wed, 18 Apr 2018 20:37:16 +0800</pubDate><description><![CDATA[unity的生命周期中有一个Update函数，是游戏的循环，类似的还有FixedUpdate和LateUpdate等，在c#中继承monobehaviour后unity就会调用对应的函数，根据我们前面的设计《XLua框架搭建——LuaBehaviour设计》，我们也可以获取对应的update函数，然后进行调用，但是在lua中是mgr类的非生命周期下的类呢？

无论是c#还是lua都会有这个问题，对...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——lua 消息分发]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/79980526</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/79980526</guid><author>suifcd</author><pubDate>Tue, 17 Apr 2018 20:45:11 +0800</pubDate><description><![CDATA[消息分发对于模块解耦是一个很好的方案，前面的博客中介绍过如何在c#中写一个消息分发，以及消息分发的原理，有需要的可以去看原来的文章游戏脚本事件分发，同时在前面的lua后期接入笔记里也说过利用c#的消息分发来实现lua端的消息分发，见文章项目后期Lua接入笔记06–按钮事件监听及消息分发，但这是后期的时候，lua的使用不多，性能上的考虑也比较少，问题不是很大，现在搭建框架，需要大量使用lua，那么l...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——lua oop类设计]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/79980030</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/79980030</guid><author>suifcd</author><pubDate>Tue, 17 Apr 2018 20:13:12 +0800</pubDate><description><![CDATA[面向对象编程是目前比较主流的做法，在lua中并没有类的概念，只有table，通过table的特性，我们可以自己构造一个类。

关于这方面的资料比较多，就不在说明，不清楚的可以直接百度，这里提供一个云风大神的连接 
在 Lua 中实现面向对象

下面提供一个类的实现，仅供参考，不知道哪里来的了



function class(classname, super)
    local superTy...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——LuaBehaviour设计]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/79933257</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/79933257</guid><author>suifcd</author><pubDate>Fri, 13 Apr 2018 18:59:16 +0800</pubDate><description><![CDATA[由于Unity的生命周期问题，一般来说在Lua端都要实现相同的生命周期调用，以便和unity进行衔接。

在官方第二个示例中，有个LuaBehaviour的脚本，演示了如何在lua中实现unity的生命周期，原理就是获取相关函数，然后在c#中被调用时调用对应的lua函数即可。

一开始使用c#代码创建一个LuaTable，并设置__index指向全局。



 LuaTable meta = lu...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——类型导出与黑名单]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/79902152</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/79902152</guid><author>suifcd</author><pubDate>Wed, 11 Apr 2018 20:08:30 +0800</pubDate><description><![CDATA[经过前面的配置，应该可以正常跑Lua代码了，但是要想在lua中调用C#的代码，一般要生成相应的wrap文件，xlua通过打标签的方式来进行实现。

官方建议不要在类里面打标签，而是统一到一个文件里，提供了示例代码ExampleGenConfig.cs，统一写在一个文件里，如果要配置同一个命名空间下的所有类进行导出，比如UGUI类，可以通过如下代码直接遍历取得



[LuaCallCSharp]
...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——lua文件加载，签名及加密]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/79856878</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/79856878</guid><author>suifcd</author><pubDate>Sun, 08 Apr 2018 19:57:54 +0800</pubDate><description><![CDATA[XLua教程里面的第一步就是教大家如何去加载一个lua文件，官方推荐的做法是整个程序就一个DoString(“require ‘main’”)，然后在main.lua加载其它脚本（类似lua脚本的命令行执行：lua main.lua）。

对于实际项目，一般都是使用assetBundle来作为lua文件的载体，这个方式使用的是自定义Loader方式，利用自定义Loader，可以实现代码签名以及加密...]]></description><category></category></item><item><title><![CDATA[XLua框架搭建——编辑器选择]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/79747653</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/79747653</guid><author>suifcd</author><pubDate>Thu, 29 Mar 2018 19:28:11 +0800</pubDate><description><![CDATA[xlua开源代码地址：https://github.com/Tencent/xLua

新项目准备使用xlua来进行游戏开发，我进行这方面的技术研究及框架搭建。项目选择这套主要是因为对c#的热修复功能，xlua作为一套lua框架，其他lua框架能实现的功能理论上xlua都是能实现的。对于我们项目来说，规划是lua用来编写UI相关的业务逻辑，核心战斗这块还是使用c#来编写，如果到时候出了bug，也可...]]></description><category></category></item><item><title><![CDATA[unity报错Assertion failed on expression]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/79702905</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/79702905</guid><author>suifcd</author><pubDate>Mon, 26 Mar 2018 19:44:15 +0800</pubDate><description><![CDATA[写编辑器时有时候会遇到类似于这样的报错，比如前面介绍的日志重定向，双击的时候就会出现这个错误。



这个问题要解决先要定位到具体的代码，然后将这行代码延时执行，延时的时间是到编辑器GUI更新完后，unity中有对应的回调，把代码放到回调中执行即可。比如日志重定向对应的修改到如下：

EditorApplication.delayCall = delegate(){ AssetDatabase.O...]]></description><category></category></item><item><title><![CDATA[同时打开多个独立Excel窗口]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/79658831</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/79658831</guid><author>suifcd</author><pubDate>Thu, 22 Mar 2018 19:47:27 +0800</pubDate><description><![CDATA[为什么会有这样的问题，我也觉得纳闷，早期使用EXCEL还真没这要求，打开多个EXCEL表格，切换着看，一点都没什么问题，加上内部的“窗口排列”方式，满足了大多数需求~

而今天，突然发现，我需要在两个显示器上，分别显示两个不同EXCEL表单，一个参看内容，一个操作录入数据。仅仅这个小需求，发现了小问题，表单仅在一个EXCEL窗口内显示，也就只能在一个显示器内显示，虽然桌面底部的任务栏里有两个EXC...]]></description><category></category></item><item><title><![CDATA[UGUI事件透传]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/79658791</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/79658791</guid><author>suifcd</author><pubDate>Thu, 22 Mar 2018 19:44:51 +0800</pubDate><description><![CDATA[使用NGUI时有一个叫UIEventListener的脚本，对于添加一些事件可以很方便的做到，而UGUI并没有类似的脚本，基于项目需求及习惯，写了一个类似的脚本，但是实践中发现，在ScrollView中对Item添加这个脚本后会影响ScrollView的拖动，原因是EventListener里面接收了Drag事件，并拦截了下来，致使ScrollView得不到拖动事件以进行响应。

问题出现并找到了...]]></description><category></category></item><item><title><![CDATA[接入sdk覆盖AndroidManifest后提示ClassNotFoundException问题]]></title><link>https://blog.youkuaiyun.com/suifcd/article/details/79379620</link><guid>https://blog.youkuaiyun.com/suifcd/article/details/79379620</guid><author>suifcd</author><pubDate>Mon, 26 Feb 2018 17:17:56 +0800</pubDate><description><![CDATA[项目接入了一个sdk，由于sdk需要添加新的权限，所以需要在AndroidManifest里添加相应的语句，由于是第一个需要修改AndroidManifest的sdk，项目里并没有对应的AndroidManifest文件，鉴于项目当前的配置，所以我先导出了一份eclipse工程，然后复制这份AndroidManifest到Plugin/Android目录下，添加好对应的权限后，重新打包运行，游戏直...]]></description><category></category></item></channel></rss>