UE4的Cast方法与类型转化

更新时间:2023-06-22 12:52:24 阅读: 评论:0

UE4的Cast⽅法与类型转化
UE4中,我们经常会⽤到Cast函数,作⽤是强制转化⼀个指针到我们需要的类型,并且如果不能强制转化,就会返回nullptr。通过判断转换之后是不是nullptr,我们也能实现很多有⽤的功能(⽐如⽤于判断⼦弹击中的到底是什么)
那么Cast到底是如何实现的呢?要看Cast,⾸先要看到⼀个类型,叫做UClass,他是实现UE类型识别的重要类型。
我们经常打交道的类型都是继承⾃UObjectBa的,UObjectBa是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)aplus
#define CASTCLASS_UClass                        DECLARE_UINT64(0x0000000000000020)
#define CASTCLASS_UByteProperty                DECLARE_UINT64(0x0000000000000040)
#define CASTCLASS_UIntProperty                  DECLARE_UINT64(0x0000000000000080)
shinco#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)
化妆都需要什么spit#define CASTCLASS_UInt64Property                DECLARE_UINT64(0x0000000000400000)
#define CASTCLASS_UDelegateProperty            DECLARE_UINT64(0x0000000000800000)aidu
#define CASTCLASS_UNumericProperty              DECLARE_UINT64(0x0000000001000000)
riz
#define CASTCLASS_UMulticastDelegateProperty    DECLARE_UINT64(0x0000000002000000)
#define CASTCLASS_UObjectPropertyBa          DECLARE_UINT64(0x0000000004000000)
#define CASTCLASS_UWeakObjectProperty          DECLARE_UINT64(0x0000000008000000)
#define CASTCLASS_ULazyObjectProperty          DECLARE_UINT64(0x0000000010000000)
#define CASTCLASS_UAstObjectProperty          DECLARE_UINT64(0x0000000020000000)
#define CASTCLASS_UTextProperty                DECLARE_UINT64(0x0000000040000000)
amico#define CASTCLASS_UInt16Property                DECLARE_UINT64(0x0000000080000000)
#define CASTCLASS_UDoubleProperty              DECLARE_UINT64(0x0000000100000000)
#define CASTCLASS_UAstClassProperty          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)
eblin#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 )
ly{
return Src && Src->GetClass()->HasAnyCastFlag(TCastFlags<To>::Value) ? (To*)Src : nullptr;
}

本文发布于:2023-06-22 12:52:24,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/1013537.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:类型   转化   字段
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图