Unity FairyGUI(十二)
一.树
- 添加节点已经在树里了才能使用,也就是已经AddChild了。
- GTree目前不支持虚拟化
- 初始化结点最好通过(一下这种方式初始化)
aTree.treeNodeRender = RenderTreeNode;
void RenderTreeNode(GTreeNode node, GComponent obj)
{
}
public class Lesson43 : MonoBehaviour
{
private void Start()
{
var panel = UIManager.Instance.ShowPanel("Package1");
var gTree = panel.tree;
var rootNode = gTree.rootNode;
gTree.treeNodeRender += (node, component) =>
{
if (node.data != null)
{
var data = node.data as object[];
node.text = data[0].ToString();
component.data = data[1];
}
};
var node1 = new GTreeNode(true);
var node2 = new GTreeNode(true);
rootNode.AddChild(node1);
rootNode.AddChild(node2);
node1.text = "Resources";
node1.icon = "ui://Package1/quanlity_1";
node2.text = "Source";
node2.icon = "ui://Package1/quanlity_0";
for (int i = 0; i < 5; i++)
{
var node1_0 = new GTreeNode(false);
node1_0.data = new object[]{"node1_" + i,i};
node1.AddChild(node1_0);
}
for (int i = 0; i < 10; i++)
{
var node2_0 = new GTreeNode(false);
node2_0.data = new object[]{"node2_" + i,i};
node2.AddChild(node2_0);
}
gTree.onClickItem.Add((data) =>
{
if (data.data is GComponent gC)
Debug.Log(gC.data);
});
}
}
二.窗体的简单应用
public class Lesson44 : MonoBehaviour
{
private void Start()
{
GRoot.inst.SetContentScaleFactor(1365, 768, UIContentScaler.ScreenMatchMode.MatchHeight);
var pack = UIPackage.AddPackage("Package1");
foreach (var item in pack.dependencies)
UIPackage.AddPackage(item["name"]);
//设置模态遮罩的颜色
UIConfig.modalLayerColor = new Color(0, 0, 0, 0.5f);
//锁定窗体时的资源
UIConfig.windowModalWaiting = "ui://Package1/MovieClip";
var window = new Window();
window.contentPane = UIPackage.CreateObject("Package1", "TestWindow").asCom;
window.contentPane.MakeFullScreen();
window.contentPane.fairyBatching = true;
window.contentPane.AddRelation(GRoot.inst,RelationType.Size);
//设置模态需要在Show之前
window.modal = true;
window.Show();
//隐藏
//window.Hide();
//获取窗口是否显示
if (window.isShowing)
Debug.Log("窗口正在显示");
//锁定窗体
window.ShowModalWait();
//取消锁定
window.CloseModalWait();
}
}
三.窗体的高级应用
之前的简单窗体不够面向对象,可以继承一个Window基类,从而实现面向对象的窗体管理
- GRoot中子对象的层级顺序需要我们手动管理
- Window中帮我们实现了很多的排序功能
- 一般采用混排的方式使用Window和组件面板
- 主界面,全屏界面等全屏界面采用GRoot去添加
- 背包,任务,商城,任务等弹出面板采用Window去添加
public class TestWindow : Window
{
protected override void OnInit()
{
base.OnInit();
UIPackage.AddPackage("Package1");
this.contentPane = UIPackage.CreateObject("Package1", "TestWindow").asCom;
this.contentPane.MakeFullScreen();
this.contentPane.AddRelation(GRoot.inst,RelationType.Size);
}
protected override void OnShown()
{
base.OnShown();
Debug.Log("显示自己时调用");
}
protected override void OnHide()
{
base.OnHide();
Debug.Log("隐藏自己时调用");
}
protected override void DoShowAnimation()
{
base.DoShowAnimation();
OnShown();
}
protected override void DoHideAnimation()
{
base.DoHideAnimation();
OnHide();
}
}
public class Lesson45 : MonoBehaviour
{
private void Start()
{
GRoot.inst.SetContentScaleFactor(1365, 768, UIContentScaler.ScreenMatchMode.MatchHeight);
var testWindow = new TestWindow();
testWindow.Show();
//******************窗口管理******************
//1.将某个窗体提到最前面
GRoot.inst.BringToFront(testWindow);
//2.隐藏所有窗体
GRoot.inst.CloseAllWindows();
//3.关闭除了模态窗体的所有窗体
GRoot.inst.CloseAllExceptModals();
//4.返回最顶层的窗体
GRoot.inst.GetTopWindow();
//5.当前是否有模态窗体显示
if (GRoot.inst.hasModalWindow)
Debug.Log("有模态窗体!!!");
//6.是否开启窗体点击自动排序功能
UIConfig.bringWindowToFrontOnClick = false;
}
}
四.将UIManager添加对Window窗体的管理
- 可以优化UIManager,因为Window也继承自GComponet的,所以有优化的空间
public class UIManager
{
private static UIManager _instance;
public static UIManager Instance
{
get { return _instance ?? (_instance = new UIManager()); }
}
private Dictionary _allPanelDic;
private Dictionary _allWindowDic;
public UIManager()
{
UIConfig.buttonSoundVolumeScale = 0.5f;
_allPanelDic = new Dictionary();
_allWindowDic = new Dictionary();
UIObjectFactory.SetPackageItemExtension("ui://Package1/LearnFGUI4", typeof(LearnFGUI4));
UIObjectFactory.SetPackageItemExtension("ui://Package1/LearnFGUI5",typeof(LearnFGUI5));
GRoot.inst.SetContentScaleFactor(1365, 768, UIContentScaler.ScreenMatchMode.MatchHeight);
}
public T ShowPanel(string packName) where T : GComponent
{
var panelName = typeof(T).Name;
if (panelName.StartsWith("UI_"))
panelName = panelName.Substring(3);
if (_allPanelDic.ContainsKey(panelName))
{
var currPanel = _allPanelDic[panelName];
currPanel.visible = true;
return _allPanelDic[panelName] as T;
}
var pack = UIPackage.AddPackage(packName);
foreach (var item in pack.dependencies)
UIPackage.AddPackage(item["name"]);
var panel = (T) UIPackage.CreateObject(packName, panelName).asCom;
GRoot.inst.AddChild(panel);
panel.MakeFullScreen();
panel.AddRelation(GRoot.inst, RelationType.Size);
_allPanelDic.Add(panelName, panel);
return panel;
}
public T ShowWindow() where T : Window,new()
{
var windowName = typeof(T).Name;
if (_allWindowDic.ContainsKey(windowName))
{
var window = _allWindowDic[windowName];
window.Show();
return window as T;
}
var newWindow = new T();
newWindow.Show();
_allWindowDic.Add(windowName,newWindow);
return newWindow;
}
public void HidePanel(bool isDispose) where T : GComponent
{
var panelName = typeof(T).Name;
if (!_allPanelDic.ContainsKey(panelName))
return;
var panel = _allPanelDic[panelName];
if (!isDispose)
panel.visible = false;
else
{
panel.Dispose();
_allPanelDic.Remove(panelName);
}
}
public void HideWindow(bool isDisPose) where T : Window
{
var windowName = typeof(T).Name;
if(!_allWindowDic.ContainsKey(windowName))
return;
var window = _allWindowDic[windowName];
if(!isDisPose)
window.Hide();
else
{
window.Dispose();
_allWindowDic.Remove(windowName);
}
}
public T GetPanel() where T : GComponent
{
var panelName = typeof(T).Name;
if (_allPanelDic.ContainsKey(panelName))
return _allPanelDic[panelName] as T;
return null;
}
public T GetWindow() where T : Window
{
var windowName = typeof(T).Name;
if (_allWindowDic.ContainsKey(windowName))
return _allWindowDic[windowName] as T;
return null;
}
public void ClearPanel(bool isGC)
{
foreach (var item in _allPanelDic)
item.Value.Dispose();
_allPanelDic.Clear();
if (!isGC) return;
UIPackage.RemoveAllPackages();
GC.Collect();
}
public void ClearWindow(bool isGC)
{
foreach (var item in _allWindowDic)
item.Value.Dispose();
_allWindowDic.Clear();
if (!isGC) return;
UIPackage.RemoveAllPackages();
GC.Collect();
}
}
public class LearnFGUI4Window : Window
{
protected override void OnInit()
{
base.OnInit();
UIPackage.AddPackage("Package1");
this.contentPane = UIPackage.CreateObject("Package1", "LearnFGUI4").asCom;
this.MakeFullScreen();
this.AddRelation(GRoot.inst, RelationType.Size);
}
protected override void OnShown()
{
base.OnShown();
}
protected override void OnHide()
{
base.OnHide();
}
}
public class Lesson46 : MonoBehaviour
{
private void Start()
{
UIManager.Instance.ShowWindow();
}
}