FairyGUI学習記録

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

おすすめ

転載: blog.csdn.net/weixin_44054505/article/details/107189827