UE4对象类类型引用和类默认对象(Class Default Object,简称CDO)

2023-11-04

官方介绍https://docs.unrealengine.com/en-us/Programming/UnrealArchitecture/Objects

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', or CDO for short. 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, though they should generally be considered read-only. The UCLASS for an Object instance can be accessed at any time using the GetClass() function.

UCLASS宏为UObject提供了一个描述其基于虚幻的类型的UCLASS的引用。每个UCLASS都维护一个名为“类默认对象”的对象,简称CDO。 CDO本质上是一个默认的“模板”对象,由类构造函数生成,之后未修改。可以为给定的Object实例检索UCLASS和CDO,尽管它们通常应该被认为是只读的。可以使用GetClass()函数随时访问Object实例的UCLASS。 

CDO是在引擎初始化时创建的,当引擎为每个类生成UClass对象时。每个UClass的实例都是在引擎初始化期间创建的,并被分配为该UClass的CDO。并且包含在反射系统中,如在编辑器可以操作类蓝图。Obj.cpp可以看到引擎CDO初始化创建。

个人总结使用:

UE4每个对象都有该类类型引用描述该对象,通过GetClass()获取,原型如下

UClass* FObjectInitializer::GetClass() const
{
    return Obj->GetClass();
}
 

GetClass()对应Class.h都有一个ClassDefaultObject,如下


    /** The class default object; used for delta serialization and object initialization */
    UObject* ClassDefaultObject;
    /**
     * Get the default object from the class
     * @param    bCreateIfNeeded if true (default) then the CDO is created if it is null
     * @return        the CDO for this class
     */
    UObject* GetDefaultObject(bool bCreateIfNeeded = true)
    {
        if (ClassDefaultObject == nullptr && bCreateIfNeeded)
        {
            CreateDefaultObject();
        }

        return ClassDefaultObject;
    }

template< class T > 
inline const T* GetDefault(UClass *Class)
{
    check(Class->GetDefaultObject()->IsA(T::StaticClass()));
    return (const T*)Class->GetDefaultObject();
}

也可以通过全局类UObjectGlobals.h获取

// Get default object of a class.
template< class T > 
inline const T* GetDefault()
{
    return (const T*)T::StaticClass()->GetDefaultObject();
}

// Get default object of a class.
template< class T > 
inline const T* GetDefault(UClass *Class);

 

开发过程中,UE4类默认对象主要功能是存储类对象的默认状态和持有默认变量的状态,用法可以参考如下例子:

1.获取默认值

void AShooterCharacter::BeginPlay()

{
    const ACharacter* DefaultC= GetDefault<ACharacter>(GetClass());

     if ( DefaultChar->GetMesh())
    {
       float RL_Z = DefaultChar->GetMesh()->RelativeLocation.Z;
    }
}

int32 AShooterCharacter::GetMaxHealth() const
{
    return  GetClass()->GetDefaultObject<AShooterCharacter>()->Health;//表示获取AShooterCharacter类血量默认值
}

void AShooterPlayerCameraManager::BeginPlay()
{
    Super::BeginPlay();

    DefaultFreeCamDistance = Cast<AShooterPlayerCameraManager>(GetClass()->ClassDefaultObject)->FreeCamDistance;
}

 

2.判断类型

Other->GetClass()->IsChildOf(AShooterCharacter::StaticClass());//判断Other是否属于AShooterCharacter类型

3.判断是否通过某接口继承实现

UINTERFACE(Blueprintable)
class UShooterXXX : public UInterface
{
    GENERATED_BODY()
};

class IShooterXXX
{
    GENERATED_BODY()

public:
    virtual float GetXXX() const;
};

UCLASS(Abstract)
class AShooterCharacter : public ACharacter, public IShooterXXX

{
    GENERATED_UCLASS_BODY()

virtual float GetXXX() const;//重载IShooterXXX接口实现

}

//判断碰撞信息Actor是否继承该接口实现的对象,然后使用其接口

bool bImplemented = Impact.Actor->GetClass()->ImplementsInterface(UShooterWeaponPenetration::StaticClass());

