目录

  1. 快速语法
  2. 基本组件简易教程
  3. 在Unity中使用YAML

快速语法

基本组件简易教程

数组

#非内置语法表示:
- item1
- item2
- item3

#内置语法表示:
[item1, item2, item3]

键值对

#非内置语法表示
key: value
numberKey: 123

#内置语法表示:
{key: value, numberKey: 123}

多行字符串

#保留换行符模式:
string: |
  There once was a man from Darjeeling
  Who got on a bus bound for Ealing
    It said on the door
    "Please don't spit on the floor"
  So he carefully spat on the ceiling

#折叠换行符模式:
string: >
  Wrapped text
  will be folded
  into a single
  paragraph
  
  Blank lines denote
  paragraph breaks

嵌套

#于数组中使用键值对(非内置语法):
- key: value
  numberKey: 123

#于数组中使用键值对(内置语法):
- {key: value, numberKey: 123}

#于键值对中使用数组(非内置语法):
key: 
  - value1
  - value2

#于键值对中使用数组(内置语法):
key: [value1, value2]

开头结尾以及注释

--- #文件分隔,本内容为注释内容
key: value
numberKey: 123
array: 
  - item1
  - item2
... #文件结束
--- #新文件开始
key: value1
numberKey: 321
array:
  - item3
  - item4
... #文件结束

数据合并与参考

结点参考符号(*
键值对合并符号(«
参考到其它结点标签的锚点标记符号(&
参考可用于所有数据结构,而合并仅可用于键值对

---
- good: &id01         #定义锚点
  name: Coke cola
  vol: 330ml
  price: 2.5
- good:
  <<: *id01           #合并,使用在锚点定义的内容
  vol: 600ml          #重写vol键值
  price: 3            #重写price键值
- good:
  <<: *id01           #合并,使用在锚点定义的内容
  name: Sprite        #重写name键值
  flavor: >           #添加新的键值对
    shit flavor
    nobody likes

类型转换

a: 123                      #整型
b: "123"                    #字符串
c: 123.0                    #float型
d: !!float 123              #指定float
e: !!str 123                #指定string
f: !!str true               #指定string
g: true                     #bool型
h: Yes                      #bool型
i: Yes we have No bananas   #字符串

特殊形态

除了一般的数据形态之外,用户也可以使用一些较为高级的类型,但不保证可被每种解析器分析。使用时和强制转型类似,要在形态名称之前加上两个感叹号(!!)。有几种重要的形态在本篇没有讨论,包括集合(sets),有序映照(ordered maps),时间戳记(timestamps)以及十六进制数据(hexadecimal)。下面这个示例则是比特数据(binary)

---
picture: !!binary |
 R0lGODlhDAAMAIQAAP//9/X
 17unp5WZmZgAAAOfn515eXv
 Pz7Y6OjuDg4J+fn5OTk6enp
 56enmleECcgggoBADs=mZmE

许多YAML的实现允许用户自定义数据形态。在将一个对象序列化时,这个方法还颇方便的。某些区域数据形态可能不存在默认的数据形态中,不过这种类型在特定的YAML应用程序中是有定义的。这种区域数据形态用感叹号(!)表示。

---
myObject: !MyClass {name: Jobs, age: 64}

在Unity中使用YAML

本篇中使用.net开源库YamlDotNet解析YAML文件,如需查看原文请点击上文链接或者这里跳转。

导入YAML动态库

在Unity中使用动态链接库需要先将DLL文件放入dataPath\Assets\Plugins文件夹下,然后在代码中导入YAML命名空间。
值得注意的是,该开源库同样提供了Unity资源,在Asset Store搜索YamlDotNet便可以方便直接将代码导入项目。

using YamlDotNet;

序列化

var serializer = new SerializerBuilder().Build();
string yaml = serializer.Serialize(obj);

反序列化

string yaml = File.ReadAllText("text.yaml");
var deserializer = new Deserializer();
MyObject obj = deserializer.Deserialize<MyObject>(yaml);

值得注意的是YamlDotNet仅支持对属性的访问,故在反序列化时对于的对象中应包含相对应的属性。

更多YamlDotNet用法请查阅YamlDotNet Wiki