using FairyGUI; using System; using System.Collections.Generic; using UnityEngine; using XGame.Framework.UI; namespace XGame.Framework.FGUI { public class FguiTree : MonoBehaviour, IUITree, IDisposable { private Dictionary _layersMap; private void Start() { _layersMap = new Dictionary(); Init(); } private void Init() { var size = CalculateResolution(); Log.Debug($"Screen Width:{Screen.width} Height:{Screen.height} orientation:{Screen.orientation} Size:{size}"); GRoot.inst.SetContentScaleFactor(size.x, size.y, UIContentScaler.ScreenMatchMode.MatchWidthOrHeight); //(1136, 640); // 屏蔽FGUI自动卸载bundle UIPackage.unloadBundleByFGUI = false; // 设置UILayer节点 var layerVals = Enum.GetValues(typeof(UILayer)); foreach (var layerVal in layerVals) { UILayer layer = (UILayer)layerVal; //go.layer = LayerMask.NameToLayer("UI"); var component = new GComponent(); component.name = layer.ToString(); component.gameObjectName = layer.ToString(); component.rootContainer._panelOrder = (int)layer * 100; component.rootContainer.fairyBatching = true; GRoot.inst.AddChild(component); _layersMap.Add(layer, component); } } private Vector2Int CalculateResolution() { var size = new Vector2Int(756, 1344); if (Screen.orientation == ScreenOrientation.Portrait) { // 竖屏 size.y = (int)(Screen.height * size.x * 1f / Screen.width); } else { // 横屏 size.x = (int)(Screen.width * size.y * 1f / Screen.height); } return size; } #region IUITree 接口实现 Camera IUITree.Camera => StageCamera.main; Canvas IUITree.GetCanvas(UILayer layer) { /// TODO FGUI不需要Canvas throw new System.NotImplementedException(); } void IUITree.AddPanel(IUIPanel panel) { var parent = _layersMap[panel.Layer]; var fPanel = (panel as FguiPanel).Panel; parent.AddChild(fPanel); //全屏UI自适应 fPanel.MakeFullScreen(); //fPanel.Center(); } void IUITree.RemovePanel(IUIPanel panel) { var parent = _layersMap[panel.Layer]; var gComponent = (panel as FguiPanel).Panel; parent.RemoveChild(gComponent); // 关闭但未销毁的UI,父节点改为UITree #if UNITY_EDITOR gComponent.displayObject.gameObject.transform.SetParent(transform, false); #endif } void IUITree.SetAsLastSibling(IUIPanel panel) { var parent = _layersMap[panel.Layer]; var fPanel = (panel as FguiPanel).Panel; parent.AddChild(fPanel); //全屏UI自适应 fPanel.MakeFullScreen(); } void IDisposable.Dispose() { GameObject.Destroy(gameObject); } #endregion } }