本文转载于拉Box小能手知乎作者
原文链接:https://zhuanlan.zhihu.com/p/75005105
简介:
Epic已经把c++玩得出神入化了,然后业内出现了一个新词UE4 C++,所以跟着UE4官方玩c++飙车应该没啥太大问题顺便还能对引擎和c++有更深的理解。
UE4有大量的类型,各种类型转换也相当麻烦,所以有必要对虚幻的类型转换魔法般操作有一些理解。如果文章有错误还请各路大佬斧正留言。
【typedef】
最开始让我感到头疼的是接触到UE4渲染资源的相关类型的时候
我的截图只是冰山一角,类型真的是太多了,虚幻非常喜欢用模板,各种typedef来欺负记忆力不好的人。
typedef就是为一个类型取一个新的名字,方便书写,其实类型还是那个类型只是换了个名字而已。和宏不同的是宏是直接文本替换。所以可以直接对两个typedef的类型进行操作,因为它们本来就是一个东西。
【TRefCountPtr】
这是虚幻自己做的一个智能指针,实现代码也非常简单就百来行代码
里面保存了一个Reference,是一个类型的指针,该类型由模板传入。如果把这个模板极简化大概是下面这个样子:
使用的时候类似这样,只不过我把智能指针的功能都去掉了,这里相当于给了个空壳。
【类型强转】
既然有这么多类型就免不了类型转换。关于c++各种类型转换可以去看下面这篇文章,这些基础我就不赘述了。
c++类型转换blog.csdn.net
这里我们来看下虚幻的一段代码
这部分代码等价于下面的代码:
#include
using namespace std;
class FTexture1D
{
public:
FTexture1D(){}
void show()
{
cout << "Texture1D"<< endl;
}
};
class FTexture2D
{
public:
FTexture2D() {}
void show()
{
cout << "Texture2D" < }
};
template
class TParmRef
{
public:
RefType* Reference;
};
typedef FTexture1D FTexture1DNewName;
int main()
{
TParmRef Ref1D;
FTexture1D* Tex1DPtr = new FTexture1D;
Ref1D.Reference = Tex1DPtr;
TParmRef Ref2D = (const TParmRef&)Ref1D;
Ref2D.Reference->show();
system("Pause");
return 0;
}
还可以再做一些变化
分别给FTexture2D和FTexture1D一个int data成员然后分别赋值
int main()
{
TParmRef Ref1D;
FTexture1D* Tex1DPtr = new FTexture1D;
Ref1D.Reference = Tex1DPtr;
TParmRef Ref2D = (const TParmRef&)Ref1D;
Ref2D.Reference->show();
system("Pause");
return 0;
}
最后输出的是10107
如果让FTexture2D的内存布局和FTexture1D不一样
我们的操作相当于是把FTexture1D的数据拷贝到FTexture2D上,但是Ftexture1D没有DataY所以DataY输出是一个随机值
我们的这句代码
TParmRef Ref2D = (const TParmRef&)Ref1D;
相当于是直接把内存数据拷过去(即使他们类型不同),如果内存布局相同,那么数据拷过去就对了,如果不同那么拷过去就是出错。
用这种方法我们能偷取一个类里的数据。
至此我们就能完全理解大部分Unreal渲染部分的代码类型相关的操作了。Enjoy it。