xlua整合fairyGui

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xlua整合fairyGui相关的知识,希望对你有一定的参考价值。

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

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

2.[NoToLuaAttribute]改为[BlackListAttribute]

3.获取luafunction:
peerTable.GetLuaFunction改为Get<LuaFunction>

4.执行lua的方法

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

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

extendFunction.BeginPCall();
extendFunction.Push(gcom);
extendFunction.PCall();
_peerTable = extendFunction.CheckLuaTable();
extendFunction.EndPCall();
改为
_peerTable = extendFunction.Func<GComponent,LuaTable>(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<Type> LuaCallCSharp = new List<Type>() {
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<Type> CSharpCallLua = new List<Type>() {
    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

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

最基础的功能实现了,下次我会记录一下事件的修改。

项目Git:
unity版本:5.6.5

以上是关于xlua整合fairyGui的主要内容,如果未能解决你的问题,请参考以下文章

UnityUI界面的热更新技术 FairyGUI的使用流程

UnityUI界面的热更新技术 FairyGUI的使用流程

UnityUI界面的热更新技术 FairyGUI的使用流程

Cocos2dLua3.17.2集成FairyGUI

XLua系列讲解_XLua调用C#

Unity 使用xLua遇到的坑