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

原文链接:http://blog.csdn.net/u010153703/article/details/38062627

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

[cpp]  view plain  copy
  1. #pragma once  
  2. #include "SolusDataSingleton.h"  
  3. #include "SolusDataSingletonLibrary.generated.h"  
  4.   
  5. UCLASS()  
  6. class USolusDataSingletonLibrary : public UBlueprintFunctionLibrary  
  7. {  
  8.     GENERATED_UCLASS_BODY()  
  9.   
  10.     UFUNCTION(BlueprintPure, Category = "Solus Data Singleton")  
  11.     static USolusDataSingleton* GetSolusData(bool& IsValid);  
  12.   
  13.   
  14.     UFUNCTION(BlueprintCallable, Category = "VictoryBPLibrary")  
  15.     static FString GetHappyMessage();  
  16.   
  17.     UFUNCTION(BlueprintCallable, Category = "VictoryBPLibrary")  
  18.     static bool SaveStringTextToFile(FString SaveDirectory, FString FileName, FString SaveText, bool AllowOverWriting=false);  
  19.   
  20.     UFUNCTION(BlueprintCallable, Category = "ScreenResolution")  
  21.     static void GetDisplayAdapterScreenResolutions();  
  22. };  

.cpp

[cpp]  view plain  copy
  1. #include "MyThirdPersonCode.h"  
  2. #include "SolusDataSingletonLibrary.h"  
  3.   
  4. USolusDataSingletonLibrary::USolusDataSingletonLibrary(const class FPostConstructInitializeProperties& PCIP)  
  5. : Super(PCIP)  
  6. {  
  7.   
  8. }  
  9.   
  10. USolusDataSingleton* USolusDataSingletonLibrary::GetSolusData(bool& IsValid)  
  11. {  
  12.     IsValid = false;  
  13.     USolusDataSingleton* DataInstance = Cast<USolusDataSingleton>(GEngine->GameSingleton);  
  14.     if (!DataInstance)  
  15.     {  
  16.         return NULL;  
  17.     }  
  18.     if (!DataInstance->IsValidLowLevel())  
  19.     {  
  20.         return NULL;  
  21.     }  
  22.     IsValid = true;  
  23.     return DataInstance;  
  24. }  
  25.   
  26. FString USolusDataSingletonLibrary::GetHappyMessage()  
  27. {  
  28.     return FString("Victory! Give me a big Smile. Victory BP Works!");  
  29. }  
  30.   
  31. bool USolusDataSingletonLibrary::SaveStringTextToFile(FString SaveDirectory, FString FileName, FString SaveText, bool AllowOverWriting/* =false */)  
  32. {  
  33.     IPlatformFile& F = FPlatformFileManager::Get().GetPlatformFile();  
  34.     if (!F.DirectoryExists(*SaveDirectory))  
  35.     {  
  36.         F.CreateDirectoryTree(*SaveDirectory);  
  37.         if (!F.DirectoryExists(*SaveDirectory))  
  38.         {  
  39.             return false;  
  40.         }  
  41.     }  
  42.   
  43.     SaveDirectory += "\\";  
  44.     SaveDirectory += FileName;  
  45.   
  46.     if (!AllowOverWriting)  
  47.     {  
  48.         if (!F.FileExists(*SaveDirectory))  
  49.         {  
  50.             return false;  
  51.         }  
  52.     }  
  53.   
  54.     return FFileHelper::SaveStringToFile(SaveText, *SaveDirectory);  
  55. }  
  56.   
  57. DEFINE_LOG_CATEGORY_STATIC(MyLog, All, All)  
  58. void USolusDataSingletonLibrary::GetDisplayAdapterScreenResolutions()  
  59. {  
  60.     FScreenResolutionArray Resolutions;  
  61.     if (RHIGetAvailableResolutions(Resolutions, false))  
  62.     {  
  63.         for (const FScreenResolutionRHI& EachResolution : Resolutions)  
  64.         {  
  65.             FString disInfo = FString("X=") + FString::FromInt(EachResolution.Width) + FString(" Y=") + FString::FromInt(EachResolution.Height);  
  66.             GEngine->AddOnScreenDebugMessage(-1, 5.0, FColor::Blue, disInfo);  
  67.             UE_LOG(MyLog, Warning, TEXT("DefaultAdapter - %4d x %4d @ %d"), EachResolution.Width, EachResolution.Height, EachResolution.RefreshRate);  
  68.         }  
  69.     }  
  70.     else  
  71.     {  
  72.         GEngine->AddOnScreenDebugMessage(-1, 5.0, FColor::Blue, "Screen Resolutions could not be obtained");  
  73.         UE_LOG(MyLog, Error, TEXT("Screen Resolutions could not be obtained"));  
  74.     }  
  75. }  

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值