本文转自Unity Connect博主 超级汽水

为什么是 YAML ?
首先我们来看看什么是YAML :

官网上作者对自己的定义
  • YAML 不是标记语言。
  • YAML 是针对所有编程语言的人性化数据序列化标准。
  • 像 XML 一样,它使用可移植的、独立于平台的格式来表示任何种类的的数据,但是它是人性的化格式这意味着它更方便我们阅读。
  • 同时 YAML 也是 Unity 编辑器使用的序列化格式。

它看起来像是这样 :

YAML 的基本语法

  • 大小写敏感。
  • 使用缩进来表示层级关系。
  • 缩进不允许使用 Tab
  • 使用 # 来表示单行注释,不支持多行注释。
  • 文件开头要使用 --- 来表示文档开始,使用 ... 来表示。文档结束,一个文件中可以存在多个文档。
  • 文件的拓展名一般为 .yaml 比如 Player.yaml

YAML 支持的数据结构

翻译并不完全准确,每个人译法不同请以英文为主。

  1. 散列表 ( mappings )
  2. 数组 ( sequences )
  3. 纯量 ( scalars )

现在我们来学习一下三大数据结构,这一部分内容请结合下方的特殊符号讲解一起看。1 .散列表 :
文本模式:

---
# 使用冒号来代表,格式为 key: value 冒号后面要加一个空格
key: value# 使用缩进来表示层级关系
key:key1: value1key2: value2# flow 风格写法
key: {key1: value1, key2: value2}# 无序键值对
map:Block style: !!mapkey1 : value1key2  : value2# Flow styleFlow style: !!map { key1: value1, key2: value2 }# 结果# map: #   { 'Block style': { key1: 'value1', key2: 'value2' },#     'Flow style': { key1: 'value1', key2: 'value2' } }# 有序键值对 (字典)omap:Block style: !!omap- one: 1- two: 2- three: 3# Flow styleFlow style: !!omap [ one: 1, two: 2, three : 3 ]
# 结果
# omap:
#    { 'Block style': [ { one: 1 }, { two: 2 }, { three: 3 } ],
#      'Flow style': [ { one: 1 }, { two: 2 }, { three: 3 } ] }
...

图片模式 :

2 .数组
文本模式:

---
# 普通定义
食物 :- 胡萝卜- 西红柿- 苹果# 结果 : { '食物': [ '胡萝卜', '西红柿', '苹果' ] }# 嵌套键值对
食物 : - 蔬菜: 胡萝卜- 蔬菜: 西红柿- 水果: 苹果
# 结果:
# { '食物': [ { '蔬菜': '胡萝卜' }, { '蔬菜': '西红柿' }, { '水果': '苹果' } ] }# pairs 类型
食物 : !!pairs- 蔬菜: 胡萝卜- 蔬菜: 西红柿- 水果: 苹果
# 结果 : { '食物': [ [ '蔬菜', '胡萝卜' ], [ '蔬菜', '西红柿' ], [ '水果', '苹果' ] ] }
...

图片模式:

3 .纯量 ( 不保证每个解析器都能正常使用所有类型,请自行实际判断 )1 .Integers 整型

---
# Integers 整型
canonical: 12345   # 普通 int
decimal: +0.12345  # 小数
octal: 014         # 8 进制
hexadecimal: 0xC   # 16 进制# 结果均为 10 进制 :
# { canonical: 12345,
#   decimal: 12345,
#   octal: 12,
#   hexadecimal: 12 }
# 注:请注意最终结果与冒号前的名字并无关系,与冒号后的写法有关,不要混淆
...

2 .Floating Point 浮点数

---
# Floating Point 浮点数
canonical: 1.23015e+3     # 普通 float
exponential: 12.3015e+02  # 科学计数法
fixed: 1230.15            # 固定值
negative infinity: -.inf  # 负无穷大
not a number: .NaN        # 不是数字
...

3 .Timestamps 时间

---
canonical: 2001-12-15T02:59:43.1Z
iso8601: 2001-12-14t21:59:43.10-05
spaced: 2001-12-14 21:59:43.10 -5
date: 2002-12-14# 结果
# { canonical: Sat Dec 15 2001 10:59:43 GMT+0800 (中国标准时间),
#   iso8601: Sat Dec 15 2001 10:59:43 GMT+0800 (中国标准时间),
#   spaced: Sat Dec 15 2001 10:59:43 GMT+0800 (中国标准时间),
#   date: Sat Dec 14 2002 08:00:00 GMT+0800 (中国标准时间) }
...

