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

embedded/2025/2/1 17:10:42/

一.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.

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.ppmy.cn/embedded/158688.html

相关文章

代理模式 -- 学习笔记

代理模式学习笔记 什么是代理&#xff1f; 代理是一种设计模式&#xff0c;用户可以通过代理操作&#xff0c;而真正去进行处理的是我们的目标对象&#xff0c;代理可以在方法增强&#xff08;如&#xff1a;记录日志&#xff0c;添加事务&#xff0c;监控等&#xff09; 拿一…

初始Python篇(10)—— 初识 类与对象

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 前言介绍 类的定义和使用 动态绑定属性与方法 前言介绍 Python 是一门既支持面向过程&#xff0c;又支持面向对象的编程语…

sublime_text的快捷键

sublime_text的快捷键 向下复制, 复制光标所在整行并插入到下一行&#xff1a;通过 CtrlShiftD 实现快速复制当前行的功能。 可选多行, 不选则复制当前行 ctrl Shift D 删除当前行&#xff1a;通过 CtrlShiftK 实现快速删除当前行的功能。 可选多行, 不选则删当前行 ctrl S…

Spring Boot是什么及其优点

简介 Spring Boot是基于Spring框架开发的全新框架&#xff0c;其设计目的是简化Spring应用的初始化搭建和开发过程。 Spring Boot整合了许多框架和第三方库配置&#xff0c;几乎可以达到“开箱即用”。 优点 可快速构建独立的Spring应用。 直接嵌入Tomcat、Jetty和Underto…

history命令常见用法和设置

1、history命令的设置 1.1、history命令有关的环境变量 root:~$ env | grep "HIST*" HISTCONTROLignorespace:erasedups HISTSIZE20 HISTFILE/home/root/.bash_history HISTFILESIZE2000 HISTTIMEFORMAT"%F %T "使用env命令可能看不到上面这些变量&#…

基于Hutool的Merkle树hash值生成工具

SHAUtil工具 package com.blockchain.qgy.util;import com.xiaoleilu.hutool.crypto.digest.DigestUtil; import org.apache.commons.codec.binary.Hex;import java.nio.charset.StandardCharsets; import java.security.MessageDigest;/**** 生成SHA-256的工具** author QGY*…

智慧小区物业管理系统助力提升社区运营效率与居民生活品质

内容概要 智慧小区物业管理系统是现代社区管理的重要组成部分&#xff0c;它以提高社区运营效率和居民生活品质为核心目标&#xff0c;通过多种技术手段的应用&#xff0c;实现了信息透明和资源的高效利用。这个系统不仅仅是一个简单的物业管理工具&#xff0c;更是一个多功能…

KVM虚拟化

1. 虚拟化技术 虚拟化&#xff0c;通过模拟计算机的硬件&#xff0c;实现同一台计算机上同时运行多个操作系统 2. 虚拟化软件的差别 qemu 软件模拟全虚拟化&#xff0c;速度慢&#xff0c;兼容性好&#xff01; xen&#xff08;半&#xff09; …