困った時の自分用メモ

読んだ本を考察してメモったり、自分でいじった物の感想をメモったりする場。週1更新を目指します。

Unityの話~エディター拡張を頑張る話5:CSファイルとSceneファイルのオープンと、履歴の保存と一覧表示とそこから起動(盛りだくさん)2~

前回の続き。ここでは、履歴情報を用いて実際にウィンドウを作成する。

VimModeInfoWindow.cs
private static List<string> SceneList = new List<string>();
private static VimModeInfoWindow scene = null;
// シーン一覧ウィンドウを表示する
[UnityEditor.MenuItem("ShortCutCommand/VimSceneView &o")]
public static void VimSceneView() {
    UnityEngine.Debug.Log("VimSceneView");
    if (PlayerPrefs.HasKey("vim_unite") == false) {
        PlayerPrefs.SetString("vim_unite", "");
    }

    if (scene == null) {
        scene = EditorWindow.GetWindow<VimModeInfoWindow>();
        scene.Show();
    } else {
        scene.Close();
        scene = null;
    }
}

Vector2 scrollPos = Vector2.zero;
void OnGUI() {
    List<string> list = GetSaveFileHistory();
    if (list.Count > 0) {
        int height = list.Count * 30;
        scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
        for (int i = 0; i < list.Count; i++) {
            using (new EditorGUILayout.HorizontalScope ()) {
                //ボタンを表示
                if (list[i].Contains(".cs")) {
                    if (GUILayout.Button(list[i])) {
                        string path = list[i].Replace("/", "\\");
                        System.Diagnostics.Process.Start("MonoDevelop.exe", path);
                        AddSaveFileHistory(list[i]);
                    }
                    if (GUILayout.Button(list[i])) {
                        string path = list[i].Replace("/", "\\");
                        // 右側にボタンを追加し、VIMで開ける用のボタンを作る
                        System.Diagnostics.Process.Start("C:\\yamashita\\github\\GVIM\\vim73\\win32\\gvim.exe", "--remote-tab-silent " + path);
                        AddSaveFileHistory(list[i]);
                    }
                } else if (list[i].Contains(".unity")) {
                    if (GUILayout.Button(list[i])) {
                        EditorSceneManager.SaveOpenScenes();                            EditorSceneManager.OpenScene(list[i], OpenSceneMode.Single);
                        AddSaveFileHistory(list[i]);
                    }
                }
            }
        }
    }
    EditorGUILayout.EndScrollView();
}


public static List<string> GetSaveFileHistory() {
    string saveString = PlayerPrefs.GetString("vim_unite");
    string[] split = saveString.Split("\n"[0]);

    return new List<string>(split);
}

public static void AddSaveFileHistory(string path) {
    List<string> list = VimModeInfoWindow.GetSaveFileHistory();
    if (list.Contains(path)) {
        list.Remove(path);
        list.Insert(0, path);
    } else {
        if (list.Count >= 30) {
            list.RemoveAt(list.Count);
        }
        list.Insert(0, path);
    }

    string saveString = "";
    for (int i = 0; i < list.Count; i++) {
        if (i != 0) {
            saveString += "\n";
        }
        saveString += list[i];
    }
    PlayerPrefs.SetString("vim_unite", saveString);
}

簡単に言うと、ウィンドウが開いて、履歴に登録されている情報がボタンのリストで表示される。
CSファイルだと、左側のボタンがMONOで開き、右側のボタンがVIMで開く。シーンファイルだった場合は、ボタンは一個でそのシーンを開く。当然、開いた物が履歴の最新に登録される。

以下、細かい説明。

・public class VimModeInfoWindow : EditorWindow {
・scene = EditorWindow.GetWindow();
・scene.Show();/scene.Close();

一番上のは記載していないが、ウィンドウを作る場合は、EditorWindowを継承したクラスにしないといけないらしい。で、それをEditorWindow.GetWindow<クラス名>()ってやると開くようだ。この辺は、リファレンスを参照されたし。
あとは、Showで開きCloseで閉じる。それだけ。

・scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
・EditorGUILayout.EndScrollView();
ウィンドウの表示要素がウィンドウサイズより大きくなった際にスクロールをさせたいなら、この記述を行う。scrollPosは外部に無いと、スクロール位置を保存できないので、スクロールしてくれなくなる。

・using (new EditorGUILayout.HorizontalScope ()) {
横にコントロールを並べたい時に使うようだ。今回だと、ボタンが2つ出る可能性があったので、その為に使用した。

・if (GUILayout.Button(list[i])) {
ボタンを表示するのに使う。引数がボタンの文字になり、ifの後が、ボタンが押された際の処理になる。

とりあえず、簡単かつ粗雑にだが作ってみたので、早速仕事で使用してみて、使用感がある程度わかったらまた報告する。