(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

HierarchyやProjectで選択していたObjectを記録し、Inspectorの戻ると進む機能を追加する【Unity】【エディタ拡張】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2018.4.1f1


はじめに

Unityでは選択しているオブジェクトの内容がInspectorに表示されますが、

f:id:kan_kikuchi:20190708044006j:plain


このInspectorで前表示していたやつを表示するショートカット

つまり、戻ると進む機能があったら便利かもな〜と思って実際に作って見ました!


イメージとしては以下のような感じ。

f:id:kan_kikuchi:20190708045734g:plain


なお、作ってから気付いたのですが、

同様の目的(おそらくもっと高機能?)のアセットがあるようです(未確認)。





SelectedObjectRecorder

早速、HierarchyやProjectで選択していたObjectを記録し、Inspectorの戻ると進む機能を追加する

SelectedObjectRecorderのコードです。



使い方は簡単、SelectedObjectRecorderをEditorフォルダに作成したら、

f:id:kan_kikuchi:20190708050101j:plain


option+command+bで戻る、option+command+aで進むが実行出来るようになります。

f:id:kan_kikuchi:20190708050136j:plain
f:id:kan_kikuchi:20190708050327g:plain


また、Tools/Selected Object Recorder/Open Windowでウィンドウが開き、

f:id:kan_kikuchi:20190708050143j:plain


このウィンドウで選択したオブジェクトの履歴を確認する事も可能ですし、

ボタンを押すことでオブジェクトを選択する事も出来ます。

f:id:kan_kikuchi:20190708050930g:plain


なお、選択したオブジェクトの履歴を削除する機能も付いています。

f:id:kan_kikuchi:20190708050210j:plain
f:id:kan_kikuchi:20190708050912j:plain


ちなみにシーンを再生したり、Unityを再起動したり、

プログラムが変更されてコンパイルが走ったりしても履歴は消えません。

f:id:kan_kikuchi:20190708051246g:plain


また、履歴にあるオブジェクトを消しても、履歴が消えるだけでエラーは出ませんし、

f:id:kan_kikuchi:20190708051621g:plain


シーンを切り替えても元のシーンにあったオブジェクトが履歴から消えるだけです。

f:id:kan_kikuchi:20190708051436g:plain



プログラム解説

詳細な解説は省きますが、一応SelectedObjectRecorderの要所についてだけ解説していきます。


まずSelectionクラスを使い、現在選択しているオブジェクトを取得したり、

選択したオブジェクトが変わった時のイベントを取得したりしています。

//選択しているオブジェクトが変わった時のイベントにメソッド登録
Selection.selectionChanged += OnChangedSelection;


また、Objectをそのまま利用すると、シーンを再生した時や

プログラムが変更されてコンパイルが走った時に参照がなくなって履歴が消えてしまうので、

InstanceIDをEditorUserSettingsで保存して使っています。

//選択したオブジェクトのIDを取得
int id = Selection.activeObject.GetInstanceID();
//履歴の数を保存
EditorUserSettings.SetConfigValue (SELECTION_OBJECT_COUNT_SAVE_KEY, _selectedObjectIDs.Count.ToString());

//選択していたオブジェクトのIDを保存
for (int i = 0; i < _selectedObjectIDs.Count; i++) {
  EditorUserSettings.SetConfigValue (SELECTION_OBJECT_SAVE_KEY + i, _selectedObjectIDs[i].ToString());
}


なお、ショートカットの設定はMenuItemを使って行っています。



プログラムを直接書き換えてショートカットを変更する事も、もちろん可能ですが、

Shortcut Managerで変更する事も出来ます。