使用 YAML 保存游戏数据 !
本文转自Unity Connect博主 超级汽水
为什么是 YAML ? 首先我们来看看什么是YAML :
YAML 不是标记语言。
YAML 是针对所有编程语言的人性化数据序列化标准。
像 XML 一样,它使用可移植的、独立于平台的格式来表示任何种类的的数据,但是它是人性的化格式这意味着它更方便我们阅读。
同时 YAML 也是 Unity 编辑器使用的序列化格式。
它看起来像是这样 :
YAML 的基本语法
大小写敏感。
使用缩进来表示层级关系。
缩进不允许使用 Tab
使用 # 来表示单行注释,不支持多行注释。
文件开头要使用 — 来表示文档开始,使用 … 来表示。文档结束,一个文件中可以存在多个文档。
文件的拓展名一般为 .yaml 比如 Player.yaml
YAML 支持的数据结构
翻译并不完全准确,每个人译法不同请以英文为主。
散列表 ( mappings )
数组 ( sequences )
纯量 ( 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 保存游戏数据 !相关推荐
- yaml 数组_使用 YAML 保存游戏数据 !
本文转自Unity Connect博主 超级汽水 为什么是 YAML ? 首先我们来看看什么是YAML : 官网上作者对自己的定义 YAML 不是标记语言. YAML 是针对所有编程语言的人性化数据序 ...
- unity保存游戏数据_在Unity中保存和加载玩家游戏数据
unity保存游戏数据 In this tutorial, we'll learn to implement Save/Load game functionality in our game. We ...
- XNA游戏开发之(六)——保存游戏数据
[原创]Alex 游戏过程中,通常需要存储游戏状态.在下次启动游戏时,重新载入游戏,继续游戏. 实现过程非常简单,首先建立一个结构体定义需要保存的游戏参数,然后通过XmlSerializer类将其保存 ...
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式
上一篇跟各位童鞋介绍了SharedPreference 和 File流如何存储数据,并且推荐使用FileOutputStream/FileInputStream来存储咱们游戏数据,那么这一篇则是像大家 ...
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/327.html 很多童鞋说 ...
- 如何实现JAVA游戏存档_保存游戏数据 – Java
Should I be learning XML in tandem with Java? 除非您想学习XML或认为XML是您的应用程序的一个很好的选择,否则没有理由.有许多方法可以在没有XML的情况 ...
- 非常好用的游戏数据保存类:ScriptableObject
基础知识: 1.将数据储存资源文件中,像普通资源一样管理,退出也会保存修改 2.继承自UnityEngine.Object,不必附着在对象上也无需/不能赋给Gameobject或Prefab 3.可以 ...
- unity保存游戏对象到mysql_非常好用的游戏数据保存类:ScriptableObject
基础知识: 1.将数据储存资源文件中,像普通资源一样管理,退出也会保存修改 2.继承自UnityEngine.Object,不必附着在对象上也无需/不能赋给Gameobject或Prefab 3.可以 ...
- lua学习:使用Lua处理游戏数据
在之前lua学习:lua作配置文件里,我们学会了用lua作配置文件. 其实lua在游戏开发中可以作为一个强大的保存.载入游戏数据的工具. 1.载入游戏数据 比如说,现在我有一份表单: data.xls ...
最新文章
- OSChina 周三乱弹 —— 一起 High High High!
- 流程管理软件如何适应变化
- UVA12043 Divisors【欧拉筛法】
- 5.数据结构 --- 数组和广义表
- java下载ftp_Java FTP下载文件
- BP神经网络及其app设计
- Mendix中Rest服务使用-调取服务器接口
- 今天又是一个全新的开始...
- Java HotSpot VM参数大全
- hdu 6638 Snowy Smile 线段树维护最大子段和
- coreldraw2021永久序列号和激活注册教程
- Java:class6 继承
- 年薪50万开发者相亲失败:程序员,别输在不会说话上
- 网页整体放大/缩小的实现
- js 毫秒 微秒 转为 时分秒
- 网络游戏长连接与短连接的差异
- redis的lru原理_Redis的LRU算法
- Java程序员烂大街了?
- 鸿蒙HarmonyOS关于NFC碰一碰拉起FA
- 苹果cmsv10蓝色简洁影视电影资源采集网站模板
热门文章
- 职场“女神”,绝不会有的12个习惯
- linux怎么看系统内存多大内存频率,linux 系统管理中的查看内存插槽数最大容量和频率...
- 微信小程序 扫码 加载图片
- MySQL将多条数据合并成一条
- 为改善Siri功能Apple收购语音助理初创公司
- C语言sopc蜂鸣器按键弹奏中音,SOPC乐曲演奏大作业.doc
- Uniapp Video MP4视频播放失败,只有声音,黑屏,视频播放不了,解决办法
- Java知识点全面汇总
- 自媒体运营之【流量的价值】
- BWAPP靶场-HTML injection-Reflected(GET)