成都网站建设设计

将想法与焦点和您一起共享

一条非洲人--xlua整合fairyGui(一)-创新互联

最近公司在改造旧项目,经过讨论后决定用fairyGUI重做UI部分,lua插件用xlua,战斗部分用打补丁方式热更新。
以下是整合的过程
首先新建一个xlua工程,把fairyGUi_unitySDk的源码和luasupport拷过来

成都创新互联公司专业为企业提供冷水滩网站建设、冷水滩做网站、冷水滩网站设计、冷水滩网站制作等企业网站建设、网页设计与制作、冷水滩企业网站模板建站服务,十载冷水滩做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

一条非洲人--xlua整合fairyGui(一)

这个时候luaUIHelper会报错,我们从这个类开始修改。
1.using luaInterface改为using Xlua

2.[NoToLuaAttribute]改为[BlackListAttribute]

3.获取luafunction:
peerTable.GetLuaFunction改为Get

4.执行lua的方法

_OnInit.BeginPCall();
_OnInit.Push(this);
_OnInit.PCall();
_OnInit.EndPCall();
改为
_OnInit.Action(this);(无gc调用)
其他几个函数如此类推

5.带返回值的lua方法调用

extendFunction.BeginPCall();
extendFunction.Push(gcom);
extendFunction.PCall();
_peerTable = extendFunction.CheckLuaTable();
extendFunction.EndPCall();
改为
_peerTable = extendFunction.Func(gcom);(无gc调用)

这个时候LuaUIHelper已经不报错了。

接下来我们要生成和FairyGui关联的wrap,直接贴代码:
using XLua;
using System.Collections.Generic;
using System;
using FairyGUI;

public static class FairyGuiGenConfig
{
//lua中要使用到C#库的配置,比如C#标准库,或者Unity API,第三方库等。
[LuaCallCSharp]
public static List LuaCallCSharp = new List() {
typeof(EventContext),
typeof(EventDispatcher),
typeof(EventListener),
typeof(InputEvent),
typeof(DisplayObject),
typeof(Container),
typeof(Stage),
typeof(FairyGUI.Controller),
typeof(GObject),
typeof(GGraph),
typeof(GGroup),
typeof(GImage),
typeof(GLoader),
typeof(GMovieClip),
typeof(TextFormat),
typeof(GTextField),
typeof(GRichTextField),
typeof(GTextInput),
typeof(GComponent),
typeof(GList),
typeof(GRoot),
typeof(GLabel),
typeof(GButton),
typeof(GComboBox),
typeof(GProgressBar),
typeof(GSlider),
typeof(PopupMenu),
typeof(ScrollPane),
typeof(Transition),
typeof(UIPackage),
typeof(Window),
typeof(GObjectPool),
typeof(Relations),
typeof(RelationType),
typeof(Timers),
typeof(GTween),
typeof(GTweener),
typeof(EaseType),
typeof(TweenValue),

    typeof(LuaUIHelper),
    typeof(GLuaComponent),
    typeof(GLuaLabel),
    typeof(GLuaButton),
    typeof(GLuaProgressBar),
    typeof(GLuaSlider),
    typeof(GLuaComboBox),
    typeof(LuaWindow)

typeof(GoWrapper)
};

//C#静态调用Lua的配置(包括事件的原型),仅可以配delegate,interface
[CSharpCallLua]
public static List CSharpCallLua = new List() {
    typeof(EventCallback0),
    typeof(EventCallback1)
};

}
用Generate Code生成一下

这个时候我们可以试着用lua生成一个界面了
首先我们先实现调用Main的功能,具体实现看教程。
我们先自己编辑一个UI文件,新建Main.lua和MainPanel.lua
在Main.lua引入FairyGUI.lua
执行一下,发现报错,因为xlua调用cs类的时候要加上CS.
所以我们加上FairyGUI = CS.FairyGUI
启动成功,开始写逻辑,此处我用FairyGuiDemo里面的Model例子来修改,写法是模仿官网上的例子
例子:
MainPanel = fgui.window_class()

local Resources = CS.UnityEngine.Resources
local Object = CS.UnityEngine.Object
local Vector3 = CS.UnityEngine.Vector3

--构建函数
function MainPanel:ctor()
UIPackage.AddPackage('UI/Model');
end

--可覆盖的函数(可选,不是说必须)
function MainPanel:OnInit()
self.contentPane = UIPackage.CreateObject('Model', 'Main')

local prefab = Resources.Load("Role/npc");
local  go = Object.Instantiate(prefab);
go.transform.localPosition = Vector3(61, -89, 1000);
go.transform.localScale = Vector3(180, 180, 180);
go.transform.localEulerAngles = Vector3(0, 100, 0);
self.contentPane:GetChild("holder").asGraph:SetNativeObject(GoWrapper(go));

end

function MainPanel:OnShown()
end

function MainPanel:OnHide()
end

调用:
local view = MainPanel.New();
view:Show();

运行一下,发现报错了
1.由于xlua没有bind New函数,所以我们new对象要将
FairyGUI.LuaWindow.New()改为FairyGUI.LuaWindow()

2.调用了tolua的函数tolua.setpeer,看了一下源码和百度,发现是用来继承cs的,然后在百度一下xlua对应的api,最后在作者的github找到了https://github.com/Tencent/xLua/issues/405
最后将tolua.setpeer(ins, t)改为xutil.state(ins, t)

3.xlua不能访问c#没有的属性,tolua会返回null,xlua就报错了,后来笔者把这个属性先放到lua这边
将ins.EventDelegates = {}改为t.EventDelegates

再运行一下,期待的画面出现了

一条非洲人--xlua整合fairyGui(一)
最基础的功能实现了,下次我会记录一下事件的修改。

项目Git:https://github.com/TaoOneOne/xLua_FairyGui_Demo
unity版本:5.6.5

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站栏目:一条非洲人--xlua整合fairyGui(一)-创新互联
本文URL:http://chengdu.cdxwcx.cn/article/dshjsg.html