RPG66.制作死亡画面(二):实现按钮逻辑
1.在玩家死亡后,面板里将会有“重来”的选项。计划用这个按钮打开新的level。但是考虑到将来需要在许多不同的地图内选择“重来”,这时候我们需要选择的关卡就不能是一个固定的值,我们需要在一个地方可以选择这一个值。
“游戏实例(GameInstance)是一个很好的地方,它的生命周期与启动游戏后 游戏的生命周期相同。
创建一个gameinstance的c++类
创建完后,我们需要在函数库里写获取当前level实例的方法
打开xmbwarriorlibrary
//访问游戏实例UFUNCTION(BlueprintPure, Category = "XMBWorrior|FunctionLibrary",meta = (WorldContext = "WorldContextObject"))static UXMBGameInstance* GetXMBGameInstance(const UObject* WorldContextObject);
UXMBGameInstance* UXMBWarriorFunctionLibrary::GetXMBGameInstance(const UObject* WorldContextObject)
{if (GEngine){if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject,EGetWorldErrorMode::LogAndReturnNull)){return World->GetGameInstance<UXMBGameInstance>();}}return nullptr;
}
启动项目,创建刚刚创建的游戏实例的子类蓝图
然后在项目设置里搜索gameinstance
2。回到游戏实例的代码
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
#include "Engine/GameInstance.h"
#include "XMBGameInstance.generated.h"//
USTRUCT(Blueprintable)
struct FXMBGameLevelSet
{GENERATED_BODY()//关卡标签UPROPERTY(EditDefaultsOnly,meta = (Categories = "GameData.Level"))FGameplayTag LevelTag;//关卡引用UPROPERTY(EditDefaultsOnly)TSoftObjectPtr<UWorld> Level;//判断tag是否有效bool IsValid() const{return LevelTag.IsValid() && !Level.IsNull();}};/*** */
UCLASS()
class ARPG_GRIVITY_API UXMBGameInstance : public UGameInstance
{GENERATED_BODY()public://通过标签获取关卡UFUNCTION(BlueprintPure, meta = (gameplaytagfilter = "GameData.Level"))TSoftObjectPtr<UWorld> GetGameLevelByTag(FGameplayTag InTag) const;protected://在引擎中为其分配有效的关卡信息UPROPERTY(EditDefaultsOnly,BlueprintReadOnly)TArray<FXMBGameLevelSet> GameLevelSets;};
// Fill out your copyright notice in the Description page of Project Settings.#include "GameInstance/XMBGameInstance.h"TSoftObjectPtr<UWorld> UXMBGameInstance::GetGameLevelByTag(FGameplayTag InTag) const
{//通过循环从数组内查找当前的关卡for (const FXMBGameLevelSet& GameLevelSet : GameLevelSets){if (!GameLevelSet.IsValid()) continue;if (GameLevelSet.LevelTag == InTag){return GameLevelSet.Level;}}return TSoftObjectPtr<UWorld>();}
再创建两个tag
/* Game Data tags */ARPG_GRIVITY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(GameData_Level_SurvialGameModeMap);ARPG_GRIVITY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(GameData_Level_MainMenuMap);
/* Game Data tags */UE_DEFINE_GAMEPLAY_TAG(GameData_Level_SurvialGameModeMap, "GameData.Level.SurvialGameModeMap");UE_DEFINE_GAMEPLAY_TAG(GameData_Level_MainMenuMap, "GameData.Level.MainMenuMap");
打开WarriorEnumTypes,我们需要创建一个枚举用来设置玩家的输入状态
UENUM(BlueprintType)
enum class EXMBInputMode : uint8
{GameOnly,UIOnly
};
打开library
//重启后设置玩家的inputmodeUFUNCTION(BlueprintCallable, Category = "XMBWorrior|FunctionLibrary",meta = (WorldContext = "WorldContextObject"))static void ToggleInputMode(EXMBInputMode InInputMode,const UObject* WorldContextObject);
void UXMBWarriorFunctionLibrary::ToggleInputMode(EXMBInputMode InInputMode, const UObject* WorldContextObject)
{APlayerController* PlayerController = nullptr;if (GEngine){if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject,EGetWorldErrorMode::LogAndReturnNull)){//获取玩家控制器PlayerController = World->GetFirstPlayerController();}}if (!PlayerController){return;;}//设置输入模式FInputModeGameOnly GameOnlyMode;FInputModeGameOnly UIOnlyMode;switch (InInputMode){case EXMBInputMode::GameOnly:PlayerController->SetInputMode(GameOnlyMode);PlayerController->bShowMouseCursor = false;break;case EXMBInputMode::UIOnly:PlayerController->SetInputMode(UIOnlyMode);PlayerController->bShowMouseCursor = true;break;default:break;}}
启动项目,进入losescreen设置
进入gameinstance进行设置