UE5.3 C++ CDO的初步理解

一.UObject

UObject是所有對象的基類,往上還有UObjectBaseUtility。

注釋:所有虛幻引擎對象的基類。對象的類型由基于?UClass 類來定義。
這為創建和使用UObject的對象提供了 函數,并且提供了應在子類中重寫的虛函數。

/** * The base class of all UE objects. The type of an object is defined by its UClass.* This provides support functions for creating and using objects, and virtual functions that should be overridden in child classes.* * @see https://docs.unrealengine.com/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Objects*/
class UObject : public UObjectBaseUtility

為 UObject 提供工具類的函數,不應直接使用此類。

/*** Provides utility functions for UObject, this class should not be used directly*/
class UObjectBaseUtility : public UObjectBase
{

為更底層接口提供給UObject,也不能直接使用

/** * Low level implementation of UObject, should not be used directly in game code */
class UObjectBase
{

反射系統直接,一般是收集UObject的信息。是在運行的時候,拿到運行的對象注冊的信息。將這個信息寫入對象的表,隨時可以取到,訪問。

二.UCLASS 宏的理解

The UCLASS Macro

The?UCLASS?macro gives the?UObject?a reference to a?UCLASS?that describes its Unreal-based type. Each?UCLASS?maintains one Object called the?Class Default Object(CDO). The CDO is essentially a default 'template' Object, generated by the class constructor and unmodified thereafter. Both the UCLASS and the CDO can be retrieved for a given Object instance, although they should generally be considered read-only. The UCLASS for an Object instance can be accessed at any time using the?GetClass()?function.

A?UCLASS?contains a set of properties and functions that define the class. These are normal C++ functions and variables available to standard C++ code, but tagged with Unreal Engine-specific metadata that controls how they behave within the Object system. For more details about the tagging syntax, refer to the?Programming

UCLASS宏為 UObject 提供一個對 UCLASS 的引用,而UCLASS描述了一個基于虛幻引擎的類型。 每個 UCLASS 都持有一個?類默認對象(Class Default Object)?,簡稱CDO。CDO 本質上是一個默認的 “模板” 對象,由類的構造函數生成,隨后保持不變。盡管UCLASS和CDO通常都會被看做是“只讀”的,但是每個Object實例都可以取得他們的UCLASS和CDO。你隨時都可以使用 GetClass() 函數來訪問Object實例的UCLASS。

UCLASS 包含了一套用于定義這個類的屬性和函數——他們就是原生的C++函數與變量,但被虛幻引擎特有的元數據所標記,它們在UObject系統中的行為也因此受到控制。如需了解標記語法的更多細節,請查閱?Programming Reference。

需要注意 UObject 類也可以包含?native-only(譯注:應該是指C++原生的,未被標記的屬性或函數),這些屬性不存在于相應的 UCLASS 中。

三.個人驗證解讀

重點是 類的構造函數生成,隨后保持不變。每個Object實例都可以取得他們的UCLASS和CDO。?原生的C++函數與變量,但被虛幻引擎特有的元數據所標記,它們在UObject系統中的行為也因此受到控制。

上測試代碼

// Sets default values
AMyActor::AMyActor():money(200)
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;RootComponent = CreateDefaultSubobject<USceneComponent>("Root");money = 300;
}int32 AMyActor::GetCurrentMoney()
{return money;
}int32 AMyActor::GetMyCDOMoney()
{UClass* GWXClass = AMyActor::StaticClass();UObject* MyObject = GWXClass->GetDefaultObject();AMyActor* MyCDO = Cast<AMyActor>(MyObject);  if (MyCDO){return MyCDO->money;}return -1;
}// Called when

GetCurrentMoney(),在編輯器上使用,會修改它的不同實例返回值。但使用GetMyCDOMoney(),通過CDO創建時,都是構造函數中的300。

因為藍圖的操作,反射等。都是通過構造函數后,重寫編譯寫在MyActor.gen.cpp文件中,CDO是默認的實例對象,不會改變。我們在編輯其中,修改。再在關卡藍圖里測試都是,通過了這個文件拿到后續再處理。甚至藍圖運行時,斷點都能打到這個文件上。說明藍圖其實就是從這里來的。由此我們可以初見,反射系統的神奇與巧妙。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67602.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67602.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67602.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pandas基礎06(異常值的檢測與過濾/抽樣/常用聚合函數/數據聚合)

Pandas基礎06 異常值的檢測與過濾 在數據分析中&#xff0c;異常值&#xff08;Outliers&#xff09;是指與其他數據點顯著不同的值。這些值可能由于數據錄入錯誤、設備故障或極端情況而產生&#xff0c;因此在進行數據分析之前&#xff0c;需要對其進行檢測與過濾。本文將介紹…

【PyTorch】4.張量拼接操作

個人主頁&#xff1a;Icomi 在深度學習蓬勃發展的當下&#xff0c;PyTorch 是不可或缺的工具。它作為強大的深度學習框架&#xff0c;為構建和訓練神經網絡提供了高效且靈活的平臺。神經網絡作為人工智能的核心技術&#xff0c;能夠處理復雜的數據模式。通過 PyTorch&#xff0…

jstat命令詳解

jstat 用于監視虛擬機運行時狀態信息的命令&#xff0c;它可以顯示出虛擬機進程中的類裝載、內存、垃圾收集、JIT 編譯等運行數據。 命令的使用格式如下。 jstat [option] LVMID [interval] [count]各個參數詳解&#xff1a; option&#xff1a;操作參數LVMID&#xff1a;本…

App.Current.Services.GetService<UserView>()無限循環

代碼無線循環 public partial class UserView : UserControl{public UserView(){InitializeComponent();InitData();}private void InitData(){DataContext App.Current.Services.GetService<UserView>();}} } DataContext App.Current.Services.GetService<User…

