当前位置: 首页 > news >正文

个人网站用什么开发国外网站加速器

个人网站用什么开发,国外网站加速器,内容类网站如何 流量,学网站开发的能找什么工作UE4运用C和框架开发坦克大战教程笔记#xff08;十九#xff09;#xff08;第58~60集#xff09;完结 58. 弹窗显示与隐藏59. UI 面板销毁60. 框架完成与总结 58. 弹窗显示与隐藏 这节课我们先来补全 TransferMask() 里对于 Overlay 布局类型面板的遮罩转移逻辑#xff… UE4运用C和框架开发坦克大战教程笔记十九第58~60集完结 58. 弹窗显示与隐藏59. UI 面板销毁60. 框架完成与总结 58. 弹窗显示与隐藏 这节课我们先来补全 TransferMask() 里对于 Overlay 布局类型面板的遮罩转移逻辑大体上与 Canvas 布局类型的差不多。 接下来就是编写弹窗的隐藏和重新显示的逻辑。 在写重新显示弹窗的逻辑时我们发现 DoEnterUIPanel() 有一段代码可以复用但是发现了一处逻辑上的错误所以要调整一下代码。 DDFrameWidget.cpp void UDDFrameWidget::DoEnterUIPanel(FName PanelName) {// ... 省略// 此处作更改 if (!WorkLayout) {if (UnActiveCanvas.Num() 0) {WorkLayout WidgetTree-ConstructWidgetUCanvasPanel(UCanvasPanel::StaticClass());WorkLayout-SetVisibility(ESlateVisibility::SelfHitTestInvisible);}elseWorkLayout UnActiveCanvas.Pop();// 添加布局控件到界面最顶层UCanvasPanelSlot* FrameCanvasSlot RootCanvas-AddChildToCanvas(WorkLayout);FrameCanvasSlot-SetAnchors(FAnchors(0.f, 0.f, 1.f, 1.f));FrameCanvasSlot-SetOffsets(FMargin(0.f, 0.f, 0.f, 0.f));// 添加到激活画布组ActiveCanvas.Push(WorkLayout); }// ... 省略// 此处作更改if (!WorkLayout) {if (UnActiveOverlay.Num() 0) {WorkLayout WidgetTree-ConstructWidgetUOverlay(UOverlay::StaticClass());WorkLayout-SetVisibility(ESlateVisibility::SelfHitTestInvisible);}elseWorkLayout UnActiveOverlay.Pop();// 添加布局控件到界面最顶层UCanvasPanelSlot* FrameCanvasSlot RootCanvas-AddChildToCanvas(WorkLayout);FrameCanvasSlot-SetAnchors(FAnchors(0.f, 0.f, 1.f, 1.f));FrameCanvasSlot-SetOffsets(FMargin(0.f, 0.f, 0.f, 0.f));// 添加到激活画布组ActiveOverlay.Push(WorkLayout); }// ... 省略 }void UDDFrameWidget::HidePanelReverse(UDDPanelWidget* PanelWidget) {// 获取弹窗栈到数组TArrayUDDPanelWidget* PopStack;PopPanelStack.GenerateValueArray(PopStack);// 如果不是最上层的弹窗直接返回if (PopStack[PopStack.Num() - 1] ! PanelWidget) {DDH::Debug() PanelWidget-GetObjectName() Is Not Last Panel In PopPanelStack DDH::Endl();return;}// 从栈中移除PopPanelStack.Remove(PanelWidget-GetObjectName());// 执行隐藏函数PanelWidget-PanelHidden();// 调整弹窗栈PopStack.Pop();if (PopStack.Num() 0) {UDDPanelWidget* PrePanelWidget PopStack[PopStack.Num() - 1];// 转移遮罩到新的最顶层的弹窗的下一层TransferMask(PrePanelWidget);// 恢复被冻结的最顶层的弹窗PrePanelWidget-PanelResume();}// 如果没有弹窗就移除遮罩elseRemoveMaskPanel(); }void UDDFrameWidget::ShowPanelReverse(UDDPanelWidget* PanelWidget) {// 如果弹窗栈里有元素冻结最顶层的弹窗if (PopPanelStack.Num() 0) {TArrayUDDPanelWidget* PanelStack;PopPanelStack.GenerateValueArray(PanelStack);PanelStack[PanelStack.Num() - 1]-PanelFreeze();}// 弹窗对象必须从当前父控件移除再重新添加到最顶层的界面因为弹窗只是隐藏而不是销毁了if (PanelWidget-UINature.LayoutType ELayoutType::Canvas) {UCanvasPanel* PreWorkLayout CastUCanvasPanel(PanelWidget-GetParent());UCanvasPanelSlot* PrePanelSlot CastUCanvasPanelSlot(PanelWidget-Slot);FAnchors PreAnchors PrePanelSlot-GetAnchors();FMargin PreOffsets PrePanelSlot-GetOffsets();// 将 PanelWidget 从当前父控件移除PanelWidget-RemoveFromParent();// 处理父控件if (PreWorkLayout-GetChildrenCount() 0) {PreWorkLayout-RemoveFromParent();ActiveCanvas.Remove(PreWorkLayout);UnActiveCanvas.Push(PreWorkLayout);}// 寻找最顶层的 WorkLayoutUCanvasPanel* WorkLayout NULL;// 判断最底层的布局控件是否是 Canvasif (RootCanvas-GetChildrenCount() 0)WorkLayout CastUCanvasPanel(RootCanvas-GetChildAt(RootCanvas-GetChildrenCount() - 1));if (!WorkLayout) {// 如果没有任何对象if (UnActiveCanvas.Num() 0) {WorkLayout WidgetTree-ConstructWidgetUCanvasPanel(UCanvasPanel::StaticClass());WorkLayout-SetVisibility(ESlateVisibility::SelfHitTestInvisible);}elseWorkLayout UnActiveCanvas.Pop();// 添加布局控件到界面最顶层UCanvasPanelSlot* FrameCanvasSlot RootCanvas-AddChildToCanvas(WorkLayout);FrameCanvasSlot-SetAnchors(FAnchors(0.f, 0.f, 1.f, 1.f));FrameCanvasSlot-SetOffsets(FMargin(0.f, 0.f, 0.f, 0.f));// 添加到激活画布组ActiveCanvas.Push(WorkLayout); }// 激活遮罩到最顶层弹窗ActiveMask(WorkLayout, PanelWidget-UINature.PanelLucencyType);// 把弹窗添加到获取的最顶层的父控件UCanvasPanelSlot* PanelSlot WorkLayout-AddChildToCanvas(PanelWidget);PanelSlot-SetAnchors(PreAnchors);PanelSlot-SetOffsets(PreOffsets);}else {UOverlay* PreWorkLayout CastUOverlay(PanelWidget-GetParent());UOverlaySlot* PrePanelSlot CastUOverlaySlot(PanelWidget-Slot);FMargin PrePadding PrePanelSlot-Padding;TEnumAsByteEHorizontalAlignment PreHAlign PrePanelSlot-HorizontalAlignment;TEnumAsByteEVerticalAlignment PreVAlign PrePanelSlot-VerticalAlignment;// 将 PanelWidget 从当前父控件移除PanelWidget-RemoveFromParent();// 处理父控件if (PreWorkLayout-GetChildrenCount() 0) {PreWorkLayout-RemoveFromParent();ActiveOverlay.Remove(PreWorkLayout);UnActiveOverlay.Push(PreWorkLayout);}UOverlay* WorkLayout NULL;// 如果存在布局控件试图把最后一个布局控件转换成 Overlayif (RootCanvas-GetChildrenCount() 0)WorkLayout CastUOverlay(RootCanvas-GetChildAt(RootCanvas-GetChildrenCount() - 1));if (!WorkLayout) {if (UnActiveOverlay.Num() 0) {WorkLayout WidgetTree-ConstructWidgetUOverlay(UOverlay::StaticClass());WorkLayout-SetVisibility(ESlateVisibility::SelfHitTestInvisible);}elseWorkLayout UnActiveOverlay.Pop();// 添加布局控件到界面最顶层UCanvasPanelSlot* FrameCanvasSlot RootCanvas-AddChildToCanvas(WorkLayout);FrameCanvasSlot-SetAnchors(FAnchors(0.f, 0.f, 1.f, 1.f));FrameCanvasSlot-SetOffsets(FMargin(0.f, 0.f, 0.f, 0.f));// 添加到激活画布组ActiveOverlay.Push(WorkLayout); }// 激活遮罩到最顶层弹窗ActiveMask(WorkLayout, PanelWidget-UINature.PanelLucencyType);// 添加弹窗到获取到的最顶层的布局控件UOverlaySlot* PanelSlot WorkLayout-AddChildToOverlay(PanelWidget);PanelSlot-SetPadding(PrePadding);PanelSlot-SetHorizontalAlignment(PreHAlign);PanelSlot-SetVerticalAlignment(PreVAlign);}// 添加弹窗到栈PopPanelStack.Add(PanelWidget-GetObjectName(), PanelWidget);// 显示弹窗PanelWidget-PanelDisplay(); }void UDDFrameWidget::TransferMask(UDDPanelWidget* PanelWidget) {// ... 省略if (PanelWidget-UINature.LayoutType ELayoutType::Canvas) {// ... 省略}else {UOverlay* WorkLayout CastUOverlay(PanelWidget-GetParent());int32 StartOrder WorkLayout-GetChildIndex(PanelWidget);for (int i StartOrder; i WorkLayout-GetChildrenCount(); i) {UDDPanelWidget* TempPanelWidget CastUDDPanelWidget(WorkLayout-GetChildAt(i));if (!TempPanelWidget)continue;// 保存 UI 面板以及布局数据AbovePanelStack.Push(TempPanelWidget);FUINature TempUINature;UOverlaySlot* TempPanelSlot CastUOverlaySlot(TempPanelWidget-Slot);TempUINature.Offsets TempPanelSlot-Padding;TempUINature.HAlign TempPanelSlot-HorizontalAlignment;TempUINature.VAlign TempPanelSlot-VerticalAlignment;AboveNatureStack.Push(TempUINature);}// 循环移除上层 UI 面板for (int i 0; i AbovePanelStack.Num(); i)AbovePanelStack[i]-RemoveFromParent();// 添加遮罩到新的父控件UOverlaySlot* MaskSlot WorkLayout-AddChildToOverlay(MaskPanel);MaskSlot-SetPadding(FMargin(0.f, 0.f, 0.f, 0.f));MaskSlot-SetHorizontalAlignment(HAlign_Fill);MaskSlot-SetVerticalAlignment(VAlign_Fill);// 根据透明类型设置透明度switch (PanelWidget-UINature.PanelLucencyType) {case EPanelLucencyType::Lucency:MaskPanel-SetVisibility(ESlateVisibility::Visible);MaskPanel-SetColorAndOpacity(NormalLucency);break;case EPanelLucencyType::Translucence:MaskPanel-SetVisibility(ESlateVisibility::Visible);MaskPanel-SetColorAndOpacity(TranslucenceLucency);break;case EPanelLucencyType::ImPenetrable:MaskPanel-SetVisibility(ESlateVisibility::Visible);MaskPanel-SetColorAndOpacity(ImPenetrableLucency);break;case EPanelLucencyType::Penetrate:MaskPanel-SetVisibility(ESlateVisibility::Hidden);MaskPanel-SetColorAndOpacity(NormalLucency);break;}// 将 UI 面板填充回布局控件for (int i 0; i AbovePanelStack.Num(); i) {UOverlaySlot* PanelSlot WorkLayout-AddChildToOverlay(AbovePanelStack[i]);PanelSlot-SetPadding(AboveNatureStack[i].Offsets);PanelSlot-SetHorizontalAlignment(AboveNatureStack[i].HAlign);PanelSlot-SetVerticalAlignment(AboveNatureStack[i].VAlign);}} }接下来我们测试一下弹窗隐藏和重新显示的逻辑是否正常运行。依旧是修改协程方法里的调用顺序。 RCGameUIFrame.cpp // 修改协程方法如下 DDCoroTask* URCGameUIFrame::UIProcess() {DDCORO_PARAM(URCGameUIFrame);#include DDCORO_BEGIN()// 显示状态栏和小地图D-ShowUIPanel(StatePanel);D-ShowUIPanel(MiniMapPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f); // 缩短时间// 显示菜单栏D-ShowUIPanel(MenuPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);// 显示设置栏D-ShowUIPanel(OptionPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);// 隐藏菜单栏这个操作会失败并输出 Debug 错误D-HideUIPanel(MenuPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);// 隐藏设置栏D-HideUIPanel(OptionPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);// 隐藏菜单栏本次操作成功D-HideUIPanel(MenuPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f); // 显示菜单栏D-ShowUIPanel(MenuPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);// 显示设置栏D-ShowUIPanel(OptionPanel);#include DDCORO_END() }运行游戏可见界面上有状态栏和小地图 3 秒后菜单弹窗伴随着遮罩出现菜单弹窗可交互 再 3 秒后设置弹窗出现遮罩移到它的底下菜单弹窗不可交互设置弹窗可交互 再 3 秒后试图隐藏菜单弹窗但是它不是最靠前的弹窗所以左上角输出 Debug 语句提示失败。 再 3 秒后设置弹窗隐藏遮罩移到菜单弹窗的底下并且菜单弹窗又恢复可交互 再 3 秒菜单弹窗和遮罩隐藏 再 3 秒菜单弹窗和遮罩重新出现菜单弹窗可交互 最后再 3 秒设置弹窗出现遮罩移到它的底下菜单弹窗不可交互设置弹窗可交互 说明我们写的遮罩管理器以及弹窗的隐藏和重新显示都没有问题。 59. UI 面板销毁 UI 框架已经实现了大半我们接下来继续实现 UI 的销毁功能。对于销毁逻辑也需要根据面板类型来使用相应的方法。 DDFrameWidget.h public:// 销毁 UIUFUNCTION()void ExitUIPanel(FName PanelName);// 处理 UI 面板销毁后的父控件供反射系统调用UFUNCTION()void ExitCallBack(ELayoutType LayoutType, UPanelWidget* InLayout);protected:// 销毁 UIvoid ExitPanelDoNothing(UDDPanelWidget* PanelWidget);void ExitPanelHideOther(UDDPanelWidget* PanelWidget);void ExitPanelReverse(UDDPanelWidget* PanelWidget);DDFrameWidget.cpp void UDDFrameWidget::ExitUIPanel(FName PanelName) {// 如果正在预加载但是没有加载完成这种情况出现在执行第一次显示或提前加载后就马上执行销毁界面if (!AllPanelGroup.Contains(PanelName) LoadedPanelName.Contains(PanelName)) {DDH::Debug() Do Not Exit UI Panel when Loading Panel DDH::Endl();return;}// 如果这个 UI 面板没有加载到全部组if (!AllPanelGroup.Contains(PanelName))return;// 获取 UI 面板UDDPanelWidget* PanelWidget *AllPanelGroup.Find(PanelName);// 是否在显示组或者弹窗栈内if (!ShowPanelGroup.Contains(PanelName) !PopPanelStack.Contains(PanelName)) {AllPanelGroup.Remove(PanelName);LoadedPanelName.Remove(PanelName);// 运行 PanelExit 生命周期具体的内存释放代码在该周期函数里面PanelWidget-PanelExit();// 直接返回return;}// 处理隐藏 UI 面板相关的流程switch (PanelWidget-UINature.PanelShowType) {case EPanelShowType::DoNothing:ExitPanelDoNothing(PanelWidget);break;case EPanelShowType::HideOther:ExitPanelHideOther(PanelWidget);break;case EPanelShowType::Reverse:ExitPanelReverse(PanelWidget);break;} }void UDDFrameWidget::ExitPanelDoNothing(UDDPanelWidget* PanelWidget) {// 从显示组全部组加载名字组移除ShowPanelGroup.Remove(PanelWidget-GetObjectName());AllPanelGroup.Remove(PanelWidget-GetObjectName());LoadedPanelName.Remove(PanelWidget-GetObjectName());// 运行销毁生命周期PanelWidget-PanelExit(); }void UDDFrameWidget::ExitPanelHideOther(UDDPanelWidget* PanelWidget) {// 从显示组全部组加载名字组移除ShowPanelGroup.Remove(PanelWidget-GetObjectName());AllPanelGroup.Remove(PanelWidget-GetObjectName());LoadedPanelName.Remove(PanelWidget-GetObjectName());// 显示同一层级下的其他 UI 面板如果该面板是 Level_All 层级显示所有显示组的面板for (TMapFName, UDDPanelWidget*::TIterator It(ShowPanelGroup); It; It) {if (PanelWidget-UINature.LayoutLevel ELayoutLevel::Level_All || PanelWidget-UINature.LayoutLevel It.Value()-UINature.LayoutLevel)It.Value()-PanelDisplay();}// 运行销毁生命周期PanelWidget-PanelExit(); }void UDDFrameWidget::ExitPanelReverse(UDDPanelWidget* PanelWidget) {// 获取弹窗栈到数组TArrayUDDPanelWidget* PopStack;PopPanelStack.GenerateValueArray(PopStack);// 如果不是最上层的弹窗直接返回if (PopStack[PopStack.Num() - 1] ! PanelWidget) {DDH::Debug() PanelWidget-GetObjectName() Is Not Last Panel In PopPanelStack DDH::Endl();return;}// 从栈全部组加载名字组中移除PopPanelStack.Remove(PanelWidget-GetObjectName());AllPanelGroup.Remove(PanelWidget-GetObjectName());LoadedPanelName.Remove(PanelWidget-GetObjectName());// 运行销毁生命周期函数PanelWidget-PanelExit();// 调整弹窗栈PopStack.Pop();if (PopStack.Num() 0) {UDDPanelWidget* PrePanelWidget PopStack[PopStack.Num() - 1];// 转移遮罩到新的最顶层的弹窗的下一层TransferMask(PrePanelWidget);// 恢复被冻结的最顶层的弹窗PrePanelWidget-PanelResume();}elseRemoveMaskPanel(); }void UDDFrameWidget::ExitCallBack(ELayoutType LayoutType, UPanelWidget* InLayout) {if (LayoutType ELayoutType::Canvas) {UCanvasPanel* WorkLayout CastUCanvasPanel(InLayout);if (WorkLayout-GetChildrenCount() 0) {WorkLayout-RemoveFromParent();ActiveCanvas.Remove(WorkLayout);UnActiveCanvas.Push(WorkLayout);}}else {UOverlay* WorkLayout CastUOverlay(InLayout);if (WorkLayout-GetChildrenCount() 0) {WorkLayout-RemoveFromParent();ActiveOverlay.Remove(WorkLayout);UnActiveOverlay.Push(WorkLayout);}} }来到 DDPanelWidget编写销毁 UI 的具体逻辑。 因为需要考虑面板销毁后父控件是否还有子面板如果没有就没必要存在了所以我们利用反射系统声明一个方法来调用 DDFrameWidget 里的方法来移除没有内容的父控件。 DDPanelWidget.h protected:// 销毁动画回调函数void RemoveCallBack();protected:// UIFrame 管理器所在的模组 ID约定在 HUD 下数值是 1static int32 UIFrameModuleIndex;// UIFrame 管理器的对象名约定是 UIFramestatic FName UIFrameName;// 销毁回调函数名字static FName ExitCallBackName;protected:DDOBJFUNC_TWO(ExitCallBack, ELayoutType, LayoutType, UPanelWidget*, WorkLayout);DDPanelWidget.cpp int32 UDDPanelWidget::UIFrameModuleIndex(1);FName UDDPanelWidget::UIFrameName(TEXT(UIFrame));FName UDDPanelWidget::ExitCallBackName(TEXT(ExitCallBack));void UDDPanelWidget::PanelExit() {// 如果 UI 面板正在显示if (GetVisibility() ! ESlateVisibility::Hidden)InvokeDelay(PanelHiddenName, DisplayLeaveMovie(), this, UDDPanelWidget::RemoveCallBack);elseRemoveCallBack(); }void UDDPanelWidget::RemoveCallBack() {// 获取父控件UPanelWidget* WorkLayout GetParent();// 这个判断条件会在下一集补充// 已经加载了 UI 面板但是一直没有运行显示命令的情况下WorkLayout 为空if (WorkLayout) {RemoveFromParent();// 告诉 UI 管理器处理父控件ExitCallBack(UIFrameModuleIndex, UIFrameName, ExitCallBackName, UINature.LayoutType, WorkLayout);}// 执行销毁DDDestroy(); }接下来测试下销毁 UI 的逻辑是否正常运行依旧是调整协程方法里的调用逻辑。 RCGameUIFrame.cpp // 修改协程方法如下 DDCoroTask* URCGameUIFrame::UIProcess() {DDCORO_PARAM(URCGameUIFrame);#include DDCORO_BEGIN()D-ShowUIPanel(StatePanel);D-ShowUIPanel(MiniMapPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);D-ShowUIPanel(BigMapPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);D-ShowUIPanel(MenuPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);D-ShowUIPanel(OptionPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);DDH::Debug() ExitUIPanel MiniMapPanel DDH::Endl();D-ExitUIPanel(MiniMapPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);DDH::Debug() ExitUIPanel OptionPanel DDH::Endl();D-ExitUIPanel(OptionPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);DDH::Debug() ExitUIPanel BigMapPanel DDH::Endl();D-ExitUIPanel(BigMapPanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);DDH::Debug() ExitUIPanel StatePanel DDH::Endl();D-ExitUIPanel(StatePanel);#include DDYIELD_READY()DDYIELD_RETURN_SECOND(3.f);DDH::Debug() ExitUIPanel MenuPanel DDH::Endl();D-ExitUIPanel(MenuPanel);#include DDCORO_END() }运行游戏首先可看到状态栏和小地图接着是大地图出现状态栏和小地图收起菜单弹窗出现设置弹窗出现 随后销毁小地图、销毁设置弹窗、销毁大地图状态栏出现、销毁状态栏最后销毁菜单弹窗。 说明销毁 UI 的功能也写好了。 60. 框架完成与总结 课程已经接近尾声本集开头会修改一些疏漏的地方笔者已经在先前的课程里标注了。 我们前面写了很多 UI 框架的方法但是看起来都是管理类在操控面板我们打算让面板自己也能执行这些操控方法只要通过反射系统让管理类执行就可以实现了。 DDPanelWidget.h protected:void ShowSelfPanel();void HideSelfPanel();void ExitSelfPanel();void AdvanceLoadPanel(FName PanelName);void ShowUIPanel(FName PanelName);void HideUIPanel(FName PanelName);void ExitUIPanel(FName PanelName);protected:// 显示 UI 方法名static FName ShowUIPanelName;// 隐藏 UI 方法名static FName HideUIPanelName;// 销毁 UI 方法名static FName ExitUIPanelName;// 预加载方法名static FName AdvanceLoadPanelName;protected:DDOBJFUNC_ONE(OperatorUIPanel, FName, PanelName);DDPanelWidge.cpp FName UDDPanelWidget::ShowUIPanelName(TEXT(ShowUIPanel));FName UDDPanelWidget::HideUIPanelName(TEXT(HideUIPanel));FName UDDPanelWidget::ExitUIPanelName(TEXT(ExitUIPanel));FName UDDPanelWidget::AdvanceLoadPanelName(TEXT(AdvanceLoadPanel));void UDDPanelWidget::ShowSelfPanel() {ShowUIPanel(GetObjectName()); }void UDDPanelWidget::HideSelfPanel() {HideUIPanel(GetObjectName()); }void UDDPanelWidget::ExitSelfPanel() {ExitUIPanel(GetObjectName()); }void UDDPanelWidget::AdvanceLoadPanel(FName PanelName) {OperatorUIPanel(UIFrameModuleIndex, UIFrameName, AdvanceLoadPanelName, PanelName); }void UDDPanelWidget::ShowUIPanel(FName PanelName) {OperatorUIPanel(UIFrameModuleIndex, UIFrameName, ShowUIPanelName, PanelName); }void UDDPanelWidget::HideUIPanel(FName PanelName) {OperatorUIPanel(UIFrameModuleIndex, UIFrameName, HideUIPanelName, PanelName); }void UDDPanelWidget::ExitUIPanel(FName PanelName) {OperatorUIPanel(UIFrameModuleIndex, UIFrameName, ExitUIPanelName, PanelName); }最后再改一些地方的错误。 DDTypes.h // 执行 Execute 方法之前必须手动调用 IsBound() 方法判定是否有绑定函数 templatetypename RetType, typename... VarTypes RetType DDCallHandleRetType, VarTypes...::Execute(VarTypes... Params) {// 删除原来的 是否绑定 判断return MsgQuene-ExecuteRetType, VarTypes...(CallName, Params...); }DDDriver.cpp #if WITH_EDITOR void ADDDriver::PostEditChangeProperty(FPropertyChangedEvent PropertyChangedEvent) {Super::PostEditChangeProperty(PropertyChangedEvent);if (PropertyChangedEvent.Property PropertyChangedEvent.Property-GetFName() GET_MEMBER_NAME_CHECKED(ADDDriver, ModuleType)) {Center-IterChangeModuleType(Center, ModuleType);} } #endif// 下面这两个方法要放在预编译的 #if WITH_EDITOR 之外笔者检查的时候已经是放在外面的了应该是在前面的课程也有提到这个修改 void ADDDriver::ExecuteFunction(DDModuleAgreement Agreement, DDParam* Param) {Center-AllotExecuteFunction(Agreement, Param); }void ADDDriver::ExecuteFunction(DDObjectAgreement Agreement, DDParam* Param) {Center-AllotExecuteFunction(Agreement, Param); }最后我们来看一下梁迪老师的 DataDriven 框架实现了如下功能 模块化树状结构适合分模块多人合作开发更多生命周期函数反射事件系统零耦合, 调用方便注册事件系统零耦合, 运行效率高, 适合大批量调用时使用协程系统全面实现 Unity 协程的功能延时事件系统多按键绑定系统资源同异步加载系统UI 框架 至于坦克大战应该是没有的了。不过能系统地学习梁迪老师的这个框架相信读者也能收获到很多。笔者在此衷心感谢梁迪老师的优质课程 : )
http://www.pierceye.com/news/978747/

