Skip to main content

值类型 (Value Type)

值类型 (Value Type)

值类型(Value Type)FrooxEngine 数据模型(Data Model)ProtoFlux 中的一种类型划分(Delegation of types)。与引用类型 (Reference Types)相反,包含值类型的字段直接存储该值,而不是存储对该值的引用。

在 FrooxEngine 中

image.png


所有可用的 FrooxEngine 值类型的类型图解。

在 FrooxEngine 中,哪些类型被定义为值类型是由一个复杂的自动生成类 Coder<T> 来管理的。因此,最好直接参考所有值类型的列表来确定某个类型在 FrooxEngine 中是否为值类型。不过总的来说,所有 FrooxEngine 的值类型都有一个共同的属性:与引用类型不同,它们不实现 IWorldElement 接口。

场景检查器(Scene Inspector)中,存放值类型的字段很容易辨认,因为你可以直接在检查器中编辑它们的值,而不需要拖入一个该类型的引用。

ValueField(值字段)组件只能为 FrooxEngine 的值类型创建,因此在附加该组件时,你可以通过输入类型名称来测试它是否为值类型。

在 ProtoFlux 中

在 ProtoFlux 中,简而言之,如果一个类型可以在 C# 的 unmanaged(非托管)类型约束中使用,它就会被识别为值类型。否则,它就是一个对象类型(Object Type)。这使得 ProtoFlux 的类型分类成为了 C# 类型分类的直接接口。

详细扩展这个定义:在 ProtoFlux 中,一个值类型必须满足以下条件之一(已排除对 Resonite 不适用的标准):

  • 必须是以下基本类型之一:sbytebyteshortushortintuintlongulongcharfloatdoubledecimalbool
  • 必须是一个枚举(Enum)类型。
  • 必须在内部被定义为一个不可为空(Non-nullable)的 struct(结构体),且该结构体仅包含其他值类型。

FrooxEngine 和 ProtoFlux 对值类型定义的这种差异可能会引起一些混淆。例如,string(字符串)在 FrooxEngine 中是值类型,但在 ProtoFlux 中却是对象类型。这意味着你会在插槽(Slot)上使用 ValueField<string> 来存储字符串,但在 ProtoFlux 中却需要使用 ObjectWrite<string> 来写入该值。可空类型(Nullable types)也是如此。

总而言之,ProtoFlux 中的每一个值类型同时也是 FrooxEngine 中的值类型,但 FrooxEngine 中的值类型并不一定都是 ProtoFlux 中的值类型。

参见 (See also)