昆山网站制作 微博,小程序免费制作,frontpage做网站怎么样,wordpress the 7今天来介绍一下UIManager和UIPanel模块#xff0c;话不多说直接开始。 UIManager 功能介绍 UIManager是管理UIPanel的唯一模块#xff0c;UIManager的主要功能包括#xff1a;
提供打开、隐藏、关闭UIPanel的相关接口。负责UIPanel对象的创建以及初始化。负责储存UIPanel对… 今天来介绍一下UIManager和UIPanel模块话不多说直接开始。 UIManager 功能介绍 UIManager是管理UIPanel的唯一模块UIManager的主要功能包括
提供打开、隐藏、关闭UIPanel的相关接口。负责UIPanel对象的创建以及初始化。负责储存UIPanel对象实例。 UIManager提供了打开、隐藏、关闭UIPanel的泛型接口通过传入UIPanel的子类型就可以对其进行相应的操作。接口代码如下
/// summary打开UI/summary
/// typeparam nameTUI类型/typeparam
public void OpenUIT(Action pCallback null) where T : Component/// summary隐藏UI不销毁/summary
/// typeparam nameTUI类型/typeparam
public void HideUIT()/// summary关闭UI销毁/summary
/// typeparam nameTUI类型/typeparam
public void CloseUIT()UIManager内以键值对的方式存储UIPanel当调用OpenUI时会先判断是否存在该UIPanel如果没有则会加载创建并存储下来。示例代码如下
public class UIManager : ManagerBaseUIManager
{private Dictionarystring, GameObject mUIDictionary new Dictionarystring, GameObject();/// summary打开UI/summary/// typeparam nameTUI类型/typeparampublic void OpenUIT(Action pCallback null) where T : Component{string uiName GetUINameT();GameObject uiGameObject null;if (!mUIDictionary.TryGetValue(uiName, out uiGameObject)){uiGameObject InstantiateUIT();if (uiGameObject null){ManagerCollection.LoadManager.LoadAssetAsync(uiName, (bool pIsSucceeded) {OpenUIT(pCallback);});}else{uiGameObject.SetActive(true);pCallback?.Invoke();}}else{uiGameObject.SetActive(true);pCallback?.Invoke();}}/// summary实例化UI/summary/// param nameuiName面板名称/param/// param namegameObjectAsset资源/param/// returns面板对象/returnsprivate GameObject InstantiateUIT() where T : Component{GameObject uiGameObject null;string uiName GetUINameT();GameObject gameObjectAsset ManagerCollection.ResourceManager.GetGameObject(uiName);if (gameObjectAsset ! null){uiGameObject GameObject.Instantiate(gameObjectAsset);IPanelBase panelBase uiGameObject.AddComponentT() as IPanelBase;panelBase.Init();uiGameObject.transform.SetParent(mCanvasDictionary[panelBase.CanvasType], false);uiGameObject.transform.localScale Vector3.one;uiGameObject.transform.localRotation Quaternion.identity;mUIDictionary.Add(uiName, uiGameObject);}return uiGameObject;}
}设计思路 先说一下UIManager为什么采用泛型接口的设计而不是通过string作为参数来传递UIPanel的名称。这么做的主要原因是为了正确的获取面板名称。泛型接口通过传递的UIPanel类型来获取名称这样做的好处在于在代码编译阶段就可以利用编译器如VSVSCode检测判断类型是否正确并且可以通过UIPanel类型正确的获取UIPanel的名称。而采用string作为参数传递UIPanel名称则需要在运行时才能判断UIPanel名称是否正确。所泛型接口能更好的确保代码的正确性。 再说一下InstantiateUI方法中为什么用AddComponent的方式添加UIPanel脚本。原因在于游戏框架被分为Client、Server、Desgin、Resource多个工程前端和美术在各自的工程项目中开发流程是美术在Resource工程中制作Prefab资源制作完成后由程序同步到Client工程中开发脚本逻辑。由于美术在Resource工程中并不会涉及到脚本文件为了避免不必要的同步所以在运行时创建UIPanel实例时绑定脚本。 UIPanel模块 功能介绍 UIPanel借鉴了MVC的设计模式UIPanel分为PanelBase、ControllerBase、ViewBase三个部分在创建一个新UIPanel时需分别创建三个子类并继承上面各自的基类。示例代码如下
/// summaryUI面板类/summary
public class UIPanel : PanelBaseUIPanelController, UIPanelView
{protected override void OnInit(){}
}/// summaryUI面板Controller类/summary
public class UIPanelController : ControllerBaseUIPanelView
{protected override void OnInit(){}
}/// summaryUI面板View类/summary
public class UIPanelView : ViewBaseUIController
{protected override void OnInit(){}
} Panel部分的主要功能有
Panel作为面板的主类Panel类名作为面板的名称。在UIManager调用泛型接口时传入Panel类型如上面代码的UIPanel。负责Controller和View的创建初始化。 Controller部分的主要功能和主要职责有
Controller主要负责面板的逻辑部分代码处理UI响应、事件响应。ControllerBase提供了相关UI组件事件响应的接口。 示例代码如下
protected void RegisterButton(string pGameObjectName, ExButton.EnumCallbackType pCallbackType, Action pCallback)protected void RegisterSlider(string pGameObjectName, ExSlider.EnumCallbackType pCallbackType, Actionfloat pCallback)protected void RegisterToggle(string pGameObjectName, ExToggle.EnumCallbackType pCallbackType, Actionbool pCallback) View部分的主要功能和职责有
View主要负责面板显示部分的代码。View储存持有代码中需要用到UI对象。View提供获取UI对象和组件的相关接口。 示例代码如下
public class ViewBaseC : UIBase, IViewBasewhere C : IControllerBase
{private C mControllerBase;[SerializeField]private ListGameObject mGameObjectList new ListGameObject();public GameObject GetGameObject(string pGameObjectName)public T GetComponentT(string pGameObjectName)
} 设计思路 UIPanel借鉴了MVC的设计模式将UI面板中逻辑处理和界面显示两大部分的代码分开让代码更加的清晰从而便于开发与维护。虽然Controller和View可以相互的访问但在实际开发中还是遵从Controller驱动View的思路来开发。UIPanel先在Controller处理UI响应、事件响应相关逻辑完成后在View设置相关显示。 相关文档链接
工程源代码https://gitee.com/huoyixian/release-framework-client