UE4对象类类型引用和类默认对象(Class Default Object,简称CDO)
官方介绍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())
{
}
UE4对象类类型引用和类默认对象(Class Default Object,简称CDO)相关推荐
- 比较默认对象和默认约束的异同_UE4对象类类型引用和类默认对象(Class Default Object,简称CDO)...
官方介绍https://docs.unrealengine.com/en-us/Programming/UnrealArchitecture/Objects The UCLASS macro give ...
- java面向对象的概念,Java类、引用变量与堆对象
一,面向对象概念 1.类型(类) 指一个名词概念,如:老师,学生,图书 2.引用(变量) 指引用具体概念实例的代词,如:某人.某物 3.对象(东西) 指具体概念的个体实例,如:张无忌这个人. 4.行为 ...
- a类怎么引用b类java_Java中A类的数组如何传入B类???急
public class Test { public static void main(String[] args) { //方法一:引用传递 //创建A对象并给数组赋值 A a = new A(); ...
- java 字符串转dom对象_xml类型的字符串转换为Dom对象
我写这篇博客的目的是因为我在这一点转换方面耽搁了快2天时间,真是惭愧呀,dom4j.jar包有自带方法DocumentHelper.parseText(String text)用于将字符串类型的xml ...
- python对象回收_python 引用,拷贝,对象回收,弱引用
引用 python中,在对对象赋值,参数传递,函数返回等等, 都是引用传递的. 直接copy个例子来[1]: a = [1, 2, 3] b = a b.append(5) print a, b 输出 ...
- typeScript面试必备之-通识七:typeScript中的可索引接口(数组,对象)+类类型接口...
可索引接口:数组.对象的约束 (不常用) ts定义数组的方式 var arr:number[]=[2342,235325]var arr1:Array<string>=['111','22 ...
- C++入门Step11【类 类型】
类 类型: 类类型是什么? 首先说明一下,这个名字看着很怪异,其实第一个'类'字,和"结构体类型"中的"结构体"是一样的,这个类型就叫类. 可以把世间万物都看成 ...
- C++中转换构造函数:将其它类型转换为当前类的类型
1.C++转换构造函数:将其它类型转换为当前类的类型 在C/C++中,不同的数据类型之间可以相互转换.无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转 ...
- swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用
浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...
最新文章
- 什么是HTTP Headers?
- a java_java程序弹出a java exception has occurred
- DMLC深盟分布式深度机器学习开源平台解析
- ASP.NET Eval如何进行数据绑定
- Google Analytics Advanced Configuration - Google Analytics 高级配置
- TensorFlow十三 LSTM练习
- 内的图标_从零开始画图标系列:线性图标设计实战演示!
- java base64图片计算图片大小
- 【bug解决】上传图片后,取消这次上传 再次执行上传,上次的图片还存在
- gbk英文字符占几个字节?
- 网络游戏前后端时间同步
- 传奇单机架设教程 小白也能开传奇
- pytorch中的register_parameter()和parameter()
- leetcode 51. N 皇后
- 详解跨境电商企业信息化建设的关键点:业财一体化
- 通过root用户与hadoop用户分别启动zookeeper,两种启动结果为什么会截然不同?
- 【Git】GitHub flow笔记 | GitHub flow和Git flow的区别
- 非沪籍女生约辩异地高考沦为骂战 无疾而终
- 万拓云存储系统解决方案
- 企业微信群管理员可以踢人吗?企业微信群怎么自动踢人?