💭
UnityでYAML を読み込む
Json系はよく使うんだけど、YAML使ったことないなって思ったので調べた!
UnityYAML
公式のYAML libraryでJsonUtility同様すべてのYAML仕様をみたすものではないとのこと
下記をサポート
- マップ, スカラー値, シーケンス
APIは一般ユーザに解放されておらず、あくまで内部的に利用されているものっぽい
YamlDotNet
nugetで利用できるC#のライブラリ
Downloadリンクから落として、
yamldotnet.11.2.1.nupkg
=> yamldotnet.11.2.1.zip
にリネームして解凍.
lib/net35/YamlDotNet.dllをはimportしてみた
Library/PackageCache/com.unity.services.core@1.0.1/Editor/Core/Networking/ReadOnlyHttpRequest.cs(30,16):
error CS0433: The type 'IReadOnlyDictionary<TKey, TValue>' exists in both
'YamlDotNet, Version=11.0.0.0, Culture=neutral, PublicKeyToken=ec19458f3c15af5e' and 'mscorlib,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
なんかクラス定義が内部的に競合してダメっぽい.
と思ったら、 lib/net45/YamlDotNet.dll
はいけた!
ApiCompatibilityLevelが.net 4.x
か .net standard 2.0
をunityでは選択できるっぽい.
手元環境では.NET Standard 2.0
になってて、lib/net45が利用できる状態だった.
(あんまり.NETのAPI Levelの違いがわかってない)
Usage
先ほどのnet45/YamlDotNet.dllを適当にAssets/以下に配置.
サンプルをつくってみた
public void ParseTest()
{
// setup
var text = @"
numbers:
- 1
- 2
- 3
HP: 100
MP: 10
SP: 32
";
var yamlPath = "/tmp/sample.yml";
File.WriteAllText(yamlPath, text);
// read
var reader = new StreamReader(yamlPath, Encoding.UTF8);
var yaml = new YamlStream();
yaml.Load(reader);
var numbersNode = yaml.Documents[0].RootNode["numbers"];
Debug.Log(numbersNode); // Output: [ 1, 2, 3 ]
var hpNode = yaml.Documents[0].RootNode["HP"];
Debug.Log(hpNode); // Output: 100
var mpNode = yaml.Documents[0].RootNode["MP"];
Debug.Log(mpNode); // Output: 10
var spNode = yaml.Documents[0].RootNode["SP"];
Debug.Log(spNode); // Output: 32
}
きちんと動くことを確認.
一見するとFilePath以外からreadする方法がなさそうだった. 単にAPI調査不足なだけもするのでまた本格的に使う時に調べよう.
Discussion