4 . 其它常用类型

---
# 布尔类型
boolean:- true- false
# 结果 :{ bool: [ true, false ] }# 字符串类型
string : '123456'
# 结果 :{ string: '123456' }# 空值
null :- ~- null
# 结果 :{ null: [ null, null ] }
...

现在我们来看看 YAML 中的特殊符号:1 . " --- " 和 " ... "

# --- 代表一个文档的开始
--- # !! 俩个感叹号 用来做强制类型转换
test : - !!int 123- !!int 123
# 结果 : { test: [ 123, '123' ] } 可以看到第一个为整数类型,第二个为字符串类型。...
# ... 代表一个文档的结束

2 . “ > ” 和 " | "

---
# 在字符串中 “>” 大于号表示换行,“|” 竖线同样表示换行但是保留换行符
test1 : >这是一段文字。
test2 : |这是一段文字。
# 结果 : { test1: '这是一段 文字。n', test2: '这是一段n文字。n' }
...

3 . " ? " 和 " : "

---
# 对于复杂的对象格式可以使用 ? 加空格来代表 key ; 使用 : 加空格来代表 value
? - complexkey- complexkey2
: - value1- value2# flow 风格写法
[complexkey,complexkey2] : [value1,value2]# 结果 :{ 'complexkey,complexkey2': [ 'value1', 'value2' ] }
...

4 . " & " 、" << " 和 " * "

---
# 引用重复的内容 “&”:锚点标记、“<<”: 合并标记、“*”:要合并的锚点值
# 要注意空格的数量
- test: &001key1 : value1key2 : value2
- test1: <<: *001key2 : value222  # 重写 key2
- test2:<<: *001key3 : value3 # 添加 key3
# 结果 :
# [ { test: { key1: 'value1', key2: 'value2' } },
#   { test1: { key1: 'value1', key2: 'value222' } },
#   { test2: { key1: 'value1', key2: 'value2', key3: 'value3' } } ]# 一些简单的合并也可以不使用 << 比如
sex:- &00 male- &01 female
player1:- sex : *00
player2:- sex : *01
# 结果:
# { sex: [ 'male', 'female' ],
#   player1: [ { sex: 'male' } ],
#   player2: [ { sex: 'female' } ] }
...

在 Unity 中使用 YAML !
YAML 在很多语言中都可以方便的使用,unity 中也不例外。
1 .在资源商店中查找 YamlDotNet for Unity 这是一个免费的插件,将它导入到你的项目中。
2 .导入后你的项目中应该是这样的,在 Plugin 文件夹下 多出一个名为 YamlDotNet 的文件夹。

3 .创建一个脚本来测试下我们的功能,创建一个玩家类来保存信息。

// 创建一个玩家类用来保存玩家信息
internal class PlayerData
{public string PlayerName { get; set; }public string PlayerSex { get; set; }public List<int> PlayerBackPack { get; set; }
}

4 .简单的存储读取。

