您好,登錄后才能下訂單哦!
最近公司在改造舊項目,經過討論后決定用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:https://github.com/TaoOneOne/xLua_FairyGui_Demo
unity版本:5.6.5
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。