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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用 YAML 保存游戏数据 !

發布時間:2023/12/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 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 中這一段的樣子:

    🤠 上述內容希望對大家有幫助,同時歡迎糾錯 ~
    參考
    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

    更多干貨資源學習,戳上方鏈接下載Unity官方app,在線技術互動答疑,結識更多Unity小伙伴,交友學習兩不誤!

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。