Fork me on GitHub

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

 

 

posted @ 2021-07-08 14:19  索智源  阅读(610)  评论(0编辑  收藏  举报