UE4 从无到有纯 C++ & Slate 开发沙盒游戏(二) 添加Slate到界面
因为要用到Slate框架,写 Slate 需要先在 SlAiCourse.Build.cs 中添加 Slate 模组
Slate
SlateCore
1 // Copyright Epic Games, Inc. All Rights Reserved. 2 3 using UnrealBuildTool; 4 5 public class SlAiCourse : ModuleRules 6 { 7 public SlAiCourse(ReadOnlyTargetRules Target) : base(Target) 8 { 9 PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; 10 11 PublicDependencyModuleNames.AddRange(new string[] 12 { 13 "Core", 14 "CoreUObject", 15 "Engine", 16 "InputCore", 17 "Slate", 18 "SlateCore" 19 }); 20 21 PrivateDependencyModuleNames.AddRange(new string[] { }); 22 23 // Uncomment if you are using Slate UI 24 // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); 25 26 // Uncomment if you are using online features 27 // PrivateDependencyModuleNames.Add("OnlineSubsystem"); 28 29 // To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true 30 } 31 }
把 HUD 和 Controller 加到 GamePlay 框架中
GameMode类
SlAiMenuGameMode.h
#include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "SlAiMenuGameMode.generated.h" /** * */ UCLASS() class SLAICOURSE_API ASlAiMenuGameMode : public AGameModeBase { GENERATED_BODY() public: ASlAiMenuGameMode(); };
SlAiMenuGameMode.cpp
#include "GamePlay/SlAiMenuGameMode.h" #include "UI/HUD/SlAiMenuHUD.h" #include "GamePlay/SlAimenuController.h" ASlAiMenuGameMode::ASlAiMenuGameMode() { PlayerControllerClass = ASlAiMenuController::StaticClass(); //PlayerControllerClass 是这个GameMode类下边的属性,StaticClass是UE4通过反射自己创建的一个函数, HUDClass = ASlAiMenuHUD::StaticClass(); }
Controller类
SlAiMenuController.h
#include "CoreMinimal.h" #include "GameFramework/PlayerController.h" #include "SlAiMenuController.generated.h" /** * */ UCLASS() class SLAICOURSE_API ASlAiMenuController : public APlayerController { GENERATED_BODY() public: ASlAiMenuController(); //显示鼠标 protected: virtual void BeginPlay() override; //输入模式,UE4有4种输入模式,输入模式不能再构造函数里写 };
SlAiMenuController.cpp
#include "GamePlay/SlAiMenuController.h" ASlAiMenuController::ASlAiMenuController() { bShowMouseCursor = true; //显示鼠标 } void ASlAiMenuController::BeginPlay() { FInputModeUIOnly InputMode; //用于设置仅允许UI响应用户输入的输入模式的数据结构 InputMode.SetLockMouseToViewportBehavior(EMouseLockMode::LockAlways); //设置鼠标的显示,将鼠标锁在界面中 SetInputMode(InputMode); //将InputMode添加到 SetInputMode }
然后这里编译运行一下,吧Slate组件加载一下。
Level 的HUD已经绑定了,Controller 也绑定了
新建SlateWidget类来写UI
SSlAiMenuWidget.h 放置到 UI\Widget 下
SSlAiMenuHUDWidget.h 放置到 UI\Widget 下
类添加完后,运行编译一下,让Slate组件调用一下,避免运行UE4时报错
添加一个 Widget,需要先添加一个 Widget,然后 AddViewport
先在HUD类下操作
SlAiMenuHUD.h
#include "CoreMinimal.h" #include "GameFramework/HUD.h" #include "SlAiMenuHUD.generated.h" /** * */ UCLASS() class SLAICOURSE_API ASlAiMenuHUD : public AHUD { GENERATED_BODY() public: ASlAiMenuHUD(); TSharedPtr<class SSlAiMenuHUDWidget> MenuHUDWidget; //声明一个 TSharedPtr 类指针 };
SlAiMenuHUD.cpp
#include "UI/HUD/SlAiMenuHUD.h" #include "UI/Widget/SSlAiMenuHUDWidget.h" #include "SlateBasics.h" ASlAiMenuHUD::ASlAiMenuHUD() { //创建 MenuHUDWidget,并把他AddViewport if (GEngine && GEngine->GameViewport) { /* 创建Widget,吧MenuHUDWidget指针传进去,和一个对应的Widget类 创建SlateWidget的两个方式 SNew() SAssignNew() SNew(类) 直接添加类名就好,返回的是一个共享指针 SAssignNew(共享指针,指针对应的类) 不返回共享指针,一般用在把创建的widget保存在一个指针里面的时候用这个 这两个只能创建继承于SlateWidget的类 */ SAssignNew(MenuHUDWidget, SSlAiMenuHUDWidget); //创建,如果MenuHUDWidget.ToSharedRef()资源存在的话,就把资源添加到SweakWidget里 GEngine->GameViewport->AddViewportWidgetContent(SNew(SWeakWidget).PossiblyNullContent(MenuHUDWidget.ToSharedRef())); } }
然后把实例化的MenuHUDWidget添加到GameViewport,然后再MenuHUDWidget中显示一个按钮
#include "UI/Widget/SSlAiMenuHUDWidget.h" #include "SlateOptMacros.h" #include "Widgets/Input/SButton.h" BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION void SSlAiMenuHUDWidget::Construct(const FArguments& InArgs) { ChildSlot //ChildSlot 是层级一样的东西 [ SNew(SButton) ]; } END_SLATE_FUNCTION_BUILD_OPTIMIZATION