UE4纯C++与Slate开发沙盒游戏:2.添加Slate到界面

目录

一、目的、参考:

1、UE4纯C++与Slate开发沙盒游戏:1.项目介绍与资源获取

二、视频内容:

1、解压文件、然后打开uproject文件

2、地图

3、GamePlay框架

4、SlAiCourse.Build.cs

5、GENERATED_BODY()和GENERATED_UCLASS_BODY()的区别

6、SlAiMenuGameMode.h

7、SlAiMenuGameMode.cpp

8、SlAiMenuController.h

9、SlAiMenuController.cpp

10、运行

11、创建俩个Slate Widget:SlAiMenuHUDWidget和SlAiMenuWidget

12、创建SlateWidget的俩种方式、SlAiMenuHUD.h和SlAiMenuHUD.cpp

13、SlAiMenuHUD.h

14、SlAiMenuHUD.cpp

15、创建按钮:SSlAiMenuHUDWidget.cpp


一、目的、参考:

1、UE4纯C++与Slate开发沙盒游戏:1.项目介绍与资源获取

https://blog.csdn.net/qq_40544338/article/details/105497594#8%E3%80%81UE4%E7%9A%84Gameplay%E6%A1%86%E6%9E%B6

①总结:good:介绍了写这个系列博客的目的、参考,不了解的可以查看一下

二、视频内容:

1、解压文件、然后打开uproject文件

2、地图

①在Content下面新建Map文件夹。

②在Map文件夹下面,创建地图:MenuMap

③项目设置里面修改Map

3、GamePlay框架

①创建名字为SlAiMenuGameMode的GameModeBase的C++类

 

②新建Player Controller的C++类:SlAiMenuController

 

③新建HUD的C++类:SlAiMenuHUD

 

④编辑器中设置GameMode:

4、SlAiCourse.Build.cs

①添加Slate和SlateCore的Module

        //添加模块
        PublicDependencyModuleNames.AddRange(new string[]
        {
            "Core",
            "CoreUObject",
            "Engine",
            "InputCore",
            "Slate",//Slate模块
            "SlateCore"//SlateCore模块
        });

5、GENERATED_BODY()和GENERATED_UCLASS_BODY()的区别

①GENERATED_BODY()和GENERATED_UCLASS_BODY()

②4.17之后就基本使用GENERATED_BODY,如果使用这个函数,少了一些构造函数的步骤

③如果使用GENERATED_UCLASS_BODY,那么构造函数就需要如图添加一些内容(可能是比较麻烦,所以4.17之后就将其不用了)

6、SlAiMenuGameMode.h

①添加构造函数

UCLASS()
class SLAICOURSE_API ASlAiMenuGameMode : public AGameModeBase
{
	GENERATED_BODY()  //4.17之后就基本使用GENERATED_BODY,如果使用这个函数,少了一些构造函数的步骤
	//GENERATED_UCLASS_BODY()	//如果使用GENERATED_UCLASS_BODY,那么构造函数就需要如图添加一些内容(可能是比较麻烦,所以4.17之后就将其不用了)
	
public:
	ASlAiMenuGameMode();//构造函数
	
};

7、SlAiMenuGameMode.cpp

①StaticClass:通过T::StaticClass()获得对应类的UClass的完整代码调用

ASlAiMenuGameMode::ASlAiMenuGameMode()
{
	//通过T::StaticClass()获得对应类的UClass的完整代码调用
	PlayerControllerClass = ASlAiMenuController::StaticClass();//世界设置中PlayerControllerClass选择为ASlAiMenuController
	HUDClass = ASlAiMenuHUD::StaticClass();//世界设置中HUDClass选择为ASlAiMenuHUD
}

8、SlAiMenuController.h

①构造函数:

②输入模式:

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "SlAiMenuController.generated.h"

/**
 * 
 */
UCLASS()
class SLAICOURSE_API ASlAiMenuController : public APlayerController
{
	GENERATED_BODY()
	
public:
	ASlAiMenuController();//构造函数
	
protected:
	//在成员函数声明或定义中, override 确保该函数为虚函数并覆写来自基类的虚函数。
	virtual void BeginPlay() override;//虚函数重载:开始游戏;
};

9、SlAiMenuController.cpp

①显示鼠标:

②输入模式:重写一下BeginPlay

③AActor的生命周期:

 ④鼠标锁定:

// Fill out your copyright notice in the Description page of Project Settings.

#include "SlAiMenuController.h"

ASlAiMenuController::ASlAiMenuController()
{
	bShowMouseCursor = true;//显示鼠标
}

//虚函数重载:开始游戏;
void ASlAiMenuController::BeginPlay()
{
	//输入模式
	FInputModeUIOnly InputMode;
	InputMode.SetLockMouseToViewportBehavior(EMouseLockMode::LockAlways);//鼠标锁定在屏幕对话框里面
	SetInputMode(InputMode);
}

10、运行

①此时GameMode里面的一些选项就自动绑定了,

 ②单独开一个窗口播放游戏,此时鼠标就被锁定在游戏里面了。

③但是我运行的时候发现鼠标有时候在外面有时候在里面 ,只有鼠标连续左键点击很多下才能让鼠标一直在游戏框中

11、创建俩个Slate Widget:SlAiMenuHUDWidget和SlAiMenuWidget

①创建C++类:SlAiMenuHUDWidget

 ②创建C++类:SlAiMenuWidget

 

12、创建SlateWidget的俩种方式、SlAiMenuHUD.h和SlAiMenuHUD.cpp

①创建SlateWidget的俩种方式

13、SlAiMenuHUD.h

①TSharedPtr是虚幻自身实现的一套类似STD的共享指针,它的内部实现自动释放内存的机制是引用计数。

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/HUD.h"
#include "SlAiMenuHUD.generated.h"

/**
 * 
 */
UCLASS()
class SLAICOURSE_API ASlAiMenuHUD : public AHUD
{
	GENERATED_BODY()
	
public:
	ASlAiMenuHUD(); //构造函数

	//TSharedPtr是虚幻自身实现的一套类似STD的共享指针,它的内部实现自动释放内存的机制是引用计数。
	TSharedPtr<class SSlAiMenuHUDWidget> MenuHUDWidget;
	
};

14、SlAiMenuHUD.cpp

// Fill out your copyright notice in the Description page of Project Settings.

#include "SlAiMenuHUD.h"
#include "SSlAiMenuHUDWidget.h"
#include "SlateBasics.h"

ASlAiMenuHUD::ASlAiMenuHUD()
{
	//创建SlateWidget的方法:
	if (GEngine&&GEngine->GameViewport)
	{
		SAssignNew(MenuHUDWidget, SSlAiMenuHUDWidget);

		GEngine->GameViewport->AddViewportWidgetContent(SNew(SWeakWidget).PossiblyNullContent(MenuHUDWidget.ToSharedRef()));
	}

}


15、创建按钮:SSlAiMenuHUDWidget.cpp

①中括号是UE4的重载运算符,不是数组符号,

②创建按钮:

// Fill out your copyright notice in the Description page of Project Settings.

#include "SSlAiMenuHUDWidget.h"
#include "SlateOptMacros.h"
#include "SButton.h"

BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiMenuHUDWidget::Construct(const FArguments& InArgs)
{
	//创建按钮:
	//中括号是UE4的重载运算符,不是数组符号,
	ChildSlot
		[
			SNew(SButton)
		];
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

③运行:可以看到按钮占据了整个屏幕,所以添加按钮是全屏的


版权声明:本文为qq_40544338原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。