💻

UnityFigmaBridgeの設定を別のCustomEditorから読み込んで使いやすくしてみました

2023/06/01に公開

はじめに

UnityFigmaBridgeを使ってFigmaからUnityの画面を作っています。

使用にあたって、

  1. アクセストークンはツールバー
  2. FigmaページのURLはInspector
  3. 画面取り込みはツールバーのSync Documentから

とあっちこっちに散らばっていて不便だったので何とかできないかと考えました。

toolbar

対応

別のScriptableObjectを作って、そのEditorを作成。
そこからUnityFigmaBridgeのCustomEditorを参照する形にしてInspector内で完結できるようにしました。

ScriptableObject

新しく作成するScriptableObjectで、アクセストークンをSerializeするようにしています。
メニューの「New Figma Bridge Settings」でCustomUnityFigmaBridgeSettingsというファイルが作成されるようにしています。

[CreateAssetMenu(fileName = "CustomUnityFigmaBridgeSettings", menuName = "New Figma Bridge Settings")]
public sealed class CustomUnityFigmaBridgeSettings : ScriptableObject
{
    [SerializeField] string _accessToken;
    public string AccessToken {
        get => _accessToken;
        set => _accessToken = value;
    }
}

menu

ScriptableObjectのEditor

作成したCustomUnityFigmaBridgeSettingsのEditorです。
OnEnableで設定を書いてしまえばプロジェクトメンバー間で設定が違うみたいなことを防げると思います。

[CustomEditor(typeof(CustomUnityFigmaBridgeSettings))]
public sealed class CustomUnityFigmaBridgeSettingsEditor : Editor
{
    UnityFigmaBridgeSettingsEditor _unityFigmaBridgeSettingsEditor;

    void OnEnable()
    {
        var unityBridgeSettingsAsset = UnityFigmaBridgeSettingsProvider.FindUnityBridgeSettingsAsset();
        unityBridgeSettingsAsset.BuildPrototypeFlow = false;
        unityBridgeSettingsAsset.RunTimeAssetsScenePath = "Assets/Base.unity";
        unityBridgeSettingsAsset.ScreenBindingNamespace = string.Empty;
        unityBridgeSettingsAsset.ServerRenderImageScale = 3;
        unityBridgeSettingsAsset.EnableGoogleFontsDownloads = true;
        unityBridgeSettingsAsset.CreateScreenNameCSharpFile = false;
        unityBridgeSettingsAsset.GenerateNodesMarkedForExport = true;
        unityBridgeSettingsAsset.OnlyImportSelectedPages = true;
        _unityFigmaBridgeSettingsEditor = CreateEditor(unityBridgeSettingsAsset, typeof(UnityFigmaBridgeSettingsEditor)) as UnityFigmaBridgeSettingsEditor;
    }

    static string FigmaAccessTokenKey()
    {
        var unityFigmaBridgeImporterType = typeof(UnityFigmaBridgeImporter);
        var field = unityFigmaBridgeImporterType.GetField("FIGMA_PERSONAL_ACCESS_TOKEN_PREF_KEY", BindingFlags.NonPublic | BindingFlags.Static);
        if (field != null) return field.GetValue(null) as string;
        return "";
    }

    static CustomUnityFigmaBridgeSettings FindUnityBridgeSettingsAsset()
    {
        var assets = AssetDatabase.FindAssets($"t:{nameof(CustomUnityFigmaBridgeSettings)}");
        return AssetDatabase.LoadAssetAtPath<CustomUnityFigmaBridgeSettings>(AssetDatabase.GUIDToAssetPath(assets[0]));
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        _unityFigmaBridgeSettingsEditor.OnInspectorGUI();

        GUILayout.Space(15);
        if (GUILayout.Button("Sync"))
        {
            var savedAccessToken = PlayerPrefs.GetString(FigmaAccessTokenKey());

            var customUnityFigmaBridgeSettings = FindUnityBridgeSettingsAsset();
            if (customUnityFigmaBridgeSettings.AccessToken != savedAccessToken)
            {
                PlayerPrefs.SetString(FigmaAccessTokenKey(), customUnityFigmaBridgeSettings.AccessToken);
                PlayerPrefs.Save();
            }

            typeof(UnityFigmaBridgeImporter).GetMethod("Sync", BindingFlags.Static | BindingFlags.NonPublic)
                ?.Invoke(null, null);
        }
    }
}

Inspector

本来のUnityFigmaBridgeのメニューを押して、Syncボタンがないんですけど?と言われないように、CustomUnityFigmaBridgeSettingsEditorでメニューを押せなくするメソッドと、CustomUnityFigmaBridgeSettingsのInspectorが表示されるメソッドを書いておきます。

[MenuItem("Figma Bridge/Sync Document", true)]
static bool SyncDocumentOff()
{
    return false;
}

[MenuItem("Figma Bridge/Select Settings File", true)]
static bool SelectSettingsFileOff()
{
    return false;
}

[MenuItem("Figma Bridge/Set Personal Access Token", true)]
static bool SetPersonalAccessToken()
{
    return false;
}

[MenuItem("Figma Bridge/Settings File")]
static void SelectSettings()
{
    var bridgeSettings = FindUnityBridgeSettingsAsset();
    bridgeSettings.AccessToken = PlayerPrefs.GetString(FigmaAccessTokenKey());
    Selection.activeObject = bridgeSettings;
}

hidemenu

さいごに

何度も実行することになるSync Documentなので少しでも煩わしいところが解消できているのではないかと思います。

Happy Elements

Discussion