質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

Edit-Selectionで設定し、Unityを閉じたあと再度プロジェクトを起動した後でも設定が残る方法がわからない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 278

score 28

バージョン:Unity 2019.2.11f1 (64-bit)

以下に記載の機能

UnityのEditor操作で使うと便利な事

特定のゲームオブジェクトの選択状態を記録しておく機能で
オブジェクトを選択した状態で
Unityメニュー→Edit→SelectionのSave Selection 番号で、
ショートカットキーではCtrl+Alt+番号、で登録が出来て
そのあと、Ctrl+Shift+番号のショートカットキーを押す

この機能ですが、

Unityを閉じた後、再度、そのプロジェクトを開くと 設定が無くなってしまいます。

プロジェクトを再度起動した後でもこの設定を残す方法はありますでしょうか?

毎回、再設定するのが、かなり、めんどくさいため、
ぜひとも、よろしくお願いいたします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

この機能は使ったことがありませんが、確かに一度閉じるとクリアされるようです。
スプリクトでエディタ拡張などを行い、代替機能を用意する方法があります。
即席ですが、一例として以下のスクリプトをEditorフォルダに配置すれば、仰せられた機能が実現できないでしょうか。
上記の意味が理解できない場合は分かる方に依頼した方が良いでしょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Reflection;

/// <summary>
/// 選択状態の読み書きを行う(EditorPrefs拡張)
/// </summary>
public class SelectionSaver : Editor
{
    // とりあえず3つだけ
    // 既存のショートカットと競合するので手動で削除するか別のキーにすること
    [MenuItem("Edit/SelectionSaver/Load Selection 1 %#1")] static void Load1() { SelectionSaverInstance.Instance.Load(0); }
    [MenuItem("Edit/SelectionSaver/Load Selection 2 %#2")] static void Load2() { SelectionSaverInstance.Instance.Load(1); }
    [MenuItem("Edit/SelectionSaver/Load Selection 3 %#3")] static void Load3() { SelectionSaverInstance.Instance.Load(2); }

    [MenuItem("Edit/SelectionSaver/Save Selection 1 %&1")] static void Save1() { SelectionSaverInstance.Instance.Save(0); }
    [MenuItem("Edit/SelectionSaver/Save Selection 2 %&2")] static void Save2() { SelectionSaverInstance.Instance.Save(1); }
    [MenuItem("Edit/SelectionSaver/Save Selection 3 %&3")] static void Save3() { SelectionSaverInstance.Instance.Save(2); }
}

/// <summary>
/// 機能本体
/// </summary>
public class SelectionSaverInstance
{
    static SelectionSaverInstance instance;

    long[] ids = new long[3];
    PropertyInfo inspectorModeInfo;

    public static SelectionSaverInstance Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new SelectionSaverInstance();
            }

            return instance;
        }
    }

    /// <summary>
    /// 初期化とEditorPrefsからの読み込みを行う
    /// </summary>
    public SelectionSaverInstance()
    {
        inspectorModeInfo = typeof(SerializedObject).GetProperty("inspectorMode", BindingFlags.NonPublic | BindingFlags.Instance);

        for (int i = 0; i < ids.Length; i++)
        {
            ids[i] = long.Parse(EditorPrefs.GetString("Selection" + i, "0"));
        }
    }

    /// <summary>
    /// id変換
    /// </summary>
    /// <param name="_object"></param>
    /// <returns></returns>
    public long GetObjectLocalIdInFile(Object _object)
    {
        long idInFile = 0;
        SerializedObject serialize = new SerializedObject(_object);
        inspectorModeInfo.SetValue(serialize, InspectorMode.Debug, null);
        SerializedProperty localIdProp = serialize.FindProperty("m_LocalIdentfierInFile");
        idInFile = localIdProp.longValue;
        return idInFile;
    }

    /// <summary>
    /// リストとEditorPrefsに保存する
    /// </summary>
    /// <param name="key"></param>
    public void Save(int key)
    {
        if (Selection.activeObject != null)
        {
            ids[key] = GetObjectLocalIdInFile(Selection.activeObject);
            EditorPrefs.SetString("Selection" + key, ids[key].ToString());
        }
    }

    /// <summary>
    /// リストから呼び出す
    /// </summary>
    /// <param name="key"></param>
    public void Load(int key)
    {
        long id = ids[key];
        foreach (GameObject obj in Object.FindObjectsOfType(typeof(GameObject)))
        {
            if (GetObjectLocalIdInFile(obj) == id)
            {
                Selection.activeObject = obj;
                break;
            }
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/11 13:00

    エディタ拡張を作っていただけるとは、素晴らしいです。
    コマンドが重複しているためか、選択画面が1度出るものの、
    動きました。ありがとうございました。使わせていただきます。

    実は、この質問、回答がなかったためエディタ拡張を勉強していたところでしたが
    わからず、断念しておりました。本当にありがとうございました。

    この機能、Unityで設定を保存してほしいのですが、今のバージョンでは
    なぜか設定が残らないので本当もったいない機能だなと思いました。

    キャンセル

  • 2020/02/11 13:39

    お役に立てて何よりです。
    今回は質問どおりに回答した次第ですが、慣れていくうちに「ドラッグ&ドロップでもっと簡単に登録したい」「今何が登録されているか知りたい」などの欲求が生まれるかと思いますので、続きをご自身で実装してみるのも良いかと思います。
    このあたりの好みは人それぞれですので、Unityからすると「拡張できるので好きにしてください」ということになります。

    余談ですが、EditorPrefsで読み書きするキーを"Selection {番号}"としていますが、このままだとすべてのプロジェクト共通になってしまうので、プロジェクト固有の文字列を加えた方が良いかもしれません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Unityに関する質問
  • Edit-Selectionで設定し、Unityを閉じたあと再度プロジェクトを起動した後でも設定が残る方法がわからない