💭

UnityでYAML を読み込む

2021/12/17に公開

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