跳转至

Database解析

本教程由百度贴吧-销锋镝铸编写

请务必先阅读XML教程
本教程对应游戏版本2.1

前言

在之前的Content解析中,提到:

Database.xml存储了所有动物(还有主角、船等实体)的大部分属性的xml文件,在“源代码”中新添加的SubsystemComponent子类也需要在此文件中注册

本教程将详细讲解该文件的文件结构和内容

识别码和继承码

识别码

该xml文件中大部分元素都有属性Guid,它的中文全名是全局唯一标识符,这里为了方便称呼称为识别码;作用是使一个元素具有唯一性,能被被识别,因此不可重复
Guid的属性值常见格式为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中每个都x是一个十六进制数;也可以不按照格式,任意填写,只要与其他元素的Guid属性值不重复都可以

十六进制数

十六进制数的基数是16,“逢十六进一”,采用的数码是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,其中A-F分别表示十进制数字10-15

如果在载入游戏时出现An item with the same key has already been added.说明出现了重复的识别码,可以使用GUID验证器来查重。

继承码

还有相当一部分元素拥有属性InheritanceParent,翻译成中文是继承父辈,我们一般称它为继承码
继承码的作用是使该元素继承一个识别码与它相同的元素的所有内容,包括属性、子元素和后代元素,可以在此称它们互为父子对象,称被继承的为父对象,继承父对象的为子对象
如果父对象的属性名或子元素名在子元素中也有,那么这些属性和子元素不会继承给子对象

父子对象父子元素,父子对象在xml树结构上没有上下级关系

举例说明

<Folder Name="A" Guid="1950"> <!--识别码为1950的文件夹(Folder)A(此例标识码和继承码不按照标准)-->
    <File Name="a" Author="Peter" /> <!--作者(Author)为Peter的文件(File)a-->
    <File Name="b" Author="Susan" /> <!--作者为Susan的文件b-->
</Folder>
<Folder Name="B" Guid="1956" InheritanceParent="1950">  <!--识别码为1956,继承码为1950的文件夹B-->
    <File Name="a" Author="Edmund" />  <!--作者为Edmund的文件a-->
    <File Name="c" Author="Lucy" />  <!--作者为Lucy的文件c-->
</Folder>
从这一段代码可以看出文件夹B将继承来自文件夹A的作者为Peter的文件a和作者为Susan的文件b,但是文件夹B自己已经有作者为Edmund的文件a,所以不会继承来自文件夹A的文件a,那么最终文件夹B的实际代码为
<Folder Name="B" InheritanceParent="1950">  <!--识别码为1950的文件夹B-->
    <File Name="a" Author="Edmund" />  <!--作者为Peter的文件a-->
    <File Name="b" Author="Susan" />  <!--作者为Edmund的文件b-->
    <File Name="c" Author="Lucy" />  <!--作者为Lucy的文件c-->
</Folder>

默认继承

当一个元素没有继承码属性时,那么它将默认继承其父元素的父对象中相对应元素的内容,实例如下:

<EntityTemplate Name="AICreature" Guid="3f077159-f492-419b-859a-bb051de6339f" InheritanceParent="bc5be211-c1f8-4e50-9ffb-4fde625d2692">
    <MemberComponentTemplate Name="Mount" Guid="d7655ac3-4c88-4e89-8018-83155cd7bfbc" InheritanceParent="d0b14127-39ce-4490-af00-fb4111e9c51e">
        <Parameter Name="DismountOffset" Guid="3be6ca1c-17c5-4fd7-ad58-6f52d9651188" Value="1.5,0.3,0" Type="Vector3" />
    </MemberComponentTemplate>
    ...
</EntityTemplate>
...
<EntityTemplate Name="LandAnimal" Guid="e4275171-a39f-413f-8888-4c472868364d" InheritanceParent="3f077159-f492-419b-859a-bb051de6339f">
    <MemberComponentTemplate Name="Mount" Guid="d7855ac3-4c88-4e86-8018-83155cd7bfbc">
        <Parameter Name="MountOffset" Guid="3b86ca1c-1765-4fd7-ad58-6f52d9651188" Value="0,1.35,0" Type="Vector3" />
    </MemberComponentTemplate>
    ...
</EntityTemplate>
从实例中可以看到,LandAnimal的父对象是AICreature,那么LandAnimal的子元素Mount将继承得到AICreature的子元素Mount的子元素DismountOffset

根元素Database

Database.xml文件的根元素Database及其子元素如下所示,以下将对每个子元素一一说明解析

<Database>
    <DatabaseObjectTypes></DatabaseObjectTypes>
    <Assemblies></Assemblies>
    <DatabaseObjects RootGuid="2c273f6a-efce-4bf1-a8ae-e3aea7ffb75c"></DatabaseObjects>
    <GridViewPresets></GridViewPresets>
    <UserTypes />
</Database>

DatabaseObjectTypes

这一元素可以看作是DatabaseObjects元素的层级说明,说明每一个层级可以有什么子元素等,以其中两个个子元素为例

    <DatabaseObjectType Name="ComponentTemplate" DefaultInstanceName="Component" 
        IconName="ComponentTemplate" Order="6" SupportsValue="False" 
        MustInherit="False" NameLengthLimit="256" SaveStandalone="False" 
        AllowedNestingParents="Root,Folder" AllowedInheritanceParents="ComponentTemplate" 
        NestedValueType="Parameter" />
    <DatabaseObjectType Name="MemberComponentTemplate" DefaultInstanceName="MemberComponent" 
        IconName="MemberComponentTemplate" Order="7" SupportsValue="False" 
        MustInherit="True" NameLengthLimit="256" SaveStandalone="False" 
        AllowedNestingParents="EntityTemplate" AllowedInheritanceParents="ComponentTemplate" 
        NestedValueType="Parameter" />
