当前位置: 首页 > news >正文

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进行设置

http://www.dtcms.com/a/298282.html

相关文章:

  • 毕业论文参考文档(免费)—DHT11 温湿度传感器的硬件与软件系统设计
  • Pydantic 配置管理
  • vehicle_template | vehicle_seat_addon
  • 功能安全实战系列14-英飞凌TC3xx MBIST检测理论篇
  • 【大模型关键技术】Transformer 前沿发展
  • 模糊匹配fuzzywuzzy
  • c++文件操作详解
  • ubuntu安装cuda版本问题
  • 平时开发中使用 Redis 分布式锁,有哪些需要注意的问题?
  • Mysql 日志 binlog redolog
  • 基于springboot的剧本杀预约管理系统
  • Metaspace耗尽导致OOM问题
  • JAVA知识点(三):Spring与ORM框架
  • 【lucene】如何给StandardAnalyzer添加charfilter
  • HANA语法随手记:<> ‘NULL‘值问题
  • php算法-- 关联数组使用,优化sip账号去重
  • 验证 GitHub Pages 的自定义域(Windows)
  • 从混乱到秩序:IT服务管理如何重塑企业运营效率
  • CTF-Web题解:“require_once(‘flag.php‘); assert(“$i == $u“);”
  • C++ STL常用容器总结(vector, deque, list, map, set)
  • Schmidt 分解 ⚙️ 与 SVD 之间的本质联系
  • IDM:registered with a fake serial number
  • TDengine 转化函数 TO_UNIXTIMESTAMP 用户手册
  • 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费
  • Java 笔记 lambda
  • 多层感知机(深度学习-李沐-学习笔记)
  • 【WPS】office邮件合并,怎么将数据源excel中的下一条拼接在文档中的下一个位置
  • selenium 元素定位
  • 深入浅出设计模式——创建型模式之工厂模式
  • 机器学习(九):KNN算法全解析与项目实践