微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

您如何重新创建用户定义类型的UE4序列化? 解决方案1.使用类型整数映射

如何解决您如何重新创建用户定义类型的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

引擎用户每次创建新类时都必须执行以下操作:

  1. 通过添加一个if来修改ComponentsFromStream
  2. 添加两种方法,一种从流中加载,另一种保存到流中。

我们的目标是使用户摆脱所有这些工作,并创建一个更具扩展性的解决方案,例如UE4(如上所述)。

解决方案1.使用类型整数映射

本节基于以下内容 https://stackoverflow.com/a/17409442/12703830
这个想法是,对于每个新类,我们都映射一个整数,因此当我们创建一个对象时,我们只需将流中给定的整数传递给工厂即可。
UserCreatedComponent对象流表示的示例:

1 MyComponent 5 0.707 0.707 0.707  

解决了确定所创建对象类型的问题,但似乎又产生了两个新问题:

  • 我们应该如何将类映射到整数?如果我们包含两个包含将自身映射到相同数字的类的库,会发生什么情况?
  • 初始化什么需要向量进行构造的组件看起来像什么?我们并不总是使用 string int 来进行对象构造(而流只给了我们很多)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?