UE4里的全局变量,全局函数,便于工程里其他模块代码访问,以及Blueprint的访问

1. 单例

Unreal Engine的wiki上,Rama给了一个教程,教大家如何存储不常改变的全局数据,便于运行时从任何cpp或者Blueprint访问之。

https://wiki.unrealengine.com/Global_Data_Access,_Data_Storage_Class_Accessible_From_Any_CPP_or_BP_Class_During_Runtime!

要点如下:

1. 创建一个继承自UObject的class Single,需要标注UClass(Blueprintable, BlueprintType)。

    在创建的class Single里放置一些全局变量后,需要添加UFunction,实现全局访问数据的接口函数。

2. 最重要的是,运行工程后,在Editor里需要设置工程的单例。

     运行打开编辑器后,创建基于步骤1里的class Single的Blueprint, BP_MySingle;

     然后修改编辑器的配置参数:Project Settings->Engine->General, 将Game Singleton Class设置为你自己的单例BP: BP_MySingle!  注意,用的是基于class Single的Blueprint, 不是class Single本身!

单例更偏向于数据的存取和访问,而且是一些很少改变的数据。 如何处理那些全局的功能函数呢?


2. BlueprintFunctionLibrary

创建可以在任意BP里访问的功能函数。

创建一个继承自UBlueprintFunctionLibrary的class,  在其中声明你需要的功能函数。

UFUNCTION(BlueprintPure) or UFUNCTION(BlueprintCallable)声明。同时函数请设置为static属性。
若函数带有BlueprintPure属性,则说明此函数不会修改任何游戏状态,因此无需exec链的触发(在Blueprint中体现为没有白线输入),可以在任何时刻被调用获取其结果。

.h

#pragma once
#include "SolusDataSingleton.h"
#include "SolusDataSingletonLibrary.generated.h"

UCLASS()
class USolusDataSingletonLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_UCLASS_BODY()

	UFUNCTION(BlueprintPure, Category = "Solus Data Singleton")
	static USolusDataSingleton* GetSolusData(bool& IsValid);


	UFUNCTION(BlueprintCallable, Category = "VictoryBPLibrary")
	static FString GetHappyMessage();

	UFUNCTION(BlueprintCallable, Category = "VictoryBPLibrary")
	static bool SaveStringTextToFile(FString SaveDirectory, FString FileName, FString SaveText, bool AllowOverWriting=false);

	UFUNCTION(BlueprintCallable, Category = "ScreenResolution")
	static void GetDisplayAdapterScreenResolutions();
};

.cpp

#include "MyThirdPersonCode.h"
#include "SolusDataSingletonLibrary.h"

USolusDataSingletonLibrary::USolusDataSingletonLibrary(const class FPostConstructInitializeProperties& PCIP)
: Super(PCIP)
{

}

USolusDataSingleton* USolusDataSingletonLibrary::GetSolusData(bool& IsValid)
{
	IsValid = false;
	USolusDataSingleton* DataInstance = Cast<USolusDataSingleton>(GEngine->GameSingleton);
	if (!DataInstance)
	{
		return NULL;
	}
	if (!DataInstance->IsValidLowLevel())
	{
		return NULL;
	}
	IsValid = true;
	return DataInstance;
}

FString USolusDataSingletonLibrary::GetHappyMessage()
{
	return FString("Victory! Give me a big Smile. Victory BP Works!");
}

bool USolusDataSingletonLibrary::SaveStringTextToFile(FString SaveDirectory, FString FileName, FString SaveText, bool AllowOverWriting/* =false */)
{
	IPlatformFile& F = FPlatformFileManager::Get().GetPlatformFile();
	if (!F.DirectoryExists(*SaveDirectory))
	{
		F.CreateDirectoryTree(*SaveDirectory);
		if (!F.DirectoryExists(*SaveDirectory))
		{
			return false;
		}
	}

	SaveDirectory += "\\";
	SaveDirectory += FileName;

	if (!AllowOverWriting)
	{
		if (!F.FileExists(*SaveDirectory))
		{
			return false;
		}
	}

	return FFileHelper::SaveStringToFile(SaveText, *SaveDirectory);
}

DEFINE_LOG_CATEGORY_STATIC(MyLog, All, All)
void USolusDataSingletonLibrary::GetDisplayAdapterScreenResolutions()
{
	FScreenResolutionArray Resolutions;
	if (RHIGetAvailableResolutions(Resolutions, false))
	{
		for (const FScreenResolutionRHI& EachResolution : Resolutions)
		{
			FString disInfo = FString("X=") + FString::FromInt(EachResolution.Width) + FString(" Y=") + FString::FromInt(EachResolution.Height);
			GEngine->AddOnScreenDebugMessage(-1, 5.0, FColor::Blue, disInfo);
			UE_LOG(MyLog, Warning, TEXT("DefaultAdapter - %4d x %4d @ %d"), EachResolution.Width, EachResolution.Height, EachResolution.RefreshRate);
		}
	}
	else
	{
		GEngine->AddOnScreenDebugMessage(-1, 5.0, FColor::Blue, "Screen Resolutions could not be obtained");
		UE_LOG(MyLog, Error, TEXT("Screen Resolutions could not be obtained"));
	}
}






  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值