相关文章:

  • 珠海哪家做企业网站公司好网站开发常用图标 图像
  • 上海先进网站设计丹阳如何做百度的网站
  • dw免费网站模板下载ui设计培训课程
  • 襄城县城乡建设管理局网站网站推广要具备什么
  • 用vue做网站的实例wordpress redis缓存
  • dedecms模板站源码wordpress上传主题错误
  • 网站需求方案手机网站加载效果
  • 国外空间网站源码网站电子备案
  • 最好网站建设公司运营团队南山医院网站建设
  • 微小店网站建设官网杭州网站设计上市公司
  • 合肥装饰公司做的好的网站采购销售管理软件
  • wordpress做后端wordpress的seo优化
  • 学术会议网站怎么做教学工作总结
  • 可以在线做试卷的网站互联网营销与管理
  • 国际重大新闻湛江做网站优化
  • 做app的模板下载网站有哪些长春网上建设网站
  • 建网站多少钱 万户项目管理软件手机版
  • 福州做网站需要多少钱win10 安装wordpress
  • 网站建设大约需要多少钱软文推广平台排名
  • 开发公司 网站建设价格seo优化排名怎么做
  • 网站开发如何使用微信登录鞍山专业做网站公司
  • 电子商务网站建设设计报告关于网站建设的指标
  • 电子商务网站建设实训展示网络技术就业方向
  • 乐清装修网站哪个好wordpress文章商品模板
  • 可以做超链接或锚文本的网站有哪些张店网站制作哪家好
  • 企业商城网站建设价格怎么自己建立公司网站
  • 网站上的广告怎么做工业设计是什么
  • 制作网站用c#做前台设计师合作网站
  • 做网站具体流程wordpress octopress
  • 怎么样增加网站权重图片wordpress博客