目录
一、目的、参考:
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
https://blog.csdn.net/qq_40544338/article/details/105497594#8%E3%80%81UE4%E7%9A%84Gameplay%E6%A1%86%E6%9E%B6
①总结:good:介绍了写这个系列博客的目的、参考,不了解的可以查看一下
①在Content下面新建Map文件夹。
②在Map文件夹下面,创建地图:MenuMap
③项目设置里面修改Map
①创建名字为SlAiMenuGameMode的GameModeBase的C++类
②新建Player Controller的C++类:SlAiMenuController
③新建HUD的C++类:SlAiMenuHUD
④编辑器中设置GameMode:
①添加Slate和SlateCore的Module
//添加模块
PublicDependencyModuleNames.AddRange(new string[]
{
"Core",
"CoreUObject",
"Engine",
"InputCore",
"Slate",//Slate模块
"SlateCore"//SlateCore模块
});
①GENERATED_BODY()和GENERATED_UCLASS_BODY()
②4.17之后就基本使用GENERATED_BODY,如果使用这个函数,少了一些构造函数的步骤
③如果使用GENERATED_UCLASS_BODY,那么构造函数就需要如图添加一些内容(可能是比较麻烦,所以4.17之后就将其不用了)
①添加构造函数
UCLASS()
class SLAICOURSE_API ASlAiMenuGameMode : public AGameModeBase
{
GENERATED_BODY() //4.17之后就基本使用GENERATED_BODY,如果使用这个函数,少了一些构造函数的步骤
//GENERATED_UCLASS_BODY() //如果使用GENERATED_UCLASS_BODY,那么构造函数就需要如图添加一些内容(可能是比较麻烦,所以4.17之后就将其不用了)
public:
ASlAiMenuGameMode();//构造函数
};
①StaticClass:通过T::StaticClass()获得对应类的UClass的完整代码调用
ASlAiMenuGameMode::ASlAiMenuGameMode()
{
//通过T::StaticClass()获得对应类的UClass的完整代码调用
PlayerControllerClass = ASlAiMenuController::StaticClass();//世界设置中PlayerControllerClass选择为ASlAiMenuController
HUDClass = ASlAiMenuHUD::StaticClass();//世界设置中HUDClass选择为ASlAiMenuHUD
}
①构造函数:
②输入模式:
// 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;//虚函数重载:开始游戏;
};
①显示鼠标:
②输入模式:重写一下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);
}
①此时GameMode里面的一些选项就自动绑定了,
③但是我运行的时候发现鼠标有时候在外面有时候在里面 ,只有鼠标连续左键点击很多下才能让鼠标一直在游戏框中
①创建C++类:SlAiMenuHUDWidget
①创建SlateWidget的俩种方式
①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 MenuHUDWidget;
};
// 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()));
}
}
①中括号是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
③运行:可以看到按钮占据了整个屏幕,所以添加按钮是全屏的