本文转自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 保存游戏数据 !相关推荐

  1. yaml 数组_使用 YAML 保存游戏数据 !

    本文转自Unity Connect博主 超级汽水 为什么是 YAML ? 首先我们来看看什么是YAML : 官网上作者对自己的定义 YAML 不是标记语言. YAML 是针对所有编程语言的人性化数据序 ...

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

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

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

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

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

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

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

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

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

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

  7. 非常好用的游戏数据保存类:ScriptableObject

    基础知识: 1.将数据储存资源文件中,像普通资源一样管理,退出也会保存修改 2.继承自UnityEngine.Object,不必附着在对象上也无需/不能赋给Gameobject或Prefab 3.可以 ...

  8. unity保存游戏对象到mysql_非常好用的游戏数据保存类:ScriptableObject

    基础知识: 1.将数据储存资源文件中,像普通资源一样管理,退出也会保存修改 2.继承自UnityEngine.Object,不必附着在对象上也无需/不能赋给Gameobject或Prefab 3.可以 ...

  9. lua学习:使用Lua处理游戏数据

    在之前lua学习:lua作配置文件里,我们学会了用lua作配置文件. 其实lua在游戏开发中可以作为一个强大的保存.载入游戏数据的工具. 1.载入游戏数据 比如说,现在我有一份表单: data.xls ...

最新文章

  1. OSChina 周三乱弹 —— 一起 High High High!
  2. 流程管理软件如何适应变化
  3. UVA12043 Divisors【欧拉筛法】
  4. 5.数据结构 --- 数组和广义表
  5. java下载ftp_Java FTP下载文件
  6. BP神经网络及其app设计
  7. Mendix中Rest服务使用-调取服务器接口
  8. 今天又是一个全新的开始...
  9. Java HotSpot VM参数大全
  10. hdu 6638 Snowy Smile 线段树维护最大子段和
  11. coreldraw2021永久序列号和激活注册教程
  12. Java:class6 继承
  13. 年薪50万开发者相亲失败:程序员,别输在不会说话上
  14. 网页整体放大/缩小的实现
  15. js 毫秒 微秒 转为 时分秒
  16. 网络游戏长连接与短连接的差异
  17. redis的lru原理_Redis的LRU算法
  18. Java程序员烂大街了?
  19. 鸿蒙HarmonyOS关于NFC碰一碰拉起FA
  20. 苹果cmsv10蓝色简洁影视电影资源采集网站模板

热门文章

  1. 职场“女神”,绝不会有的12个习惯
  2. linux怎么看系统内存多大内存频率,linux 系统管理中的查看内存插槽数最大容量和频率...
  3. 微信小程序 扫码 加载图片
  4. MySQL将多条数据合并成一条
  5. 为改善Siri功能Apple收购语音助理初创公司
  6. C语言sopc蜂鸣器按键弹奏中音,SOPC乐曲演奏大作业.doc
  7. Uniapp Video MP4视频播放失败,只有声音,黑屏,视频播放不了,解决办法
  8. Java知识点全面汇总
  9. 自媒体运营之【流量的价值】
  10. BWAPP靶场-HTML injection-Reflected(GET)