日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用 YAML 保存游戏数据 !

發(fā)布時(shí)間:2023/12/14 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 YAML 保存游戏数据 ! 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文轉(zhuǎn)自Unity Connect博主 超級(jí)汽水

為什么是 YAML ? 首先我們來(lái)看看什么是YAML :

  • YAML 不是標(biāo)記語(yǔ)言。

  • YAML 是針對(duì)所有編程語(yǔ)言的人性化數(shù)據(jù)序列化標(biāo)準(zhǔn)。

  • 像 XML 一樣,它使用可移植的、獨(dú)立于平臺(tái)的格式來(lái)表示任何種類的的數(shù)據(jù),但是它是人性的化格式這意味著它更方便我們閱讀。

  • 同時(shí) YAML 也是 Unity 編輯器使用的序列化格式。

它看起來(lái)像是這樣 :

YAML 的基本語(yǔ)法

  • 大小寫敏感。

  • 使用縮進(jìn)來(lái)表示層級(jí)關(guān)系。

  • 縮進(jìn)不允許使用 Tab

  • 使用 # 來(lái)表示單行注釋,不支持多行注釋。

  • 文件開(kāi)頭要使用 — 來(lái)表示文檔開(kāi)始,使用 … 來(lái)表示。文檔結(jié)束,一個(gè)文件中可以存在多個(gè)文檔。

  • 文件的拓展名一般為 .yaml 比如 Player.yaml

YAML 支持的數(shù)據(jù)結(jié)構(gòu)

