Database解析¶
本教程由百度贴吧-销锋镝铸编写
请务必先阅读XML教程
本教程对应游戏版本2.1
前言¶
在之前的Content解析中,提到:
Database.xml
存储了所有动物(还有主角、船等实体)的大部分属性的xml文件,在“源代码”中新添加的Subsystem
、Component
子类也需要在此文件中注册
本教程将详细讲解该文件的文件结构和内容
识别码和继承码¶
识别码¶
该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>
<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¶
该文件夹的子元素SubsystemTemplate
和ComponentTemplate
分别是上面所有其他SubsystemTemplate
和ComponentTemplate
的父对象;ProjectTemplate
则是上一节的唯一子元素的父对象
此处的ProjectTemplate
相当于是包含了游戏进入存档时所有真正要使用的Subsystem
,而上面的Subsystems
文件夹只是载入游戏时预先加载和设定相关参数;所以如果要添加Subsystem
,在上面的Subsystems
文件夹和该文件夹都需要将它“注册”
GridViewPresets¶
作用不明,将该元素删除后游戏仍能正常运行
UserTypes¶
作用不明,将该元素删除后游戏仍能正常运行
例子¶
详见动物相关例子