(動態規劃路徑基礎 最小路徑和)leetcode 64

視頻教程 1.初始化dp數組&#xff0c;初始化邊界 2、從[1行到n-1行][1列到m-1列]依次賦值 #include<vector> #include<algorithm> #include <iostream>using namespace std; int main() {vector<vector<int>> grid { {1,3,1},{1,5,1},{4,2,1}…

松靈機器人 scout ros2 驅動 安裝

必須使用 ubuntu22 必須使用 鏈接的humble版本 #打開can 口 sudo modprobe gs_usbsudo ip link set can0 up type can bitrate 500000sudo ip link set can0 up type can bitrate 500000sudo apt install can-utilscandump can0mkdir -p ~/ros2_ws/srccd ~/ros2_ws/src git cl…

pytorch基于GloVe實現的詞嵌入

PyTorch 實現 GloVe&#xff08;Global Vectors for Word Representation&#xff09; 的完整代碼&#xff0c;使用 中文語料 進行訓練&#xff0c;包括 共現矩陣構建、模型定義、訓練和測試。 1. GloVe 介紹 基于詞的共現信息&#xff08;不像 Word2Vec 使用滑動窗口預測&…

C++ 堆棧分配的區別

這兩種聲明方式有什么區別 1.使用 new 關鍵字動態分配內存 動態分配&#xff1a;使用 new 關鍵字會在堆&#xff08;heap&#xff09;上分配內存&#xff0c;并返回一個指向該內存位置的指針。生命周期&#xff1a;對象的生命周期不會隨著聲明它的作用域結束而結束&#xff0…

深入解析 Linux 內核中的頁面錯誤處理機制

在現代操作系統中,頁面錯誤(Page Fault)是內存管理的重要組成部分。當程序試圖訪問未映射到物理內存的虛擬內存地址時,CPU 會觸發頁面錯誤異常。Linux 內核通過一系列復雜的機制來處理這些異常,確保系統的穩定性和性能。本文將深入解析 Linux 內核中處理頁面錯誤的核心代碼…

MATLAB-Simulink并行仿真示例

一、概述 在進行simulink仿真的過程中常常遇到CPU利用率較低&#xff0c;仿真緩慢的情況&#xff0c;可以借助并行仿真改善這些問題&#xff0c;其核心思想是將參數掃描、蒙特卡洛分析或多工況驗證等任務拆分成多個子任務&#xff0c;利用多核CPU或計算集群的并行計算能力&…

Workbench 中的熱源仿真

