《Unreal Engine 4 Scriptingwith C++ Cookbook》翻譯 之 第二章:創建類 2. 創建一個UCLASS - 派生自UObject

使用C ++進行編碼時,您可以擁有自己的代碼,這些代碼可以編譯並作爲本機C ++代碼運行,並帶有對new和delete的適當調用以創建和銷燬您的自定義對象。 只要您的new和delete調用正確配對,就可以在UE4項目中完全接受本機C ++代碼,以使C ++代碼中不存在泄漏。
但是,您也可以通過將自定義C ++對象聲明爲UCLASS來聲明自定義C ++類,其行爲類似於UE4類。 UCLASS根據智能指針規則使用UE4的智能指針和內存管理例程進行分配和釋放,可以由UE4編輯器加載和讀取,也可以選擇從藍圖進行訪問。
tips:請注意,使用UCLASS宏時,必須由UE4完全管理UCLASS對象的創建和銷燬:必須使用ConstructObject創建對象的實例(不是C++原生關鍵字new),然後調用UObject :: ConditionalBeginDestroy() 銷燬對象(不是C ++原生關鍵字delete)。本章稍後的實例化UObject派生類(ConstructObject <>和NewObject <>)和銷燬UObject派生的類中概述瞭如何創建和銷燬UObject派生類。

  • 準備工作:
    在本小節中,我們將概述如何編寫一個使用UCLASS宏來啓用託管內存分配和釋放以及允許從UE4編輯器和藍圖進行訪問的C++類。 您需要一個UE4項目,可以在其中添加新代碼來使用此方案。
  • 如何做:
    要創建自己的UObject派生類,請按照以下步驟操作:
    1. 在運行的項目中,在UE編輯器中選擇“文件 | 添加C++類”。
    2. 在出現的“添加C ++類”對話框中,轉到窗口的右上角,然後選中“顯示所有類”複選框:
    3. 通過選擇從Object父類派生來創建UCLASS。 UObject是UE4層次結構的根。 必須選中此對話框右上角的“顯示所有類”複選框,對象類才能出現在列表視圖中。
    4. 選擇“對象”(在層次結構的頂部)作爲要從其繼承的父類,然後單擊“下一步”。
      tips:請注意,儘管對象將被寫在對話框中,但是在您的C ++代碼中,您將派生的C ++類實際上是帶有大寫U的UObject。這是UE4的命名約定:從UObject派生的UCLASS(在Actor以外的分支上)必須以前導U命名。源自Actor的UCLASS必須以前導A命名(第4章,Actor和Components)。獨立的C ++類(不是UCLASS)沒有命名約定,但是可以根據需要使用前導F(例如FAssetData)進行命名。即使UObject的直接派生包含可視化表示元素(例如UStaticMeshes),也不能進行關卡放置。如果要將對象放置在UE4關卡內,則必須至少派生自Actor類或它在繼承層次結構中的下面。有關如何從可放置關卡對象的Actor類派生的信息,請參見第4章,Actor和Components。本章的示例代碼無法放置在關卡中,但是您可以基於我們在UE4編輯器中本章編寫的C ++類創建和使用藍圖。
    5. 將新的Object派生類命名爲適合您所創建的對象類型的名稱。 我稱呼我的爲UserProfile。 在UE4生成的C ++文件中的類的命名中,這以UUserObject的形式出現,以確保遵循UE4約定(C ++ UCLASS前面帶有前導U)。
    6. 轉到Visual Studio,並確保您的類文件具有以下格式:
      #pragma once
      #include "Object.h" // For deriving from UObject
      #include "UserProfile.generated.h" // Generated code
      // UCLASS macro options sets this C++ class to be 
      // Blueprintable within the UE4 Editor
      UCLASS( Blueprintable )
      class CHAPTER2_API UUserProfile : public UObject
      {
      	GENERATED_BODY()
      };
      
    7. 編譯並運行您的項目。 現在,您可以在Visual Studio中和UE4編輯器中使用自定義UCLASS對象。 有關如何使用它的更多詳細信息,請參見以下小節。
  • 有什麼用:
    UE4爲您的自定義UCLASS生成並管理大量代碼。 由於使用了UE4宏(如UPROPERTY,UFUNCTION和UCLASS宏本身)而生成了此代碼。 生成的代碼被放入UserProfile.genic.h。 您必須在UCLASSNAME.h文件中包含#UCLASSNAME.genic.h文件,編譯才能成功。 如果不包括UCLASSNAME.genic.h文件,編譯將失敗。 UCLASSNAME.genic.h文件必須作爲UCLASSNAME.h中的#include列表中的最後一個#include包括在內:
    正確:
    #pragma once
    #include "Object.h"
    #include "Texture.h"
    // CORRECT: .generated.h last 
    file
    #include 
    "UserProfile.generated.h"
    
    錯誤:
    #pragma once
    #include "Object.h"
    #include 
    "UserProfile.generated.h" 
    // WRONG: NO INCLUDES AFTER
    // .GENERATED.H FILE
    #include "Texture.h"
    
    包含列表中最後沒有包含UCLASSNAME.genic.h文件時發生的錯誤如下:
    >> #include found after .generated.h file - the .generated.h file should always be the last #include in a header
  • 更多內容:
    我們想在這裏討論很多關鍵字,這些關鍵字會修改UCLASS的行爲方式。 UCLASS可以標記如下:
    1. Blueprintable(可藍圖化):這意味着您希望能夠從UE4編輯器中的類查看器中構造一個藍圖(當您單擊鼠標右鍵時,“創建藍圖類…”將變爲可用)。 沒有Blueprintable關鍵字,即使您可以在Class Viewer中找到它並右鍵單擊,也無法爲您的UCLASS使用Create Blueprint Class…選項。
    2. 僅當在UCLASS宏定義中指定Blueprintable時,“創建藍圖類…”選項纔可用。 如果您未指定Blueprintable,那麼生成的UCLASS將不是Blueprintable。
    3. BlueprintType:使用此關鍵字表示UCLASS可用作另一個Blueprint中的變量。 您可以從任何藍圖的EventGraph的左側面板中的“變量”組創建藍圖變量。 如果指定了NotBlueprintType,那麼您將不能將此Blueprint變量類型用作“藍圖”圖中的變量。 在類查看器中右鍵單擊UCLASS名稱將不會在其上下文菜單中顯示“創建藍圖類…”:

      可以將任何指定了BlueprintType的UCLASS作爲變量添加到Blueprint類圖的變量列表中。
      您可能不確定是否將C ++類聲明爲UCLASS。 真的取決於您。 如果您喜歡智能指針,您可能會發現UCLASS不僅使代碼更安全,而且使整個代碼庫更加一致和統一。
  • 另請參見:
    要將其他可編程UPROPERTYTY添加到“藍圖”圖中,請參見下面的“創建一個用戶可編輯的UPROPERTY”部分。 有關使用適當的智能指針引用UCLASS實例的詳細信息,請參閱第3章,內存管理和智能指針。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章