UIを作成する
FGUI を使用して UI インターフェイスを作成する場合、UIPackage を作成してコンポーネントを作成し、GRoot.inst をステージに追加することを選択すると、サブオブジェクトの順序に従って階層が表示されます
。 UIPanel スクリプトを追加し、UIPanel にパッケージ名とコンポーネントを割り当てるための GameObject 名前には UI インターフェイスが表示されますが、レベルを手動で設定する必要があります。レベルを設定するために UIPanel のsortingOrder プロパティを直接使用することはできません。SetSortingOrder を使用する必要があります(1, true) で設定します。最初のパラメータはレベルで、2 番目の設定は true でレベルを使用します。それ以外の場合は UI が繰り返し表示されます。
UI管理
プロジェクトの管理に Lua を使用し、FairyGUIManager = {} に設定します。Lua
テーブルは添え字に従ってアクセスできます。テーブル構造は FairyGUIManager = { [1] = {ComponentName = "UI 名"、panel = パネル (ここではパネル) です。 UIpanel スクリプトは、その後の UI の管理に便利です。gameObject を使用して直接 UI のゲーム オブジェクトにアクセスすることも、panel.ui を使用して FairyGUI の ui コンポーネントにアクセスすることもできます) } }
UIPanelを作成する
設置量UISortingLayer = 1;
table.insert(FairyGUIManager, {componentName = “UI名” , パネル = パネル })
パネル:SetSortingOrder(UISortingLayer, true);
UISortingLayer = UISortingLayer + 1 ;
UIPanelをアンマウントする
for i = #FairyGUIManager , 1, -1 do
if FairyGUIManager[i].componentName = “UI名” then
UnityEngine.GameObject.Destroy(FairyGUIManager[i].panel.gameObject);
table.remove(FairyGUIManager[i]);
UISortingLayer = UISortingLayer - 1
;
Lua テーブルの添字は自動的に配置され、新しいインターフェイスのレベルが最上位に配置されます。
FairyGUIManager.lua コード
ここでは UIPanel メソッドを使用して作成します。プロジェクトがインターフェイスをポップアップする場合は、Popup メソッドを使用して UI を作成できます。
---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by 乄风铃彡.
--- DateTime: 2020/6/10 16:55
---
FairyGUIManager = {}
FalryGuIManager. FairyGUIPanel = {}; -- 层级管理, FairyGUIManager = { [1] = { componentName = "UIPanelName"(string 类型名字), panel = panel(UIPanel 脚本)}}
local FairyGUlInit = 0;
local UIPanelNum = 1;
function FairyGUIManager.Init ()
FairyGurInit = 1;
-- 去除相机UI层
UnityEngine.Camer.main.cullingMask = bit.band(UnityEngine.Camera.main.cullingask, bit.bnot(bit.lshift(1, UnityEngine.LayerMask.NameToLayer("UI"))));
FairyGurManager.Root = UnityEngine.Gameobject.New();
FalryGuIManager.Root.name = "FairyGUIManager";
UnityEngine.Gameobject.DontDestroyonLoad(FairyGUIManager.Root);
--FairyGUI适配缩放
GRoot.inst.width = UnityEngine.Screen.width;
GRoot.inst.height = UnityEngine.Screen.height;
GRoot.inst:SetContentscaleFactor(UnityEngine.Screen.width, UnityEngine.Screen.height, FairyGUI.UIContentscaler.ScreenMlatchMlode.Matchwidth);
-- 设计分辨率是1920 * 1080
FairyGUIManager.ScreenScale = (UnityEngine.Screen.width * 1.0) / 1920;
--剪裁方案适配
GRoot.inst:SetcontentscaleFactor((FairyGUIManager.Screenscale));
end
function FairyGUIManager.Createpanel(packageName, componentName)
if FairyGUlInit == 0 then
FairyGUIManager.Init();
end
--创建UIPanel
local panelObj = UnityEngine.Gameobject.New();
panelObj.layer = UnityEngine.LayerMask.NameToLayer("UI");
panelObj.name = componentName;
panelObj.transform:SetParent(FairyGUIManager.Root, true);
local panel = panelObj:Addcomponent(typeof(UIPanel));
panel.fitScreen = FairyGUI.Fitscreen.Fitsize;
UIPackage.AddPackage('UI/' .. packageName);
panel.packageName = packageName;
panel.componentName = componentName;
panel:CreateUI();
--设置成射线检测类型
panel:SetHitTestMode(HitTestModeRaycast);
--panel.ui:SetSize(unityEngine.Screen.width, UnityEngine.Screen.height);
panel.ui:MakeFullscreen();
local tmpVector = panel:Getcomponent(typeof(UnityEngine.BoxCollider)).size;
--全局缩小方案适配
--tmpVector.x = UnityEngine.Screen.width;
--tmpVector.y = UnityEngine.Screen.height;
-- 建材方案适配
tmpVector.x = 1920;
tmpVector.y = 1920 / (UnityEngine.Screen.width / UnityEngine.Screen.height);
panel:Getcomponent(typeof(UnityEngine.BoxCollider)).size = tmpVector;
panel:Getcomponent(typeof(UnityEngine.BoxCollider)).center = Vector3.New(tmpVector.x / 2, -tmpVector.y / 2, 0);
FairyGUIManager.FairyGUIPanel[UIPanelNum] = { componentName = componentName, panel = panel };
FairyGUIManager.FairyGUIPanel[UIPanelNum].panel:SetSortingOrder(UIPanelNum, true);
UIPanelNum = UIPanelNum + 1;
return panel.ui;
end
--todo 设成对象池加载界面动态创建Gameobject
function FairyGUIManager.DisposePanel(componentName)
local hasCom = false;
for i = 1, #FairyGUIManager.FairyGUIPanel do
if FairyGUIManager.FairyGUIPanel[i].componentName == componentName then
UnityEngine.Gameobject.Destroy(FairyGUIManager.FairyGUIPanel[i].panel.gameobject);
table.remove(FairyGUIManager.FairyGUIPanel[i]);
UIPanelNum = UIPanelNum - 1;
--return
hascom = true;
end
if hascom then
if i == #FairyGUIManager.FairyPanel then
return ;
end
FairyGUIManager.FairyGUIPanel[i] = FairyGUIManager.FairyGUIPanel[i + 1];
end
end
end
function FairyGUIManager.Createcomponent(packageName, componentName)
if FairyGurInit == 0 then
FairyGUIManager.Init();
end
UIPackage.AddPackage('UI/' .. packageName);
local view = UIPackage.CreateObj(packageName, componentName);
-- Fairy大小适配
view:SetSize(GRoot.inst.width, GRoot.inst.height);
GRoot.inst:AddChild(view);
-- FairyGUIManager 表管理UI界面
FairyGUIManager.FairyGUIPanel[componentName] = view;
return view;
end
function FairyGUIManager.DisposeComponent(componentName)
FairyGUIManager.FairyGUIPanel[componentName]:Dispose();
FairyGUIManager.FairyGUIPanel[componentName] = nil;
end
return FairyGUIManager;
トルア利用
function.lua にメソッドを追加します。
--- multiphandler方法,可以输入更多变量,用于FGUI里的按钮Add方法(如果你使用的是ToLua,在Scripting Define Symbols里加上 FAIRYGUI_TOLUA。XLUA则不需要。)
--- 例如:self.view.onClick:Add(multiphandler(self, self.BtnClick, self.view.name));
--- 把self.view.name 当作参数传到self.BtnClick方法里;
--- 使用:
--function Test:BtnClick( ... )
-- local val = select(1, ... );
-- local data = val[1];
-- print("第一个参数是" .. data);
--end
function multiphandler( ... )
local val = { ... };
local val2 = {select(3, ... )};
return function(...)
val[2](val[1], val2);
end
end