属性详解:
属性名翻译详解
Name名字(作为Template模板)出现的元素名
Default
Instance
Name
默认实例名称作为Instance实例出现的元素名。
模板只写在Database.xml,而实例则是在游戏运行时由模板创建而来,最后保存到存档的Project.xml
IconName图标名字作用不明
Order保存次序表示元素名为Name的元素(以下简称Name元素)在游戏保存时的次序,数字越小越先保存,目的是防止xml树结构错误
Supports
Value
是否支持Value(值)属性Name元素是否能够拥有属性Value(值)
当这个元素拥有Value属性时,还需要有对应的Type(数据类型)属性
MustInherit是否必须继承Name元素是否必须拥有属性InheritanceParent(继承码)
Name
LengthLimit
名字长度限制Name元素的Name属性的字节数限制,属性值都是256
Save
Standalone
是否单独保存作用不明
Allowed
Nesting
Parents
允许嵌入的父元素Name元素的父元素只能是该属性值之一
Allowed
Inheritance
Parents
允许继承的父对象Name元素继承的父对象只能是该属性值之一
Nested
ValueType
嵌套值类型Name属性值为Parameter(参数)的元素外,该属性值都是Parameter

Assemblies

作用不明,将所有子元素删除后游戏仍能正常运行

DatabaseObjects

该元素是整个Database.xml最重要的一部分,如下代码所示,以下将针对每个Folder(文件夹)做说明

<DatabaseObjects RootGuid="2c273f6a-efce-4bf1-a8ae-e3aea7ffb75c">
    <Folder Name="Entities" Guid="5fcdf35f-7001-442c-883e-e0502b15d291">
        <Folder Name="Creatures" Guid="beb2de3c-1a77-4950-b74f-9dd470f751fe"></Folder>
        <EntityTemplate Name="Chest" Guid="08550017-af17-4955-81fa-aafaf97b92bd"></EntityTemplate><!-- 各种BlockEntity(方块实体) -->
        <EntityTemplate Name="Furnace" Guid="f4a43056-d37d-455f-9a43-803260a915a9"></EntityTemplate>
    </Folder>
    <Folder Name="Subsystems" Guid="75acb50b-fb75-4c85-af38-a0fb51a9eb90"></Folder>
    <Folder Name="Components" Guid="766da18a-636a-4a88-803c-4462aed106f3"></Folder>
    <Folder Name="Projects" Guid="aec7b5f9-de96-4ef0-8b6c-4a9e3b021ddf"></Folder>
    <Folder Name="Abstract" Guid="c6ba6a30-5042-4d3d-9bea-199cd4acc3fa"></Folder>
</DatabaseObjects>

Entities

在上面的代码中已经能够看到,它包含一个Creatures(生物)文件夹和一些单独列出的EntityTemplate(实体模板)

EntityTemplate

先来说说这些单独列出的实体模板,它包括:

  • 类似生物
    • IntroShip(介绍船)
    • Boat(小船)
  • BlockEntity(方块实体)类型
    • Chest(箱子)
    • Dispenser(发射器)
    • CraftingTable(合成台)
    • Furnace(火炉)

可以看出,它们和生物不太一样,但也都是实体

实体和Component

实体的一般特征是具有一个或多个Component,可以认为实体是Component的载体

Creatures

该文件夹下面还包含以下三个文件夹:

  • Abstract(摘要)不能被实例化的生物摘要翻译可能不够准确,用于被下面的Animals(动物)文件夹内的实体继承,有诸如Bird(鸟)LandAnimal(地面生物)Fish(鱼)等实体模板。在下面的生物继承导图中是紫色边框。
  • Animals(动物)Player玩家外所有动物的实体模板都在这个文件夹内。一般修改特定动物数据或添加新动物都在这个文件夹内进行;如果要修改一组生物,可以修改它们的共同父对象或共同父对象的父对象……
  • Players(玩家)顾名思义,玩家的实体模板在这个文件夹内,包括FemalePlayer(女性玩家)MalePlayer(男性玩家)

具体一个实体模板里的子元素在此不详细解析,可以参考中文版Database.xml 1.25

中文版Database.xml 1.25虽然过于古老,但后来新增的内容并不算多,还很“够用”

生物继承导图

点击查看大图
点击图片查看大图,或点击此处下载

Subsystems

所有要被加载的Subsystem都在这个文件夹

Components

所有要被加载的Component都在这个文件夹

Component和Subsystem

Component能被多个实体各自拥有一个,独立运行;相对的,一个Subsystem在游戏运行时只会被实例化一个

Projects

详细说明见下一小节

Abstract

该文件夹的子元素SubsystemTemplateComponentTemplate分别是上面所有其他SubsystemTemplateComponentTemplate的父对象;ProjectTemplate则是上一节的唯一子元素的父对象
此处的ProjectTemplate相当于是包含了游戏进入存档时所有真正要使用的Subsystem,而上面的Subsystems文件夹只是载入游戏时预先加载和设定相关参数;所以如果要添加Subsystem,在上面的Subsystems文件夹和该文件夹都需要将它“注册”

GridViewPresets

作用不明,将该元素删除后游戏仍能正常运行

UserTypes

作用不明,将该元素删除后游戏仍能正常运行

例子

详见动物相关例子