UE4的Cast方法与类型转化
来源:互联网 发布:电力预算用什么软件 编辑:程序博客网 时间:2024/05/09 07:39
UE4中,我们经常会用到Cast函数,作用是强制转化一个指针到我们需要的类型,并且如果不能强制转化,就会返回nullptr。通过判断转换之后是不是nullptr,我们也能实现很多有用的功能(比如用于判断子弹击中的到底是什么)
那么Cast到底是如何实现的呢?要看Cast,首先要看到一个类型,叫做UClass,他是实现UE类型识别的重要类型。
我们经常打交道的类型都是继承自UObjectBase的,UObjectBase是UE的一个基础类型,内部有一个UClass类型的字段Class,识别类型的重要方法HasAnyCastFlag就是UClass的方法,我们看看HasAnyCastFlag的具体实现:
FORCEINLINE bool HasAnyCastFlag(EClassCastFlags FlagToCheck) const { return (ClassCastFlags&FlagToCheck) != 0; }
我们可以看到,他的代码很简单,就是对比了参数FlagToCheck和自己一个叫ClassCastFlags的字段,这两个对象的类型是EClassCastFlags,其实这个类型很简单,就是int64。而两个类型到底是不是可以强制转化,完全取决于自己这个int64的flag字段和对方int64 flag字段按位与是否等于0。紧接这这个函数实现,就是UE4内部类型的转换关系:
#define CASTCLASS_None DECLARE_UINT64(0x0000000000000000)#define CASTCLASS_UField DECLARE_UINT64(0x0000000000000001)#define CASTCLASS_UInt8Property DECLARE_UINT64(0x0000000000000002)#define CASTCLASS_UEnum DECLARE_UINT64(0x0000000000000004)#define CASTCLASS_UStruct DECLARE_UINT64(0x0000000000000008)#define CASTCLASS_UScriptStruct DECLARE_UINT64(0x0000000000000010)#define CASTCLASS_UClass DECLARE_UINT64(0x0000000000000020)#define CASTCLASS_UByteProperty DECLARE_UINT64(0x0000000000000040)#define CASTCLASS_UIntProperty DECLARE_UINT64(0x0000000000000080)#define CASTCLASS_UFloatProperty DECLARE_UINT64(0x0000000000000100)#define CASTCLASS_UUInt64Property DECLARE_UINT64(0x0000000000000200)#define CASTCLASS_UClassProperty DECLARE_UINT64(0x0000000000000400)#define CASTCLASS_UUInt32Property DECLARE_UINT64(0x0000000000000800)#define CASTCLASS_UInterfaceProperty DECLARE_UINT64(0x0000000000001000)#define CASTCLASS_UNameProperty DECLARE_UINT64(0x0000000000002000)#define CASTCLASS_UStrProperty DECLARE_UINT64(0x0000000000004000)#define CASTCLASS_UProperty DECLARE_UINT64(0x0000000000008000)#define CASTCLASS_UObjectProperty DECLARE_UINT64(0x0000000000010000)#define CASTCLASS_UBoolProperty DECLARE_UINT64(0x0000000000020000)#define CASTCLASS_UUInt16Property DECLARE_UINT64(0x0000000000040000)#define CASTCLASS_UFunction DECLARE_UINT64(0x0000000000080000)#define CASTCLASS_UStructProperty DECLARE_UINT64(0x0000000000100000)#define CASTCLASS_UArrayProperty DECLARE_UINT64(0x0000000000200000)#define CASTCLASS_UInt64Property DECLARE_UINT64(0x0000000000400000)#define CASTCLASS_UDelegateProperty DECLARE_UINT64(0x0000000000800000)#define CASTCLASS_UNumericProperty DECLARE_UINT64(0x0000000001000000)#define CASTCLASS_UMulticastDelegateProperty DECLARE_UINT64(0x0000000002000000)#define CASTCLASS_UObjectPropertyBase DECLARE_UINT64(0x0000000004000000)#define CASTCLASS_UWeakObjectProperty DECLARE_UINT64(0x0000000008000000)#define CASTCLASS_ULazyObjectProperty DECLARE_UINT64(0x0000000010000000)#define CASTCLASS_UAssetObjectProperty DECLARE_UINT64(0x0000000020000000)#define CASTCLASS_UTextProperty DECLARE_UINT64(0x0000000040000000)#define CASTCLASS_UInt16Property DECLARE_UINT64(0x0000000080000000)#define CASTCLASS_UDoubleProperty DECLARE_UINT64(0x0000000100000000)#define CASTCLASS_UAssetClassProperty DECLARE_UINT64(0x0000000200000000)#define CASTCLASS_UPackage DECLARE_UINT64(0x0000000400000000)#define CASTCLASS_ULevel DECLARE_UINT64(0x0000000800000000)#define CASTCLASS_AActor DECLARE_UINT64(0x0000001000000000)#define CASTCLASS_APlayerController DECLARE_UINT64(0x0000002000000000)#define CASTCLASS_APawn DECLARE_UINT64(0x0000004000000000)#define CASTCLASS_USceneComponent DECLARE_UINT64(0x0000008000000000)#define CASTCLASS_UPrimitiveComponent DECLARE_UINT64(0x0000010000000000)#define CASTCLASS_USkinnedMeshComponent DECLARE_UINT64(0x0000020000000000)#define CASTCLASS_USkeletalMeshComponent DECLARE_UINT64(0x0000040000000000)#define CASTCLASS_UBlueprint DECLARE_UINT64(0x0000080000000000)#define CASTCLASS_UDelegateFunction DECLARE_UINT64(0x0000100000000000)#define CASTCLASS_UStaticMeshComponent DECLARE_UINT64(0x0000200000000000)#define CASTCLASS_UMapProperty DECLARE_UINT64(0x0000400000000000)#define CASTCLASS_AllFlags DECLARE_UINT64(0xFFFFFFFFFFFFFFFF)
我们新建的类,继承自这些基类,自然也会获得一个ClassCastFlags,用来控制转化关系。
比如我们声明一个继承自APawn的类,然后再Tick中访问UClass的ClassCastFlags字段,得到的值是343597383680,转化为2进制就是0x0000005000000000,比define的CASTCLASS_APawn刚好大一,相与不为0,可以转化。
到这里就比较清楚了,Cast函数内部调用了一个叫DoCast的函数。而DoCast调用了我们上边看到的HasAnyCastFlag:
FORCEINLINE static To* DoCast( UObject* Src ) { return Src && Src->GetClass()->HasAnyCastFlag(TCastFlags<To>::Value) ? (To*)Src : nullptr; }
- UE4的Cast方法与类型转化
- ue4 tags 与 cast
- MySql数据类型转化-CAST与CONVERT 函数的用法
- CXX与HXX的强制类型转换(cast)
- mysql类型转换函数convert与cast的用法
- OC各种类型之间转化的方法
- 字符串与数值类型的转化
- hive中数据类型的转化CAST
- 整型数据与字符串类型相互转化的一种实现方法
- 笔记UE4 的各个类型
- 标准C++的类型转换符:static cast、dynamic cast、reinterpret cast和const cast
- 标准C++的类型转换符:static cast、dynamic cast、reinterpret cast和const cast
- date日期类型与String类型的相互转化
- date日期类型与String类型的相互转化
- Int类型与String类型之间的相互转化
- Java中字符串类型与日期类型的互相转化
- c++ int 类型与string类型的相互转化
- date日期类型与String类型的相互转化
- 欧美大脑计划存在的问题和忽视的一个重要元素,互联网大脑计划系列三
- 南昌大学大神养成计划第一天
- poj 1328
- 基于Smack3.0.4+ Openfire3.10.2开发之Android 客户端之一
- maven命令大全
- UE4的Cast方法与类型转化
- Failed to create the Java Virtual Machine" 解决方案
- PostgreSQL:PostgreSQL的安装和配置
- 后端开发工程师的DIV+CSS两栏布局入门
- Week3-2Thesaurus-based Word Similarity Methods
- 使用Eclipse构建Maven项目 (step-by-step)
- java解析JSON获取全国省市县区域名称
- Docker实战(二):制作自己的Docker镜像
- poj 2856