using UnityEngine;
using System.Collections.Generic;
using YamlDotNet.Serialization;public class YamlTest : MonoBehaviour
{private void Start(){//创建对象var data = new PlayerData {PlayerName = "SuperSoda",PlayerSex = "男",PlayerBackPack = new List<int>(){1, 2, 3, 4, 5}};//序列化为 YAML var serializer = new Serializer();var yaml = serializer.Serialize(data);Debug.LogFormat("序列化保存:n{0}", yaml);//反序列化var deserializer = new Deserializer();var data1 = deserializer.Deserialize<PlayerData>(yaml);Debug.Log("反序列化读取:");Debug.Log("玩家名字 : " + data1.PlayerName);Debug.Log("玩家性别 : " + data1.PlayerSex);Debug.Log("玩家物品总数 : " + data1.PlayerBackPack.Count);Debug.Log("背包中第一个物品id : " + data1.PlayerBackPack[0]);}
}

5 .运行看看最终效果吧 ~ 。

大功告成 !,我们再来看看 YAML 中这一段的样子:

上述内容希望对大家有帮助,同时欢迎纠错 ~
参考https://yaml.org/spec/1.2/spec.html https://www.jianshu.com/p/97222440cd08 http://www.ruanyifeng.com/blog/2016/07/yaml.html
代码部分产考了 宣雨松 大佬的代码,感谢大佬的帮助 !

原文链接:

https://connect.unity.com/p/shi-yong-yaml-bao-cun-you-xi-shu-ju?app=true​connect.unity.com

更多干货资源学习,戳上方链接下载Unity官方app,在线技术互动答疑,结识更多Unity小伙伴,交友学习两不误!

yaml 数组_使用 YAML 保存游戏数据 !相关推荐

  1. unity保存游戏数据_在Unity中保存和加载玩家游戏数据

    unity保存游戏数据 In this tutorial, we'll learn to implement Save/Load game functionality in our game. We ...

  2. 使用 YAML 保存游戏数据 !

    本文转自Unity Connect博主 超级汽水 为什么是 YAML ? 首先我们来看看什么是YAML : YAML 不是标记语言. YAML 是针对所有编程语言的人性化数据序列化标准. 像 XML ...

  3. 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!

     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigame.com/android-game/327.html 很多童鞋说 ...

  4. XNA游戏开发之(六)——保存游戏数据

    [原创]Alex 游戏过程中,通常需要存储游戏状态.在下次启动游戏时,重新载入游戏,继续游戏. 实现过程非常简单,首先建立一个结构体定义需要保存的游戏参数,然后通过XmlSerializer类将其保存 ...

  5. 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式

    上一篇跟各位童鞋介绍了SharedPreference 和 File流如何存储数据,并且推荐使用FileOutputStream/FileInputStream来存储咱们游戏数据,那么这一篇则是像大家 ...

  6. 网页游戏怎么修改数据_一周网页游戏数据报告(7.14-7.20)

    一.运营平台开服排行 点评:纵观本周网页游戏排行榜,众平台排名变化不大.本周一线平台共开服3996组,入驻新游戏43款,其中12款游戏目前仍处于测试阶段:9377<群雄争霸>,此款三国题材 ...

  7. yaml 数组_接口测试:A01_HttpRunner基础_05_YAML格式测试用例

    YAML到底是什么? YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)-- 设计时的本意 YAML 是 "Yet ...

  8. 如何实现JAVA游戏存档_保存游戏数据 – Java

    Should I be learning XML in tandem with Java? 除非您想学习XML或认为XML是您的应用程序的一个很好的选择,否则没有理由.有许多方法可以在没有XML的情况 ...

  9. 自动化yaml文件_从YAML到TypeScript:开发人员对云自动化的看法

    自动化yaml文件 The rise of managed cloud services, cloud-native, and serverless applications brings both ...

最新文章

  1. 初学Flink,对Watermarks的一些理解和感悟(透彻2)
  2. 一条进程的栈区、堆区、数据区和代码区在内存中的映射
  3. 字符串矩阵转换成长字符串_字符串矩阵
  4. 《Effective C#中文版:改善C#程序的50种方法》简介
  5. ubuntu下JDK的自动安装和手动安装
  6. php访问多重数组,PHP实现删除多重数组对象属性并重新赋值的方法
  7. 2 万字全面测评深度学习框架 PaddlePaddle、TensorFlow 和 Keras | 程序员硬核评测
  8. 服务器tomcat优化知识复习总结
  9. Java【第六篇】面向对象基础
  10. 【JavaAndroid开源库代码剖析】のandroid-smart-image-view
  11. Windows超级管理器简介
  12. 计算几何(一) by 邓俊辉老师
  13. PHP 之建行龙支付 - 被扫查单(商家扫码客户二维码),查询订单是否付款成功
  14. 诡异事件之--数据库存3.12E8 但是自动变成了31.00
  15. minio-operator部署minio服务,并用Java客户端访问minio
  16. 遇见未来 | PostgreSQL:一匹即将发力的黑马
  17. P1688 餐厅点餐
  18. jodatime java8交互_Joda-time学习笔记
  19. skinsdog 狗网支持马上直接取回CSGO饰品皮肤开箱网站
  20. swoole php 使用教程,Swoole 扩展安装与使用入门

热门文章

  1. Verlet integration (Verlet 积分法)
  2. 复杂的权限按钮控制优化
  3. 洛谷P3803 【模板】多项式乘法(FFT)
  4. 二叉树的深度和广度优先搜索算法
  5. 技术沟通者的自我修养
  6. 瑞驰vCloud超融合让数据中心业务更稳定
  7. Citrix XenApp6.5的安装
  8. python 自动复制分类_leetcode python 常见分类问题模板(复制粘贴就能用) 更新中......
  9. mybatis批量更新及其效率问题
  10. 教育启蒙赛道、亿级异构数据不停服平滑迁移方案和实践