【Unity】【エディタ拡張】ラベルの取得が無駄に重いのでmetaを直接読む

Unityのラベルの取得が無駄に重いのでエディタ拡張でmetaを直接読む方法です。

Unity2018.4.10

やりたいこと

Unityにはラベルという機能があります。

light11.hatenadiary.com

このラベルはスクリプトからも操作できるのですが、そのためのAPIにアセットを渡す必要があります。
つまりラベルというメタデータを操作するだけなのにアセットをロードしないといけません。

docs.unity3d.com

大量のラベルを一括で操作する際に、すべてのアセットをロードするのはさすがに重すぎます。
そのため今回は直接metaファイルを読んでラベルを取得するスクリプトを書きました。

なおmetaを直接編集することによりラベルを書き込むことも理論上はできますが、
Unityのmetaの仕様にしっかり合わせる必要があるため今回は行っていません。

ソースコード

それではソースコードです。

using System.Collections.Generic;
using System.IO;
using System;

public static class Example
{
    public static string[] GetLabels(string metaFilePath)
    {
        var lines = File.ReadAllLines(metaFilePath);
        var labels = new List<string>();
        var wasFound = false;
        foreach (var line in lines) {
            if (line == "labels:") {
                wasFound = true;
                continue;
            }
            if (wasFound) {
                if (line.StartsWith("- ")) {
                    labels.Add(line.Replace("- ", ""));
                }
                else {
                    break;
                }
            }
        }
        return labels.ToArray();
    }
}

FileIOを行っているため大量に処理したい場合にはUniRxとかで非同期にするとよりよいかもしれません。

public static IObservable<string[]> GetLabelsAsync(string metaFilePath) => Observable.Start(() => GetLabels(metaFilePath)).ObserveOnMainThread();

関連

light11.hatenadiary.com

参考

docs.unity3d.com