ShooterXXX*    X = bImplemented ? Cast<ShooterXXX>(Impact.Actor) : nullptr;

float  CurData = bImplemented ? X-> GetXXX():0.f;

4.判断两个对象类类型是否一样

if (otherActor->GetClass() == this->GetClass())
  {

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4对象类类型引用和类默认对象(Class Default Object,简称CDO) 的相关文章

  • feign接口自动生成工具

    Feign Generator 介绍 最近发现开发spring cloud时 编写feign接口是一件痛苦的事 不仅要编写feign接口 还有fallback 请求参数和返回值等 大量重复工作 很浪费时间 于是便想到可以编写工具自动生成fe
  • Mysql触发器

    本文主针对小白 如何在数据库有数据变动得时候及时得到内容 MySQL触发器 Triggers 是一种数据库对象 它在指定的事件 例如插入 更新或删除数据 发生时自动执行一系列预定义的操作 触发器通常用于实施业务规则 数据完整性约束和自动化任
  • CentOS-7 RHEL-8 yum源的配置(本地yum源 + 互联网yum源)

    CentOS 7 RHEL 8 yum源的配置 本地yum源 互联网yum源 yum 全称为 Yellow dog Updater Modified 是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器 基于RP
  • 11款在线视频编辑和分享网站

    这是之前介绍的一些视频编辑相关工具 16个免费开源的视频编辑软件下载 VCASMO 在线创建混合多媒体演示 12款制作视频教程的屏幕录像工具 下面是现在要介绍的11款在线视频编辑和分享网站 收集的不够完全 各取所需 Jumpcut Jump
  • 【LaTeX】两张并排图片垂直对齐

    figure中插入两张并排图片 但是垂直无法居中 解决方法 通过 raisebox 2 height 抬高图片 例如 begin figure htbp centering subfigure ReLU begin minipage t 0
  • Linux 系统 less命令详解

    Linux中的less命令是一个非常常用的文本查看工具 它可以用于查看任意大小的文本文件 支持滚动翻页 搜索 标记等功能 在本文中 我们将详细介绍less命令的用法 参数和实例 并对其背后的原理和相关技术进行简要讲解 一 less命令的基本
  • flowable流程实例笔记(1)

    RuntimeService 运行服务类 支持启动的方式 流程定义 从这里获取资源文件 执行实例 流程实例中执行的每个环节 流程实例 一个流程实例包括所有运行的节点 一个流程中流程实例只有一个 启动一个实例 public void star
  • 关于性能测试,测试人员必须要知道的

    随着各企业的业务发展 用户量以及数据量的不断增加 系统承载的压力也会随之增加 服务系统的性能好坏又严重影响企业的利益 因此 性能测试重要性与需求越来越强烈 常见的性能测试目的 性能测试是确定系统在特定工作负载下的稳定性和响应能力 在进行性能
  • RTSP和RTP、RTCP协议介绍

    一 RTSP 1 简介 RTSP Real Time Stream Protocol 协议是一个基于文本的多媒体播放控制协议 属于应用层 RTSP以客户端方式工作 对流媒体提供播放 暂停 后退 前进等操作 它主要用来控制具有实时特性的数据的
  • linux:nginx报错,提示host not found in upstream

    原因参考 解决 nginx 启动错误 nginx emerg host not found in upstream emerg host not found in upstream loaclhost
  • 代码随想录算法训练营第一天

    数组理论基础 文章链接 代码随想录 记忆 数组是存放在连续内存空间上的相同类型数据的集合 数组下标都是从0开始的 数组内存空间的地址是连续的 数组的元素是不能删的 只能覆盖 在C 中二维数组是连续分布的 像Java是没有指针的 同时也不对程
  • flutter打包的app有多大_前端大势所趋---Flutter 这篇文章会让你行动起来

    Flutter和原生APP的性能对比 前言 自从今年google IO大会推出flutter跨平台开发框架以来 flutter在各个技术论坛里被吵得如日中天 flutter团队直言flutter可以帮助开发者轻松实现恒定60fps的性能体验
  • Unity3d连接SQLServer数据库

    在编写代码之前需要 1 引入程序集System Data dll 位置在C Program Files Unity Editor Data Mono lib mono unity 我unity默认装在C盘 2 把System Data dl
  • 两个app应用之间的跳转

    一 应用跳转的原理 从一个应用跳转到另一个应用 作为APP开发者 最熟悉的莫过于第三方登录 支付宝 微信支付时 那时候我们可能仅仅按照集成文档一步一步操作 在文档中配置很多类似URL Schemes 如下图 一般的配置 下面我们进入正题的为
  • LCM接口汇总

    LCM接口汇总 如下均是网上找的资料 1 RGB TTL RGB电平信号 TTL接口 数据传输速率不高 传输距离较短 且抗电磁干扰 EMI 能力也比较差 会对RGB数据造成一定的影响 另外 TTL多路数据信号采用排线的方式来传送 整个排线数
  • Hook (钩子) 线程学习总结

    当 JVM 进程退出的时候 或者受到了系统的中断信号 hook线程就会自动执行 通过 Runtime 可以为 JVM 注入多个 Hook 线程 然后看个简单的例子 import java util concurrent TimeUnit a
  • SQL语句查询1:如何从查询结果json格式数据中提取某个字段的值

    很多情况下 数据库表字段内容会以json格式来存数据 如下图 那么在我们需要查询上图中的content字段里面的某个字段的值时 需要怎么处理呢 方法一 字符串截取的方式 利用SQL中的SUBSTR 字段名 m n 函数来进行截取 selec
  • vue项目使用高德地图

    vue项目使用高德地图 部分功能介绍 在此做个笔记 引入方式使用了高德2 0 loadsh的加载方式 1 引入高德地图方式 NPM npm i amap amap jsapi loader save 在页面引入 import AMapLoa
  • java循环操作分页查询

    public void pageQuery List

随机推荐

  • tomcat服务器输入localhost可以访问,ip无法访问解决办法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近在开发项目中 遇到的一个问题是 在 tomcat中发布一个web项目 但是发布成功后 只能用http localhost 8080 fm访问项目 不能用 http 12
  • 【模电】0008 有源滤波器3(二阶有源高通、带通、带阻滤波器)

    上一节我们分析了二阶有源低通滤波器 这一节我们来继续 分析其他种类的二阶滤波器 包括高通 带通 带阻滤波器 由于分析过程是类似的 都是以节点列方程 化简后得到传递函数 本篇就不具体写计算过程了 直接给出仿真图和传递函数的结果 1 二阶有源高
  • 怎么把竖线去掉_怎么去掉word竖线

    一 word中文字左边出现竖线 不可以删除怎么解决 1 本次演示操作的Office办公软件为Excel 2013版本 2 首先新建一个Word文档 输入用于演示的文本数据 在以下的文本中我们可以看到文字左边有竖线 下面我们来操作删除这条竖线
  • 【Java、Redis】通过中心经纬度与半径获取范围内的结果集(类似附近的人)

    文章目录 需求 解决方案 什么是Redis GeoHash 1 Java Redis实现 引用的pom依赖 InitEquLongLatTask java Controller Service dao xml sql语句 2 Java 数据
  • 推特公司员工大规模辞职,挺有勇气的

    近日 一则推特公司员工大规模辞职登上热搜 推特CEO马斯克 此前说目前推特正在为赢得激烈竞争而砥砺前行 所以需要所有员工接受 高强度 长时间 努力工作 邮件里附了一个同意选项框 可以选 是 或 否 选择了 是 的员工 可以留下 选了 否 的
  • 分支结构 --> if else分支结构

    if else分支结构 if 条件表达式 语句块1 else 语句块2 判断条件表达式是否成立 gt 若成立 则执行语句块1 gt 若不成立 则执行语句块2 package demo 编程使用if else分支结构来模拟考试成绩查询的过程
  • 关于DOTS的个人总结

    网上已经有比较多的DOTS的资料了 这里就简单介绍一下 DOTS Data Oriented Technology Stack 数据导向型技术栈 的缩写 是Unity退出的面向多线程编程的解决方案 其包含了 C Job System Ent
  • 如何根据芯片手册时序图编写驱动程序

    如何根据芯片手册时序图编写驱动程序 对于电子开发者来说 刚刚拿到一个芯片 常用的芯片可以参考网上的例程来做深入了解 对于一个不常用的芯片来说 Datasheet几乎是使用芯片的唯一的资料 所以根据Datasheet时序图写出对应的驱动程序就
  • vue样式穿透(::v-deep,/deep/的使用)

    在 vue 项目的开发过程 使用了vant ElementUI antdui等组件且样式 style 使用了 scoped 属性 当想要修改组件样式 发现直接修改不了 需去掉 scoped 属性或者使用深度选择器才能修改成功 去掉scope
  • GD32F190 ADC多通道DMA自动接收踩坑指南

    如果条件允许的话 请不要用GD32F1x0系列 题记 这个系列的芯片官方连个库函数指南都没有你敢信 我都不要求中文版的了 起码英文版的得有吧 以往stm32的ADC工作模式 一般都是配置成多个通道自动连续切换 然后通过DMA把数据读走 这次
  • Vue和React的区别和优势对比

    相同点 1 都使用了 Virtual DOM 虚拟DOM 2 都支持服务器端渲染 3 提供了响应式 Reactive 和组件化 Composable 的视图组件 4 都有 props 的概念 这是properties的简写 props在组件
  • 办公室共享打印机怎么连接?

    每个办公室内 必不可少的就是打印机 但是也不可能给每个人都配备一台打印机吧 为了方便打印 可以局域网设置让多台电脑共享一台打印机 下面就来看看连接办公室共享打印机的方法 1 在桌面上打开我的电脑 2 打开控制面板 找到查看和打印机 打开 3
  • MTF浅谈概论,SFR原理,CTF,各自优缺点

    MTF浅谈概论 SFR原理 CTF 各自优缺点 好像很多人很多地方 不管什么样的清晰度测试都通通叫MTF 比如用线对的方式测的对比度也叫MTF SFR 也叫MTF 其实如果将MTF作为一个统称概念不是不行 但容易造成很多人混淆 概念模糊 尤
  • Unity动画系统简单介绍

    Unity动画系统知识点简单介绍 简易 本文是学习文 其中转载某些文章 如有侵权 联系删除 学习要点 1 动画的分类 游戏物体的基础动画设置 UGUI设置的按钮状态 2D游戏Sprite动画 Root Motion设置 人物模型动画设置 1
  • Opencv中的轮廓检测及应用

    在openCV中 我们可以对图片的轮廓进行检测 虽然轮廓的检测看起来很简单 只是对一个图形的边框进行描绘 但是 它在很多领域上都应用到了 例如 人脸识别 车辆检测 视频采集等 下面我会通过人脸识别和车辆检测两部分为大家展示 1 轮廓的概述
  • linux中gcc指令,Linux GCC命令备忘

    简介 gcc GNU C Compiler 但不局限于c语言 还支持C JAVA OBJECIVE C PASCAL等 变成了GNU Complier Collection 即GNU编译器家族 几个简单的指令 gcc hello c o h
  • pytorch如何计算平方_如何使用pytorch自动求梯度

    构建深度学习模型的基本流程就是 搭建计算图 求得损失函数 然后计算损失函数对模型参数的导数 再利用梯度下降法等方法来更新参数 搭建计算图的过程 称为 正向传播 这个是需要我们自己动手的 因为我们需要设计我们模型的结构 由损失函数求导的过程
  • 关于ICMP简介

    ICMP 简介 ICMP是 Internet Control Message Protocol Internet控制报文协议 ICMP协议是一种面向无连接的协议 它是TCP IP协议族的一个子协议 用于在IP主机 路由器之间传递控制消息 I
  • 不作35岁的程序员

    http blog chinaunix net uid 28647963 id 3540115 html 在中国 程序员不能超过35岁 似乎已经是不争的事实 软件开发工作就是青春饭 顶多靠毕业这十年的时间 超过这个年龄 要不成功跃身成为管理
  • UE4对象类类型引用和类默认对象(Class Default Object,简称CDO)

    官方介绍https docs unrealengine com en us Programming UnrealArchitecture Objects The UCLASS macro gives the UObject a refere