如何解决您如何重新创建用户定义类型的UE4序列化? 解决方案1.使用类型整数映射
问题
虚幻引擎4编辑器允许您将自己类型的对象添加到场景中。
这样做需要用户进行最少的工作-要使类在编辑器中可见,您只需添加一些宏,例如UCLASS()
UCLASS()
class MyInputComponent: public UInputComponent //you can instantiate it in the editor!
{
UPROPERTY(EditAnywhere)
bool IsSomethingEnabled;
};
这足以使编辑器序列化编辑器中创建的对象的数据(请记住:该类是用户定义的,但用户不必硬编码加载特定字段。另外请注意,可以将UPROPERTY变量设置为以及用户定义的类型)。然后在加载实际游戏时将其反序列化。那么如何轻松处理呢?
我的尝试-每个新类的硬编码加载
class Component //abstract class
{
public:
virtual void LoadFromStream(std::stringstream& str) = 0;
//virtual void SaveIntoStream(std::stringstream& str) = 0;
};
class UserCreatedComponent: public Component
{
std::string Name;
int SomeInteger;
vec3 SomeVector; //example of user-defined type
public:
virtual void LoadFromStream(std::stringstream& str) override //you have to write a function like this every time you create a new class
{
str >> Name >> SomeInteger >> SomeVector.x >> SomeVector.y >> SomeVector.z;
}
};
std::vector<Component*> ComponentsFromStream(std::stringstream& str)
{
std::vector<Component*> components;
std::string type;
while (str >> type)
{
if (type == "UserCreatedComponent") //do this for every user-defined type...
components.push_back(new UserCreatedComponent);
else
continue;
components.back()->LoadFromStream(str);
}
return components;
}
UserCreatedComponent对象流表示的示例:
UserCreatedComponent MyComponent 5 0.707 0.707 0.707
引擎用户每次创建新类时都必须执行以下操作:
我们的目标是使用户摆脱所有这些工作,并创建一个更具扩展性的解决方案,例如UE4(如上所述)。
解决方案1.使用类型整数映射
本节基于以下内容: https://stackoverflow.com/a/17409442/12703830
这个想法是,对于每个新类,我们都映射一个整数,因此当我们创建一个对象时,我们只需将流中给定的整数传递给工厂即可。
UserCreatedComponent对象流表示的示例:
1 MyComponent 5 0.707 0.707 0.707
这解决了确定所创建对象类型的问题,但似乎又产生了两个新问题:
- 我们应该如何将类映射到整数?如果我们包含两个包含将自身映射到相同数字的类的库,会发生什么情况?
- 初始化什么需要向量进行构造的组件看起来像什么?我们并不总是使用 string 和 int 来进行对象构造(而流只给了我们很多)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。