探索使用自定義工具對移動熱源進行建模及其在不同行業中的應用。 了解熱源動力學 對移動熱源進行建模為各種工業過程和應用提供了有價值的見解。激光加熱和材料加工使用許多激光束來加熱、焊接或切割材料。盡管在某些情況下&#xff0c;熱源 &#xff08;q&#xff09; 不是通…

I2C基礎知識

引言 這里祝大家新年快樂&#xff01;前面我們介紹了串口通訊協議&#xff0c;現在我們繼續來介紹另一種常見的簡單的串行通訊方式——I2C通訊協議。 一、什么是I2C I2C 通訊協議&#xff08;Inter-Integrated Circuit&#xff09;是由Phiilps公司在上個世紀80年代開發的&#…

深度學習 DAY3:NLP發展史

NLP發展史 NLP發展脈絡簡要梳理如下&#xff1a; (遠古模型&#xff0c;上圖沒有但也可以算NLP&#xff09; 1940 - BOW&#xff08;無序統計模型&#xff09; 1950 - n-gram&#xff08;基于詞序的模型&#xff09; (近代模型&#xff09; 2001 - Neural language models&am…

CSS 背景與邊框:從基礎到高級應用

CSS 背景與邊框&#xff1a;從基礎到高級應用 1. CSS 背景樣式1.1 背景顏色示例代碼&#xff1a;設置背景顏色 1.2 背景圖像示例代碼&#xff1a;設置背景圖像 1.3 控制背景平鋪行為示例代碼&#xff1a;控制背景平鋪 1.4 調整背景圖像大小示例代碼&#xff1a;調整背景圖像大小…

HarmonyOS簡介:應用開發的機遇、挑戰和趨勢

問題 更多的智能設備并沒有帶來更好的全場景體驗 連接步驟復雜數據難以互通生態無法共享能力難以協同 主要挑戰 針對不同設備上的不同操作系統&#xff0c;重復開發&#xff0c;維護多套版本 多種語言棧&#xff0c;對人員技能要求高 多種開發框架&#xff0c;不同的編程…

【Linux】列出所有連接的 WiFi 網絡的密碼

【Linux】列出所有連接的 WiFi 網絡的密碼 終端輸入 sudo grep psk /etc/NetworkManager/system-connections/*會列出所有連接過 Wifi 的信息&#xff0c;格式類似 /etc/NetworkManager/system-connections/AAAAA.nmconnection:pskBBBBBAAAAA 是 SSID&#xff0c;BBBBB 是對…

如何使用tushare pro獲取股票數據——附爬蟲代碼以及tushare積分獲取方式

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、pandas是什么&#xff1f;二、使用步驟 1.引入庫2.讀入數據 總結 一、Tushare 介紹 Tushare 是一個提供中國股市數據的API接口服務&#xff0c;它允許用戶…

觀察者模式和訂閱發布模式的關系

有人把觀察者模式等同于發布訂閱模式&#xff0c;也有人認為這兩種模式存在差異&#xff0c;本質上就是調度的方法不同。 發布訂閱模式: 觀察者模式: 相比較&#xff0c;發布訂閱將發布者和觀察者之間解耦。&#xff08;發布訂閱有調度中心處理&#xff09;

linux 環境安裝 dlib 的 gpu 版本

默認使用 pip 安裝的 dlib 是不使用 gpu 的 在國內社區用百度查如何安裝 gpu 版本的 dlib 感覺信息都不太對&#xff0c;都是說要源碼編譯還有點復雜 還需要自己安裝 cuda 相關的包啥的&#xff0c;看著就頭大 于是想到這個因該 conda 自己就支持了吧&#xff0c;然后查了一下…

【HarmonyOS之旅】基于ArkTS開發(三) -> 兼容JS的類Web開發(二)

目錄 1 -> HML語法 1.1 -> 頁面結構 1.2 -> 數據綁定 1.3 -> 普通事件綁定 1.4 -> 冒泡事件綁定5 1.5 -> 捕獲事件綁定5 1.6 -> 列表渲染 1.7 -> 條件渲染 1.8 -> 邏輯控制塊 1.9 -> 模板引用 2 -> CSS語法 2.1 -> 尺寸單位 …