Unity Yaml文本标量处理
在做脱离unity处理unity的yaml文档的工具(prefab、material等)
unity使用的yaml是YAML的语法子集,主要难点在处理文本标量上,如果用工具修改以后和unity生成的格式不一致,实际应用价值就打折扣了,每次使用工具都会变来变去。
字符串类型
首先把字符串分成4种类型:
- 0 可能是数字,或者是单行的列表、字典,没什么好说的,都在一行内
- 1 不带引号,在yaml文档中出现的
换行符\n+*n(缩进)需要转成实际的单个空格 - 2 带单引号,在yaml文档中出现的
''需要转义成', 空格同上,换行符\n换行符\n+*n(缩进)转成实际的单个换行符 - 3 带双引号,在yaml文档中出现的
\n\r\t\"\uXXXX对应转义,\n+*n(缩进)+\需要转成单个空格
判断字符串类型
一个字符串会自动生成什么类型,直接按照不会影响解析的原则来区分
0. 单行标量原封不动
- 存在非ascii字符或
\t,直接3类型 - 存在
\n,3类型 (单引号如果换行后带空格,缩进对不上了) - 存在
:,2类型 (避免解析成key) - 存在
\n,2类型 (无引号不能解析换行) - 以
:,[,{,,,',开头,2类型 (这些是yaml的结构元素) - 以
:,结尾,2类型 (这些事yaml的结构元素) - 简单判断下是不是数字,不是数字的1类型
字符串写YAML
设最大宽度_STRING_LINE_WIDTH为80,带key的行,计算key的宽度(不算key后面: 的两个字符)
- 单行标量直接写
- 0类型直接写
- 1类型,不是空格的字符直接写;是空格,判断当前行非空格宽度<=_STRING_LINE_WIDTH, 继续写;否则如果是单个空格,写一个换行符,再写换行缩进,在下一行重复;如果是多个空格,不换行继续往后写
- 2类型,
'转成'', 空格逻辑和1类型一致,如果有换行符(n个连续,n>=1),写n个换行符,再写一个换行符,写空格缩进 - 3类型,符号转义,unicode字符转成
\uXXXX。不是空格的字符直接写;是空格,判断当前行非空格宽度<=_STRING_LINE_WIDTH,继续写;否则如果是当个空格,写一个换行符,再写换行缩进;如果是多个空格,写一个换行符,写换行缩进,再写一个\,再写n-1个空格
遇到问题再修改。YAML优势在于数据量小,但解析是真的难搞,unity罪大恶极。
Unity Yaml文本标量处理的更多相关文章
- Unity中文本AssetBundle的解析
Unity在其安装目录下提供了许多实用的小工具,就存放在unity安装目录下的:Editor/Data/Tools, 其中该路径下的WebExtract.ext和binary2text.exe可以用 ...
- unity 读取文本与写入文本
void writeData(string str,string file) { string parth = Application.dataPath; Strea ...
- Unity 读写文本 文件
1. LitJson的使用 https://blog.csdn.net/qq_35669619/article/details/78928966 https://blog.csdn.net/qq_14 ...
- C语言文本处理
一.conf文本 http://blog.163.com/lixiangqiu_9202/blog/static/53575037201431743236762/ http://blog.csdn.n ...
- Y服务-你真的懂 Yaml 吗
目录 一.什么是 Yaml 二.Yaml 的语法 三.操作 Yaml A. 引入框架 B. 代码片段 C. 完整案例 参考文档 在Java 的世界里,配置的事情都交给了 Properties,要追溯起 ...
- #华为云·寻找黑马程序员#微服务-你真的懂 Yaml 吗?
在Java 的世界里,配置的事情都交给了 Properties,要追溯起来这个模块还是从古老的JDK1.0 就开始了的. "天哪,这可是20年前的东西了,我居然还在用 Properties. ...
- python语言使用yaml 管理selenium元素
1.所有元素都在PageElement下的.yaml,如图 login_page.yaml文件: username: dec: 登录页 type: xpath value: //input[@clas ...
- 使用Unity的50个建议
关于这些建议 这些建议并不适用于所有的项目 这些建议是基于我与3-20人的小团队项目经验总结出来的 结构.可重复使用性.明晰度都是有价的——团队规模和项目规模决定了是否值得付这个价. 一些建议也许公然 ...
- opencv3-core之基本操作
这一篇打算将core部分的例子说完,这都是基于<opencv2.4.9tutorial.pdf>中的core部分,其实这些例子后期都很稳定的,也就是说就算是2.3.1和2.4.10 ,这几 ...
- kubernetes之kube-ApiServer代码分析
一.概述: kube-ApiServer相当于是k8集群的一个入口,不论通过kubectl还是使用remote api 直接控制,都要经过apiserver.apiserver说白了就是一个serve ...
随机推荐
- K8S 对象
本页说明了在 Kubernetes API 中是如何表示 Kubernetes 对象的, 以及使用 .yaml 格式的文件表示 Kubernetes 对象. https://kubernetes.io ...
- JVM篇(一) 什么是JVM,它有什么用
一.JVM的组成 1. JVM由那些部分组成,运行流程是什么? 从图中可以看出 JVM 的主要组成部分 ClassLoader(类加载器) Runtime Data Area(运行时数据区,内存分区) ...
- Django错误:ERRORS: ?: (staticfiles.E001) The STATICFILES_DIRS setting is not a tuple or list. HINT: Perhaps you forgot a trailing comma?
报错的原因是因为我们的STATICFILES_DIRS赋值时,形式不对,其应该赋数组对象,具体如下: 找到settings.py文件, 把 STATICFILES_DIRS=(os.path.join ...
- 【算法】编写一个函数,返回两个正数的和,有可能超过ulong长度
编写一个函数,返回两个数字的和.输入数字是字符串,函数必须返回一个字符串. 示例: 添加("123","321"):->"444" 添 ...
- linux离线安装docker与compose
前言 系统版本:centos 7.ubuntu 20.04 docker版本:v19.03.9.官方下载地址 docker-compose版本:v2.2.3.官方下载地址 官方提供免安装的二进制程序包 ...
- JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践
前言 自 2014 年发布以来, JDK 8 一直都是相当热门的 JDK 版本.其原因就是对底层数据结构.JVM 性能以及开发体验做了重大升级,得到了开发人员的认可.但距离 JDK 8 发布已经过去了 ...
- 如何让WPF中的ValidationRule实现参数绑定
背景 应用开发过程中,常常会对用户输入内容进行验证,通常是基于类型.范围.格式或者特定的要求进行验证,以确保输入符合预期.例如邮箱输入框校验输入内容是否符合邮箱格式.在WPF中,数据模型允许将Vali ...
- C#利用Refit实现JWT自动续期
前言 笔者之前开发过一套C/S架构的桌面应用,采用了JWT作为用户的登录认证和授权.遇到的唯一问题就是JWT过期了该怎么办?设想当一个用户正在进行业务操作,突然因为Token过期失效,莫名其妙地跳转到 ...
- mall :rabbit项目源码解析
目录 一.mall开源项目 1.1 来源 1.2 项目转移 1.3 项目克隆 二.RabbitMQ 消息中间件 2.1 rabbit简介 2.2 分布式后端项目的使用流程 2.3 分布式后端项目的使用 ...
- Kafka-基础
1. 简介 Kafka(Apache Kafka) 是一种分布式流数据平台,最初由LinkedIn开发,并于后来捐赠给Apache软件基金会,成为了一个Apache顶级项目.它被设计用于处理大规模.实 ...