/// <summary> /// 创建并获取一个面板实例 /// 可选参数:面板类型的委托(事件,当面板被打开的时候)(有了同步版本后暂时不用) /// </summary> /// <param name="info"></param> /// <returns></returns> public static WaitOpenPanel <TPanel> OpenPanelByCoroutine <TPanel>(System.Action <TPanel> onPanelOpened = null) where TPanel : BasePanel, new() { GameObject parent = GameObject.Find("Canvas"); if (!parent) { Debug.LogError("淦!你是不是没在场景中放canvas!?"); return(null); } //panel并不作为component,只是需要一个地方存放 脚本类实例,用new不用AddComponent var panel = new TPanel(); ////改成用协程方式加载 var loadPrefabHandle = new WaitLoadAsset <GameObject>(panel.Path); System.Action <GameObject> openPanelAction = prefab => { GameObject panelGobj = Object.Instantiate(prefab, parent.transform); //加载完面板后初始化面板脚本中的字段 //因为 类型名就是面板名,所以可以typeof(TPanel).Name panelGobj.name = typeof(TPanel).Name; panel.Init(panelGobj.name, panelGobj); panel.OnOpen(); }; return(new WaitOpenPanel <TPanel>(loadPrefabHandle, openPanelAction, onPanelOpened)); }
/// <summary> /// 等待面板打开(构造函数) /// 所需参数: /// 1 需要一个加载面板的协程 2 无返回值openPanel委托 3 ??? /// </summary> /// <param name="loadPanelPrefabCoroutine"></param> /// <param name="openPanelAction"></param> /// <param name="onOpended"></param> public WaitOpenPanel(WaitLoadAsset <GameObject> loadPanelPrefabCoroutine, Action <GameObject> openPanelAction, Action <Tpanel> onOpended) { OnOpened += onOpended; loadPanelPrefabCoroutine.OnFinish += _ => { openPanelAction?.Invoke(loadPanelPrefabCoroutine.m_asset); m_panel = new Tpanel(); IsCompleted = true; OnOpened?.Invoke(m_panel); OnFinish?.Invoke(m_panel); }; }