溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-06-12 12:14:02 來源:網(wǎng)絡(luò) 閱讀:4894 作者:一條非洲人 欄目:游戲開發(fā)

最近公司在改造舊項(xiàng)目,經(jīng)過討論后決定用fairyGUI重做UI部分,lua插件用xlua,戰(zhàn)斗部分用打補(bǔ)丁方式熱更新。
以下是整合的過程
首先新建一個(gè)xlua工程,把fairyGUi_unitySDk的源碼和luasupport拷過來

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

這個(gè)時(shí)候luaUIHelper會(huì)報(bào)錯(cuò),我們從這個(gè)類開始修改。
1.using luaInterface改為using Xlua

2.[NoToLuaAttribute]改為[BlackListAttribute]

3.獲取luafunction:
peerTable.GetLuaFunction改為Get<LuaFunction>

4.執(zhí)行l(wèi)ua的方法

_OnInit.BeginPCall();
_OnInit.Push(this);
_OnInit.PCall();
_OnInit.EndPCall();
改為
_OnInit.Action<LuaWindow>(this);(無gc調(diào)用)
其他幾個(gè)函數(shù)如此類推

5.帶返回值的lua方法調(diào)用

extendFunction.BeginPCall();
extendFunction.Push(gcom);
extendFunction.PCall();
_peerTable = extendFunction.CheckLuaTable();
extendFunction.EndPCall();
改為
_peerTable = extendFunction.Func<GComponent,LuaTable>(gcom);(無gc調(diào)用)

這個(gè)時(shí)候LuaUIHelper已經(jīng)不報(bào)錯(cuò)了。

接下來我們要生成和FairyGui關(guān)聯(lián)的wrap,直接貼代碼:
using XLua;
using System.Collections.Generic;
using System;
using FairyGUI;

public static class FairyGuiGenConfig
{
//lua中要使用到C#庫的配置,比如C#標(biāo)準(zhǔn)庫,或者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#靜態(tài)調(diào)用Lua的配置(包括事件的原型),僅可以配delegate,interface
[CSharpCallLua]
public static List<Type> CSharpCallLua = new List<Type>() {
    typeof(EventCallback0),
    typeof(EventCallback1)
};

}
用Generate Code生成一下

這個(gè)時(shí)候我們可以試著用lua生成一個(gè)界面了
首先我們先實(shí)現(xiàn)調(diào)用Main的功能,具體實(shí)現(xiàn)看教程。
我們先自己編輯一個(gè)UI文件,新建Main.lua和MainPanel.lua
在Main.lua引入FairyGUI.lua
執(zhí)行一下,發(fā)現(xiàn)報(bào)錯(cuò),因?yàn)閤lua調(diào)用cs類的時(shí)候要加上CS.
所以我們加上FairyGUI = CS.FairyGUI
啟動(dòng)成功,開始寫邏輯,此處我用FairyGuiDemo里面的Model例子來修改,寫法是模仿官網(wǎng)上的例子
例子:
MainPanel = fgui.window_class()

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

--構(gòu)建函數(shù)
function MainPanel:ctor()
UIPackage.AddPackage('UI/Model');
end

--可覆蓋的函數(shù)(可選,不是說必須)
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

調(diào)用:
local view = MainPanel.New();
view:Show();

運(yùn)行一下,發(fā)現(xiàn)報(bào)錯(cuò)了
1.由于xlua沒有bind New函數(shù),所以我們new對(duì)象要將
FairyGUI.LuaWindow.New()改為FairyGUI.LuaWindow()

2.調(diào)用了tolua的函數(shù)tolua.setpeer,看了一下源碼和百度,發(fā)現(xiàn)是用來繼承cs的,然后在百度一下xlua對(duì)應(yīng)的api,最后在作者的github找到了https://github.com/Tencent/xLua/issues/405
最后將tolua.setpeer(ins, t)改為xutil.state(ins, t)

3.xlua不能訪問c#沒有的屬性,tolua會(huì)返回null,xlua就報(bào)錯(cuò)了,后來筆者把這個(gè)屬性先放到lua這邊
將ins.EventDelegates = {}改為t.EventDelegates

再運(yùn)行一下,期待的畫面出現(xiàn)了

一條非洲人--xlua整合fairyGui(一)
最基礎(chǔ)的功能實(shí)現(xiàn)了,下次我會(huì)記錄一下事件的修改。

項(xiàng)目Git:https://github.com/TaoOneOne/xLua_FairyGui_Demo
unity版本:5.6.5

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI