马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册帐号
x
本节主要讲解游戏的起始页,登录页,注册页的实现。主要讲解的知识点是C++如何使用UMG做界面开发和UE4如何实现HTTP通讯及JSON的序列化和反序列化。视频教程链接可到蛮牛教育观看,详情链接点击:无尽之刃·文明1、起始页开发
1、创建蓝图版UserWidget
首先创建好UI目录,把UI素材导入到目录中。
创建起始页蓝图版的UserWidget,按照上述成品图设计即可。包含的元素如下:背景图片
Logo图片
开始游戏按钮
注册账号按钮
退出游戏按钮
版本信息文本
注意事项:设计UMG界面时特别需要注意锚点的使用以及布局面板的使用,起始页面使用的是
VerticalPanel对右面的Logo到版本信息进行了垂直布局。2、创建C++版UserWidget
首先我们要在Build.cs里面把UMG和Slate配置上去。
创建蓝图UserWidget的父类,让上面的蓝图继承之。因为我们要获取起始页面具体的按钮的引用来进一步对UMG的Widget进行操作。
根据上面的界面设计,我们在头文件中创建了三个UButton,分别表示开始游戏、注册游戏、退出游戏。我们希望这三个成员变量在子类蓝图UMG创建时自动初始化,因此我们重写UserWidget的Initialize()方法,在蓝图UMG初始化时自动初始化父类(UStartUserWidget)的三个按钮成员变量即可。
退出游戏按钮的事件非常的简单,因此我们这里在父类实现即可。添加OnClicked事件并实现退出游戏的逻辑。
综上,我们可以看出UMG的基本的开发思路,首先要设计好要展示的蓝图版的UMG,然后创建C++版的UserWidget,其成员变量/方法应是关于蓝图版的UMG的数据,以方便来使用蓝图版的UMG里面定义的控件。然后回到蓝图版的UMG让其父类继承之。
起始页头文件(StartUserWidget.h)/**
* 游戏开始界面
*/
UCLASS()
class INFINITYBLADE_API UStartUserWidget : public UUserWidget
{
GENERATED_BODY()
public:
/** 开始游戏按钮 */
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "UI")
UButton* StartBtn;
/** 注册游戏按钮 */
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "UI")
UButton* RegisterBtn;
/** 退出游戏按钮 */
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "UI")
UButton* ExitBtn;
public:
/** 创建UserWidget对象后执行的生命周期方法 */
virtual bool Initialize() override;
/** 初始化控件引用 */
void Init();
/** 退出游戏按钮点击事件 */
UFUNCTION()
void ExitBtnClickedEvent();
};
起始页cpp文件(StartUserWidget.cpp)#include "StartUserWidget.h"
/** 创建UserWidget对象后执行的生命周期方法 */
bool UStartUserWidget::Initialize()
{
if (!Super::Initialize())
{
return false;
}
/** 初始化控件的引用 */
Init();
return true;
}
/** 初始化控件引用 */
void UStartUserWidget::Init()
{
/** 初始化游戏开始按钮 */
StartBtn = Cast(GetWidgetFromName(TEXT("Button_Start")));
/** 初始化游戏注册按钮 */
RegisterBtn = Cast(GetWidgetFromName(TEXT("Button_Register")));
/** 初始化游戏退出按钮 */
ExitBtn = Cast(GetWidgetFromName(TEXT("Button_Exit")));
/** 设置退出游戏按钮的点击事件 */
ExitBtn->OnClicked.AddDynamic(this, &UStartUserWidget::ExitBtnClickedEvent);
}
/** 退出游戏按钮点击事件 */
void UStartUserWidget::ExitBtnClickedEvent()
{
/** 退出游戏 */
UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit);
}3、事件的监听
上面我们已经把退出游戏按钮的点击事件实现了,还有开始游戏和注册账号两个按钮的事件没有实现,此时,我们考虑一下MVC的设计模式以及高内聚低耦合的模式,我们应该把那两个按钮的事件放在哪里呢?
首先肯定是不能放到自己写的C++父类里面的,如果放在里面的话,我们首先要获取开始游戏页面和注册游戏页面的控件引用,这样就不符合低耦合的概念了。所以这里考虑UE4提供的Gameplay框架,我们首先是考虑放到了GameMode这个类里面。下面是游戏首页关卡的游戏模式类,该类里面拥有我们对于UI的处理逻辑。我们看到还有两个成员变量分别是登录页面和注册页面的UI,我们现在先暂时不考虑,下面会讲解这两个页面的开发。
我们首先看一下起始页面UI的初始化、开始游戏按钮的回调事件和注册游戏按钮的回调事件。初始化UStartUserWidget对象这里采用的静态加载LoadClass()方法,我们也可以创建游戏模式的蓝图,使用TSubclassOf的方式来加载,这里技术细节不具体赘述了。初始化完成后把该UMG添加到Viewport即可。
开始游戏按钮和注册游戏按钮只需要添加OnClicked事件即可。在这两个游戏按钮的点击事件上,我们动态的切换Viewport展示的UMG即可。
至此,我们已经把游戏起始页的基本功能完成了,这里只是粗略的赘述了一下,如果想更了解细节可以看源代码来自己手动实现。
首页游戏关卡的游戏模式类的头文件:EmptyGameMode.h/**
* 初始化关卡游戏模式
*/
UCLASS()
class INFINITYBLADE_API AEmptyGameMode : public AGameMode
{
GENERATED_BODY()
public:
/** 起始页面UI */
UPROPERTY()