翻譯并不完全準(zhǔn)確,每個(gè)人譯法不同請(qǐng)以英文為主。

  • 散列表 ( mappings )

  • 數(shù)組 ( sequences )

  • 純量 ( scalars )

  • 現(xiàn)在我們來(lái)學(xué)習(xí)一下三大數(shù)據(jù)結(jié)構(gòu),這一部分內(nèi)容請(qǐng)結(jié)合下方的特殊符號(hào)講解一起看。 1 .散列表 : 文本模式:

    --- # 使用冒號(hào)來(lái)代表,格式為 key: value 冒號(hào)后面要加一個(gè)空格 key: value# 使用縮進(jìn)來(lái)表示層級(jí)關(guān)系 key:key1: value1key2: value2# flow 風(fēng)格寫法 key: {key1: value1, key2: value2}# 無(wú)序鍵值對(duì) map:Block style: !!mapkey1 : value1key2 : value2# Flow styleFlow style: !!map { key1: value1, key2: value2 }# 結(jié)果# map: # { 'Block style': { key1: 'value1', key2: 'value2' },# 'Flow style': { key1: 'value1', key2: 'value2' } }# 有序鍵值對(duì) (字典)omap:Block style: !!omap- one: 1- two: 2- three: 3# Flow styleFlow style: !!omap [ one: 1, two: 2, three : 3 ] # 結(jié)果 # omap: # { 'Block style': [ { one: 1 }, { two: 2 }, { three: 3 } ], # 'Flow style': [ { one: 1 }, { two: 2 }, { three: 3 } ] } ...

    圖片模式 :

    2 .數(shù)組 文本模式:

    --- # 普通定義 食物 :- 胡蘿卜- 西紅柿- 蘋果# 結(jié)果 : { '食物': [ '胡蘿卜', '西紅柿', '蘋果' ] }# 嵌套鍵值對(duì) 食物 : - 蔬菜: 胡蘿卜- 蔬菜: 西紅柿- 水果: 蘋果 # 結(jié)果: # { '食物': [ { '蔬菜': '胡蘿卜' }, { '蔬菜': '西紅柿' }, { '水果': '蘋果' } ] }# pairs 類型 食物 : !!pairs- 蔬菜: 胡蘿卜- 蔬菜: 西紅柿- 水果: 蘋果 # 結(jié)果 : { '食物': [ [ '蔬菜', '胡蘿卜' ], [ '蔬菜', '西紅柿' ], [ '水果', '蘋果' ] ] } ...

    圖片模式:

    3 .純量 ( 不保證每個(gè)解析器都能正常使用所有類型,請(qǐng)自行實(shí)際判斷 ) 1 .Integers 整型

    --- # Integers 整型 canonical: 12345 # 普通 int decimal: +0.12345 # 小數(shù) octal: 014 # 8 進(jìn)制 hexadecimal: 0xC # 16 進(jìn)制# 結(jié)果均為 10 進(jìn)制 : # { canonical: 12345, # decimal: 12345, # octal: 12, # hexadecimal: 12 } # 注:請(qǐng)注意最終結(jié)果與冒號(hào)前的名字并無(wú)關(guān)系,與冒號(hào)后的寫法有關(guān),不要混淆 ...

    2 .Floating Point 浮點(diǎn)數(shù)

    --- # Floating Point 浮點(diǎn)數(shù) canonical: 1.23015e+3 # 普通 float exponential: 12.3015e+02 # 科學(xué)計(jì)數(shù)法 fixed: 1230.15 # 固定值 negative infinity: -.inf # 負(fù)無(wú)窮大 not a number: .NaN # 不是數(shù)字 ...

    3 .Timestamps 時(shí)間

    --- 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# 結(jié)果 # { canonical: Sat Dec 15 2001 10:59:43 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間), # iso8601: Sat Dec 15 2001 10:59:43 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間), # spaced: Sat Dec 15 2001 10:59:43 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間), # date: Sat Dec 14 2002 08:00:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間) } ...

    4 . 其它常用類型

    --- # 布爾類型 boolean:- true- false # 結(jié)果 :{ bool: [ true, false ] }# 字符串類型 string : '123456' # 結(jié)果 :{ string: '123456' }# 空值 null :- ~- null # 結(jié)果 :{ null: [ null, null ] } ...

    現(xiàn)在我們來(lái)看看 YAML 中的特殊符號(hào): 1 . " — " 和 " … "

    # --- 代表一個(gè)文檔的開(kāi)始 --- # !! 倆個(gè)感嘆號(hào) 用來(lái)做強(qiáng)制類型轉(zhuǎn)換 test : - !!int 123- !!int 123 # 結(jié)果 : { test: [ 123, '123' ] } 可以看到第一個(gè)為整數(shù)類型,第二個(gè)為字符串類型。... # ... 代表一個(gè)文檔的結(jié)束

    2 . “ > ” 和 " | "

    --- # 在字符串中 “>” 大于號(hào)表示換行,“|” 豎線同樣表示換行但是保留換行符 test1 : >這是一段文字。 test2 : |這是一段文字。 # 結(jié)果 : { test1: '這是一段 文字。\n', test2: '這是一段\n文字。\n' } ...

    3 . " ? " 和 " : "

    --- # 對(duì)于復(fù)雜的對(duì)象格式可以使用 ? 加空格來(lái)代表 key ; 使用 : 加空格來(lái)代表 value ? - complexkey- complexkey2 : - value1- value2# flow 風(fēng)格寫法 [complexkey,complexkey2] : [value1,value2]# 結(jié)果 :{ 'complexkey,complexkey2': [ 'value1', 'value2' ] } ...

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

    --- # 引用重復(fù)的內(nèi)容 “&”:錨點(diǎn)標(biāo)記、“<<”: 合并標(biāo)記、“*”:要合并的錨點(diǎn)值 # 要注意空格的數(shù)量 - test: &001key1 : value1key2 : value2 - test1: <<: *001key2 : value222 # 重寫 key2 - test2:<<: *001key3 : value3 # 添加 key3 # 結(jié)果 : # [ { test: { key1: 'value1', key2: 'value2' } }, # { test1: { key1: 'value1', key2: 'value222' } }, # { test2: { key1: 'value1', key2: 'value2', key3: 'value3' } } ]# 一些簡(jiǎn)單的合并也可以不使用 << 比如 sex:- &00 male- &01 female player1:- sex : *00 player2:- sex : *01 # 結(jié)果: # { sex: [ 'male', 'female' ], # player1: [ { sex: 'male' } ], # player2: [ { sex: 'female' } ] } ...

    在 Unity 中使用 YAML !
    YAML 在很多語(yǔ)言中都可以方便的使用,unity 中也不例外。
    1 .在資源商店中查找 YamlDotNet for Unity 這是一個(gè)免費(fèi)的插件,將它導(dǎo)入到你的項(xiàng)目中。
    2 .導(dǎo)入后你的項(xiàng)目中應(yīng)該是這樣的,在 Plugin 文件夾下 多出一個(gè)名為 YamlDotNet 的文件夾。

    3 .創(chuàng)建一個(gè)腳本來(lái)測(cè)試下我們的功能,創(chuàng)建一個(gè)玩家類來(lái)保存信息。

    // 創(chuàng)建一個(gè)玩家類用來(lái)保存玩家信息 internal class PlayerData {public string PlayerName { get; set; }public string PlayerSex { get; set; }public List<int> PlayerBackPack { get; set; } }

    4 .簡(jiǎn)單的存儲(chǔ)讀取。

    using UnityEngine; using System.Collections.Generic; using YamlDotNet.Serialization;public class YamlTest : MonoBehaviour {private void Start(){//創(chuàng)建對(duì)象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("玩家物品總數(shù) : " + data1.PlayerBackPack.Count);Debug.Log("背包中第一個(gè)物品id : " + data1.PlayerBackPack[0]);} }

    5 .運(yùn)行看看最終效果吧 ~ 😎。

    大功告成 !,我們?cè)賮?lái)看看 YAML 中這一段的樣子:

    🤠 上述內(nèi)容希望對(duì)大家有幫助,同時(shí)歡迎糾錯(cuò) ~
    參考
    https://yaml.org/spec/1.2/spec.html
    https://www.jianshu.com/p/97222440cd08 http://www.ruanyifeng.com/blog/2016/07/yaml.html
    代碼部分產(chǎn)考了 宣雨松 大佬的代碼,感謝大佬的幫助 !

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

    更多干貨資源學(xué)習(xí),戳上方鏈接下載Unity官方app,在線技術(shù)互動(dòng)答疑,結(jié)識(shí)更多Unity小伙伴,交友學(xué)習(xí)兩不誤!

    總結(jié)

    以上是生活随笔為你收集整理的使用 YAML 保存游戏数据 !的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。