<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      UE4 中通過單例類實現全局數據管理

      前言

      單例模式(Singleton Pattern)是最簡單的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

      一、前期準備

      Unreal Engine 4.25.4

      Visual Studio 2019

      新建空白關卡和對應的用戶控件。如何新建關卡可以參考以下視頻
      新關卡一片黑?初學者必知的UE4新建關卡時的一些設置【虛幻引擎】

      控件 UI 的擺放如下圖所示,一個藍色按鈕和一個紅色按鈕,下面對應是藍色方和紅色方的比分。

      控件 UI

      然后修改關卡藍圖,將 UMG 添加到視口。

      關卡藍圖

      最后啟動運行關卡,預期能看到以下畫面。

      啟動關卡

      二、C++ 代碼

      新建 C++ 類,注意需要打開 顯示所有類,繼承自 Object 父類,并將生成的類命名為 Singleton,如下圖所示。

      單例 選擇父類

      單例 控件類命名

      編輯源碼如下,需要注意的是由于反射機制, ue4 中的構造函數沒辦法轉為私有。

      // Singleton.h
      #pragma once
      
      #include "CoreMinimal.h"
      #include "UObject/NoExportTypes.h"
      #include "HAL/ThreadingBase.h"
      #include "Singleton.generated.h"
      
      /**
       *
       */
      UCLASS(BlueprintType, Blueprintable)
      class SINGLETONOBJECT_API USingleton : public UObject
      {
          GENERATED_BODY()
      
      public:
          UFUNCTION(BlueprintCallable) // 藍圖可調用
              static USingleton* GetSingletonObjectIns();
      
          UFUNCTION(BlueprintCallable)
              void InitializeObject(); // 初始化
      
          UFUNCTION(BlueprintCallable)
              void AddBlueScore();
      
          UFUNCTION(BlueprintCallable)
              int GetBlueScore();
      
          UFUNCTION(BlueprintCallable)
              void AddRedScore();
      
          UFUNCTION(BlueprintCallable)
              int GetRedScore();
      
      private:
          static FCriticalSection Mutex;          // 鎖
          static USingleton* SingletonInstance;
      
          int BlueScore;
          int RedScore;
      
      };
      
      // Singleton.cpp
      #include "Singleton.h"
      
      USingleton* USingleton::GetSingletonObjectIns()
      {
          FScopeLock ScopeLock(&Mutex);
          if (SingletonInstance == nullptr)
          {
              SingletonInstance = NewObject<USingleton>();
              SingletonInstance->InitializeObject();
          }
          return SingletonInstance;
      }
      
      void USingleton::InitializeObject()
      {
          this->BlueScore = 0;
          this->RedScore = 0;
      }
      
      void USingleton::AddBlueScore()
      {
          ++this->BlueScore;
      }
      
      int USingleton::GetBlueScore()
      {
          return this->BlueScore;
      }
      
      void USingleton::AddRedScore()
      {
          ++this->RedScore;
      }
      
      int USingleton::GetRedScore()
      {
          return this->RedScore;
      }
      

      實現單例類后,我們還需要繼承實現 GameInstance,這是必要的一步,因為 GameInstance 的生命周期貫穿游戲始終,否則單例類變量會在關卡切換是被系統銷毀回收。以下演示了如何新建一個 GameInstance,并且將單例類作為其的私有屬性成員。

      GameInstance 選擇父類

      GameInstance 控件類命名

      // MyGameInstance.h
      #pragma once
      
      #include "CoreMinimal.h"
      #include "Engine/GameInstance.h"
      #include "Singleton.h"
      #include "MyGameInstance.generated.h"
      
      /**
       *
       */
      UCLASS()
      class SINGLETONOBJECT_API UMyGameInstance : public UGameInstance
      {
          GENERATED_BODY()
      
      public:
          UMyGameInstance();
      
          UFUNCTION()
              void StartGameInstance();
      
      private:
          USingleton* GlobalGameData;
      };
      
      // MyGameInstance.cpp
      #include "MyGameInstance.h"
      
      FCriticalSection USingleton::Mutex;
      USingleton* USingleton::SingletonInstance = nullptr;
      
      UMyGameInstance::UMyGameInstance()
      {
          GlobalGameData = USingleton::GetSingletonObjectIns();
      }
      
      void UMyGameInstance::StartGameInstance()
      {
          Super::StartGameInstance();
      }
      

      三、藍圖引用單例類

      編寫完成單例類后,具體該如何調用呢?

      有兩種方式,一種是 C++ 代碼調用,另一種是藍圖調用。

      C++ 調用很簡單,一行代碼即可。

      USingleton* SIngletonRef = USingleton::GetSingletonObjectIns();
      

      接下來展示如何通過外部藍圖調用,在空間藍圖中編寫邏輯如下。

      藍色按鈕邏輯修改

      紅色按鈕邏輯修改

      編寫完成后,保存并編譯,接下來啟動關卡,預期效果如下圖所示。每點擊一次藍色按鈕,藍色比分加一;每點擊一次紅色按鈕,紅色比分加一。

      紅藍比分

      參考文獻

      1. Global Data Access, Data Storage Class Accessible From Any CPP or BP Class During Runtime - Old UE4 Wiki
      2. UE4[C++]在虛幻引擎實現單例模式 - 知乎
      3. [UE4]線程鎖FScopeLock用法_玄冬Wong的博客-CSDN博客
      posted on 2023-02-16 16:17  孤舟掠影  閱讀(506)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 精品国产污污免费网站入口| 在线看免费无码的av天堂| 国产尤物精品自在拍视频首页 | 久久久久国色av免费观看性色| 国产91小视频在线观看| 国产69成人精品视频免费| jizz国产免费观看| 精品中文人妻中文字幕| 欧洲精品码一区二区三区| 72种姿势欧美久久久久大黄蕉| 国产蜜臀久久av一区二区| 欧美性69式xxxx护士| 国产av午夜精品福利| 国产啪视频免费观看视频| 色综合热无码热国产| 无码免费大香伊蕉在人线国产| 最新精品国偷自产在线| 人妻精品动漫H无码中字| 色爱av综合网国产精品| 亚洲中文字幕在线精品一区| 国产精品视频一区不卡| 四虎影视www在线播放| 欧美高清精品一区二区| 亚洲国产欧美一区二区好看电影| 一区二区三区AV波多野结衣| 91亚洲国产三上悠亚在线播放| 国产午夜福利不卡在线观看| 亚洲国产成人精品av区按摩| 国产精品人成视频免| 久久精品99国产精品亚洲| 久爱无码精品免费视频在线观看| 亚洲中文无码av永久不收费| 99中文字幕精品国产| 青草视频在线观看视频| av一本久道久久综合久久鬼色| 人妻系列中文字幕精品| 克东县| 色色97| 欧美一区二区三区啪啪| 东方av四虎在线观看| 国产粉嫩区一区二区三区|